package net.jrtechs.www.graphDB;
|
|
|
|
import net.jrtechs.www.server.Player;
|
|
import net.jrtechs.www.SteamAPI.APIConnection;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Does graph based operations with {@link Player}
|
|
* and {@link RemoteConnection}
|
|
*
|
|
* @author Jeffery Russell 5-26-17
|
|
*/
|
|
public class SteamGraph
|
|
{
|
|
/** Connection to the graph server */
|
|
private RemoteConnection con;
|
|
|
|
/** Connection to steam api */
|
|
private APIConnection api;
|
|
|
|
|
|
/**
|
|
* Constructs object with a graph connection
|
|
* and a steam api connection
|
|
*/
|
|
public SteamGraph()
|
|
{
|
|
this.con = new RemoteConnection();
|
|
this.api = new APIConnection();
|
|
}
|
|
|
|
|
|
/**
|
|
* Checks if a player is already in the graph
|
|
*
|
|
* @param id steam id of player
|
|
* @return
|
|
*/
|
|
private boolean alreadyInGraph(String id)
|
|
{
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + id + "')";
|
|
//System.out.println(query);
|
|
return (1 <= con.queryGraph(query).stream().count());
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Inserts a player vertex into the graph
|
|
*
|
|
* @param
|
|
*/
|
|
private void insertPlayerIntoGraph(String id, String name)
|
|
{
|
|
try
|
|
{
|
|
if(!this.alreadyInGraph(id))
|
|
{
|
|
String queryInsertPlayer = "g.addV('player')" +
|
|
".property('name', '" + name + "')" +
|
|
".property('crawled', '0')" +
|
|
".property('id', '" + id + "')";
|
|
System.out.println("inserting " + name + " into graph");
|
|
this.con.queryGraph(queryInsertPlayer);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Checks if a friend-friend edge is already in the
|
|
* graph
|
|
*
|
|
* @param p1
|
|
* @param p2
|
|
* @return
|
|
*/
|
|
private boolean edgeAlreadyInGraph(String p1, String p2)
|
|
{
|
|
try
|
|
{
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + p1 + "')" +
|
|
".both()" +
|
|
".has('id', '" + p2 + "')";
|
|
//System.out.println(query);
|
|
return (1 <= con.queryGraph(query).stream().count());
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Inserts a edge between two players into the graph
|
|
*
|
|
* @param p1
|
|
* @param p2
|
|
*/
|
|
private void insertEdgeIntoGraph(String p1, String p2)
|
|
{
|
|
try
|
|
{
|
|
if(!this.edgeAlreadyInGraph(p1, p2))
|
|
{
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + p1 + "')" +
|
|
".as('p1')" +
|
|
"V().hasLabel('player')" +
|
|
".has('id', '" + p2 + "')" +
|
|
".as('p2')" +
|
|
".addE('friends')" +
|
|
".from('p1').to('p2')";
|
|
//System.out.println(query);
|
|
this.con.queryGraph(query);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* determines if a player has been indexed for friends yet
|
|
*
|
|
* @param id
|
|
* @return
|
|
*/
|
|
private boolean playerAlreadyIndexed(String id)
|
|
{
|
|
try
|
|
{
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + id + "')" +
|
|
".has('crawled', '0')";
|
|
|
|
return (1 != con.queryGraph(query).stream().count());
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
private void updateCrawledStatus(String id)
|
|
{
|
|
try
|
|
{
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + id + "')" +
|
|
".property('crawled', '1')";
|
|
|
|
this.con.queryGraph(query);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Fetches the name of the player from the graph database
|
|
*
|
|
* @param id
|
|
* @return
|
|
*/
|
|
private String getNameFromGraph(String id)
|
|
{
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + id + "')" +
|
|
".values('name')";
|
|
return this.con.queryGraph(query).stream()
|
|
.findFirst().get().getObject().toString();
|
|
}
|
|
|
|
|
|
/**
|
|
* Fetches a list of friends from the graph database
|
|
*
|
|
* @param id
|
|
* @return
|
|
*/
|
|
private List<Player> getFriendsFromGraph(String id)
|
|
{
|
|
List<Player> friends = new ArrayList<>();
|
|
|
|
String query = "g.V().hasLabel('player')" +
|
|
".has('id', '" + id + "')" +
|
|
".both().valueMap()";
|
|
try
|
|
{
|
|
this.con.queryGraph(query).stream().forEach(r ->
|
|
friends.add(new Player(
|
|
((ArrayList) (((HashMap<String, Object>) (r.getObject()))
|
|
.get("name"))).get(0).toString(),
|
|
((ArrayList) (((HashMap<String, Object>) (r.getObject()))
|
|
.get("id"))).get(0).toString()))
|
|
);
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
return friends;
|
|
}
|
|
|
|
|
|
/**
|
|
* tells api to get this dude's friends list
|
|
*
|
|
* @param id
|
|
*/
|
|
private void indexPersonFriends(String id)
|
|
{
|
|
System.out.println("indexing " + this.getNameFromGraph(id));
|
|
|
|
List<String> friendsIds = this.api.getFriends(id);
|
|
|
|
//find ones not in database
|
|
List<String> notInDatabase = new ArrayList<>();
|
|
for(String fid : friendsIds)
|
|
{
|
|
if(!this.alreadyInGraph(fid))
|
|
{
|
|
notInDatabase.add(fid);
|
|
}
|
|
}
|
|
Map<String, String> names = this.api.getNames(notInDatabase);
|
|
|
|
for(String key: names.keySet())
|
|
{
|
|
this.insertPlayerIntoGraph(key, names.get(key));
|
|
}
|
|
|
|
friendsIds.forEach(s-> this.insertEdgeIntoGraph(id, s));
|
|
|
|
this.updateCrawledStatus(id);
|
|
}
|
|
|
|
|
|
/**
|
|
* Fetches a player from the graph with all of its friends
|
|
*
|
|
* @param id
|
|
* @return
|
|
*/
|
|
public Player getPlayer(String id)
|
|
{
|
|
Player p;
|
|
if(this.alreadyInGraph(id)) // yay
|
|
{
|
|
p = new Player(this.getNameFromGraph(id), id);
|
|
if(!this.playerAlreadyIndexed(id)) //must index the person
|
|
{
|
|
this.indexPersonFriends(id);
|
|
}
|
|
|
|
p.setFriends(this.getFriendsFromGraph(id));
|
|
}
|
|
else //smh, shouldn't happen frequently
|
|
{
|
|
System.out.println("brand spanking new request " + id);
|
|
String name = this.api.getPlayerName(id);
|
|
if(name == null)
|
|
{
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
this.insertPlayerIntoGraph(id, name);
|
|
return this.getPlayer(id);
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param args
|
|
*/
|
|
public static void main(String[] args)
|
|
{
|
|
// SteamGraph graph = new SteamGraph();
|
|
//
|
|
// Player base = graph.getPlayer(args[0]);
|
|
//
|
|
// int debth = Integer.valueOf(args[1]);
|
|
//
|
|
// graph.insertIntoGraph(base, debth);
|
|
}
|
|
}
|