package project.persistence.builder.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import project.client.utils.FloatSparseMatrix;
import project.client.utils.SparseMatrix;
import project.core.mbeans.database.ConnectionManagerMysqlImpl;
import sun.security.krb5.internal.LocalSeqNumber;
public class TestSocialNetwork {
private ConnectionManagerMysqlImpl manager = null;
private int size;
private float density, deviation;
private FloatSparseMatrix connectivity;
private Map<Integer,Integer> inDegree, outDegree;
private Map<Integer,Float> localDensity;
private Map<Integer,Float> localDimension;
private Map<Integer,Float> localMessageSize;
public TestSocialNetwork () {
manager = new ConnectionManagerMysqlImpl ();
manager.setConnectionParams("ebas", "gwtebas", "bachelor_project");
connectivity = new FloatSparseMatrix ();
inDegree = new HashMap <Integer, Integer> ();
outDegree = new HashMap <Integer, Integer> ();
localDensity = new HashMap <Integer, Float> ();
localDimension = new HashMap<Integer, Float> ();
localMessageSize = new HashMap<Integer, Float> ();
}
private void calculateNetwork ()
throws Exception {
connectivity.clear();
float coef0 = 1.0f, coef1 = 0.25f, coef2 = 0.25f;
Connection c = manager.getConnection();
String query0 = "select u.userID,v.userID from Message u, Message v where v.id=u.parentID order by 1";
String query2 = "select propertyValue from settings where tableName like ? and tableID = ? and propertyKey like ?";
Statement s0 = c.createStatement();
ResultSet set0 = s0.executeQuery(query0);
PreparedStatement s2 = c.prepareStatement(query2);
s2.setString(1, "Message");
s2.setString(3, "similarities");
while (set0.next()) {
int userID = set0.getInt(1);
int parentID = set0.getInt(2);
if (userID == parentID)
continue;
connectivity.updateElement(userID, parentID, coef0 * 1.0f);
}
set0.close();
s2.close();
s0.close();
}
private void calculateNodeSize ()
throws Exception {
Connection c = manager.getConnection();
Statement s0 = c.createStatement();
ResultSet set0 = s0.executeQuery("select u.id,count(m.id) from User u, Message m where m.userID = u.id group by u.id");
while (set0.next()) {
localDimension.put(set0.getInt(1), new Float (set0.getInt(2)));
}
set0.close();
s0.close();
}
private void calculateNodeMessageSize ()
throws Exception {
Connection c = manager.getConnection();
Statement s0 = c.createStatement();
ResultSet set0 = s0.executeQuery(" select u.id,count(m.id),sum(cast(s.propertyValue as unsigned)) from User u, Message m, settings s where m.userID = u.id and s.tableID = m.id and s.propertyKey like 'num-words' group by u.id");
while (set0.next()) {
localMessageSize.put(set0.getInt(1), new Float (set0.getFloat(3) / set0.getInt(2)));
}
set0.close();
s0.close();
}
public void displayNetworkStatistics ()
throws Exception {
// first calculate network statistics
System.out.println ("Calculating network ...");
this.calculateNetwork();
System.out.println ("done");
System.out.println ("Calculating node size ...");
this.calculateNodeSize();
System.out.println ("done");
System.out.println ("Calculate node message size ...");
this.calculateNodeMessageSize();
System.out.println ("done");
Connection c = manager.getConnection();
Statement s0 = c.createStatement();
ResultSet set0 = s0.executeQuery("select count(*) from User");
if (set0.next()) {
this.size = set0.getInt(1);
}
set0.close();
this.density = (float) connectivity.size() / (this.size * (this.size - 1));
this.deviation = 0.0f;
System.out.println ("Fetching user id list ...");
List<Integer> listUserIds = new LinkedList<Integer> ();
set0 = s0.executeQuery("select id from User");
while (set0.next()) {
listUserIds.add(new Integer (set0.getInt(1)));
}
System.out.println ("done");
System.out.println ("Calculating used degrees ...");
Iterator<Integer> i_1 = listUserIds.iterator();
while (i_1.hasNext()) {
int u = i_1.next();
Iterator<Integer> i_2 = listUserIds.iterator();
while (i_2.hasNext()) {
int v = i_2.next();
if ((u != v) && (connectivity.getElement(u, v) != null)) {
if (outDegree.get(u) == null) {
outDegree.put(u, 1);
} else {
//System.out.println ("Increased out-degree for " + u);
outDegree.put(u, outDegree.get(u) + 1);
}
if (inDegree.get(v) == null) {
inDegree.put(v, 1);
} else {
//System.out.println ("Increased in-degree for " + v);
inDegree.put(v, inDegree.get(v) + 1);
}
}
}
if (outDegree.get(u) != null)
localDensity.put(u, new Float (outDegree.get(u)) / (this.size * (this.size - 1)));
}
System.out.println ("done");
Iterator<Integer> i = localDensity.keySet().iterator();
while (i.hasNext()) {
int user = i.next();
if (localDensity.containsKey(user)) {
float lDens = localDensity.get(user);
this.deviation += (lDens - this.density) * (lDens - this.density);
}
}
this.deviation = (float) Math.sqrt(this.deviation / this.size);
System.out.println ("Network size : " + this.size);
System.out.println ("Unique connections : " + connectivity.size());
System.out.println ("Network density : " + String.format("%10.6f", this.density));
System.out.println ("Network deviation : " + String.format("%10.6f", this.deviation));
/*
i = inDegree.keySet().iterator();
while (i.hasNext()) {
Integer user = i.next();
if (inDegree.get(user) != null) {
int degree = inDegree.get(user);
if (degree > 10) {
System.out.println ("User " + user + " has a in-degree " + degree);
}
}
}
*/
SortedMap<Integer, List<Integer>> sortedUsers = new TreeMap<Integer, List<Integer>> ();
i = outDegree.keySet().iterator();
while (i.hasNext()) {
Integer user = i.next();
if (outDegree.get(user) != null) {
int degree = outDegree.get(user);
if (sortedUsers.get(degree) == null) {
List<Integer> l = new LinkedList<Integer> ();
l.add(user);
sortedUsers.put(degree, l);
} else {
List<Integer> l = sortedUsers.get (degree);
l.add (user);
sortedUsers.put(degree, l);
}
}
}
i = sortedUsers.keySet().iterator();
while (i.hasNext()) {
Integer degree = i.next();
float percent = sortedUsers.get(degree).size() * 100.0f / (float) this.size;
Iterator<Integer> u = sortedUsers.get(degree).iterator();
float messageSize = 0.0f;
while (u.hasNext()) {
Integer user = u.next();
if (localMessageSize.get(user) != null)
messageSize += localMessageSize.get(user);
}
messageSize /= sortedUsers.get(degree).size();
System.out.println ("Degree : " + degree + ", users : " + sortedUsers.get(degree).size() + " (" + String.format("%.5f", percent) + " %), average message size : " + String.format("%.2f", messageSize));
}
i = sortedUsers.keySet().iterator();
while (i.hasNext()) {
Integer degree = i.next();
if (degree > 50) {
Iterator<Integer> u = sortedUsers.get(degree).iterator();
while (u.hasNext()) {
Integer user = u.next();
System.out.println ("User : " + user);
System.out.println (" > centrality : " + degree);
System.out.println (" > power : " + localDimension.get(user));
System.out.println (" > in-degree : " + inDegree.get(user));
System.out.println (" > message size : " + localMessageSize.get(user));
}
}
}
/*
i = localDimension.keySet().iterator();
while (i.hasNext()) {
Integer user = i.next();
Float size = localDimension.get(user);
if (size > 20) {
System.out.println ("User " + user + " has a size of " + size);
}
}
*/
}
public static void main (String[] args) {
TestSocialNetwork network = new TestSocialNetwork ();
try {
network.displayNetworkStatistics();
} catch (Exception e) {
e.printStackTrace();
}
}
}