package io.innerloop.neo4j.client.spi.impl.rest;
import io.innerloop.neo4j.client.Graph;
import io.innerloop.neo4j.client.Neo4jServerException;
import io.innerloop.neo4j.client.Node;
import io.innerloop.neo4j.client.Relationship;
import io.innerloop.neo4j.client.RowSet;
import io.innerloop.neo4j.client.spi.impl.rest.json.JSONArray;
import io.innerloop.neo4j.client.spi.impl.rest.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by markangrish on 06/11/2014.
*/
public class ExecutionResult
{
private final JSONObject response;
public ExecutionResult(JSONObject response)
{
this.response = response;
}
public Neo4jServerException[] getErrors()
{
JSONArray errorsJson = response.getJSONArray("errors");
int length = errorsJson.length();
Neo4jServerException[] errors = new Neo4jServerException[length];
for (int i = 0; i < length; i++)
{
JSONObject errorJson = errorsJson.getJSONObject(i);
errors[i] = new Neo4jServerException(errorJson.optString("code"), errorJson.optString("message"));
}
return errors;
}
public JSONObject geResult(int index)
{
JSONArray results = response.getJSONArray("results");
return results.getJSONObject(index);
}
public Graph buildGraph(JSONObject result)
{
Map<Long, Node> seenNodes = new HashMap<>();
Map<Long, Relationship> seenRelationships = new HashMap<>();
JSONArray data = result.getJSONArray("data");
int dataLength = data.length();
for (int i = 0; i < dataLength; i++)
{
JSONObject datum = data.getJSONObject(i);
JSONObject graph = datum.getJSONObject("graph");
JSONArray nodes = graph.getJSONArray("nodes");
int nodesLength = nodes.length();
for (int j = 0; j < nodesLength; j++)
{
JSONObject node = nodes.getJSONObject(j);
long id = node.getLong("id");
Node n = seenNodes.get(id);
if (n != null)
{
continue;
}
JSONArray labels = node.getJSONArray("labels");
int labelsLength = labels.length();
String[] ls = new String[labelsLength];
for (int k = 0; k < labelsLength; k++)
{
ls[k] = labels.getString(k);
}
JSONObject properties = node.getJSONObject("properties");
Map<String, Object> ps = JsonUtils.jsonToMap(properties);
n = new Node(id, ls, ps);
seenNodes.put(id, n);
}
JSONArray relationships = graph.getJSONArray("relationships");
int relationshipsLength = relationships.length();
for (int j = 0; j < relationshipsLength; j++)
{
JSONObject relationship = relationships.getJSONObject(j);
long id = relationship.getLong("id");
long startNode = relationship.getLong("startNode");
long endNode = relationship.getLong("endNode");
String type = relationship.getString("type");
JSONObject properties = relationship.getJSONObject("properties");
Map<String, Object> ps = JsonUtils.jsonToMap(properties);
Relationship r = new Relationship(id, type, startNode, endNode, ps);
seenRelationships.put(r.getId(), r);
}
}
Set<Node> ns = new HashSet<>(seenNodes.values());
Set<Relationship> rs = new HashSet<>(seenRelationships.values());
return new Graph(ns, rs);
}
public RowSet buildRowSet(JSONObject result)
{
JSONArray columnNamesJson = result.getJSONArray("columns");
int columnsLength = columnNamesJson.length();
List<String> columnNames = new ArrayList<>();
for (int i = 0; i < columnsLength; i++)
{
columnNames.add(columnNamesJson.getString(i));
}
List<Object[]> rows = new ArrayList<>();
JSONArray data = result.getJSONArray("data");
int dataLength = data.length();
for (int i = 0; i < dataLength; i++)
{
JSONObject datum = data.getJSONObject(i);
JSONArray row = datum.getJSONArray("row");
int rowLength = row.length();
Object[] r = new Object[columnsLength];
rows.add(r);
for (int j = 0; j < rowLength; j++)
{
Object object;
JSONObject jsonObject = row.optJSONObject(j);
if (jsonObject != null)
{
object = JsonUtils.jsonToMap(jsonObject);
r[j] = object;
continue;
}
object = row.opt(j);
if (object != null)
{
r[j] = object;
}
}
}
return new RowSet(columnNames.toArray(new String[columnNames.size()]), rows);
}
}