package com.tinkerpop.blueprints.impls.rexster;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.util.DefaultVertexQuery;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* RexsterQuery makes no requests until edges(), vertices(), count() or vertexIds() is called.
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class RexsterVertexQuery extends DefaultVertexQuery {
public final String baseUri;
public final RexsterGraph graph;
public RexsterVertexQuery(final String uri, final RexsterGraph graph) {
super(null);
this.baseUri = uri;
this.graph = graph;
}
public Iterable<Edge> edges() {
final String directionReturnToken;
if (this.direction == Direction.IN) {
directionReturnToken = RexsterTokens.SLASH_INE;
} else if (this.direction == Direction.OUT) {
directionReturnToken = RexsterTokens.SLASH_OUTE;
} else {
directionReturnToken = RexsterTokens.SLASH_BOTHE;
}
return new RexsterEdgeIterable(buildUri(directionReturnToken), graph);
}
public Iterable<Vertex> vertices() {
final String directionReturnToken;
if (this.direction == Direction.IN) {
directionReturnToken = RexsterTokens.SLASH_IN;
} else if (this.direction == Direction.OUT) {
directionReturnToken = RexsterTokens.SLASH_OUT;
} else {
directionReturnToken = RexsterTokens.SLASH_BOTH;
}
return new RexsterVertexIterable(buildUri(directionReturnToken), graph);
}
public long count() {
final String directionReturnToken;
if (this.direction == Direction.IN) {
directionReturnToken = RexsterTokens.SLASH_INCOUNT;
} else if (this.direction == Direction.OUT) {
directionReturnToken = RexsterTokens.SLASH_OUTCOUNT;
} else {
directionReturnToken = RexsterTokens.SLASH_BOTHCOUNT;
}
final JSONObject jsonObject = RestHelper.get(buildUri(directionReturnToken));
return jsonObject.optLong(RexsterTokens.TOTAL_SIZE);
}
public Object vertexIds() {
final String directionReturnToken;
if (this.direction == Direction.IN) {
directionReturnToken = RexsterTokens.SLASH_INIDS;
} else if (this.direction == Direction.OUT) {
directionReturnToken = RexsterTokens.SLASH_OUTIDS;
} else {
directionReturnToken = RexsterTokens.SLASH_BOTHIDS;
}
final JSONArray jsonArray = RestHelper.getResultArray(buildUri(directionReturnToken));
final List<Object> list = new ArrayList<Object>();
for (int ix = 0; ix < jsonArray.length(); ix++) {
list.add(jsonArray.opt(ix));
}
return list;
}
private String buildUri(final String directionReturnToken) {
final StringBuilder sb = new StringBuilder(this.baseUri + directionReturnToken + RexsterTokens.QUESTION);
sb.append(RexsterTokens._TAKE);
sb.append(RexsterTokens.EQUALS);
sb.append(this.limit);
/*sb.append(RexsterTokens.AND);
sb.append(RexsterTokens._SKIP);
sb.append(RexsterTokens.EQUALS);
sb.append(this.minimum);*/
if (this.labels != null && this.labels.length > 0) {
sb.append(RexsterTokens.AND);
sb.append(RexsterTokens._LABEL_EQUALS);
sb.append(RexsterTokens.LEFT_SQUARE_BRACKET);
for (String label : labels) {
sb.append(label);
sb.append(RexsterTokens.COMMA);
}
sb.deleteCharAt(sb.length() - 1);
sb.append(RexsterTokens.RIGHT_SQUARE_BRACKET);
}
if (this.hasContainers.size() > 0) {
sb.append(RexsterTokens.AND);
sb.append(RexsterTokens._PROPERTIES);
sb.append(RexsterTokens.EQUALS);
sb.append(RexsterTokens.LEFT_SQUARE_BRACKET);
for (HasContainer hasContainer : this.hasContainers) {
sb.append(RexsterTokens.LEFT_SQUARE_BRACKET);
sb.append(hasContainer.key);
sb.append(RexsterTokens.COMMA);
sb.append(hasContainer.predicate.toString());
sb.append(RexsterTokens.COMMA);
// for (Object v : hasContainer.values) {
sb.append(RestHelper.uriCast(hasContainer.value)); // TODO BRO.
sb.append(" ");
//}
sb.trimToSize();
sb.append(RexsterTokens.RIGHT_SQUARE_BRACKET);
sb.append(RexsterTokens.COMMA);
}
sb.deleteCharAt(sb.length() - 1);
if (this.hasContainers.size() > 0) {
sb.append(RexsterTokens.RIGHT_SQUARE_BRACKET);
}
}
return sb.toString();
}
}