package com.tinkerpop.gremlin.java;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.pipes.IdentityPipe;
import com.tinkerpop.pipes.Pipe;
import com.tinkerpop.pipes.filter.IntervalFilterPipe;
import com.tinkerpop.pipes.filter.PropertyFilterPipe;
import com.tinkerpop.pipes.filter.RangeFilterPipe;
import com.tinkerpop.pipes.transform.EdgesVerticesPipe;
import com.tinkerpop.pipes.transform.GraphQueryPipe;
import com.tinkerpop.pipes.transform.QueryPipe;
import com.tinkerpop.pipes.transform.VertexQueryPipe;
import com.tinkerpop.pipes.transform.VerticesEdgesPipe;
import com.tinkerpop.pipes.transform.VerticesVerticesPipe;
import com.tinkerpop.pipes.util.FluentUtility;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class GremlinFluentUtility extends FluentUtility {
public static GremlinPipeline optimizePipelineForQuery(final GremlinPipeline pipeline, final Pipe pipe) {
if (!optimizePipelineForGraphQuery(pipeline, pipe))
if (!optimizePipelineForVertexQuery(pipeline, pipe))
pipeline.addPipe(pipe);
return pipeline;
}
public static boolean optimizePipelineForVertexQuery(final GremlinPipeline pipeline, final Pipe pipe) {
VertexQueryPipe queryPipe = null;
for (int i = pipeline.size() - 1; i > 0; i--) {
final Pipe temp = pipeline.get(i);
if (temp instanceof VertexQueryPipe) {
queryPipe = (VertexQueryPipe) temp;
break;
} else if (!(temp instanceof IdentityPipe))
break;
}
if (null != queryPipe) {
if (pipe instanceof EdgesVerticesPipe) {
if (queryPipe.getResultElementClass().equals(Vertex.class))
return false;
queryPipe.setResultingElementClass(Vertex.class);
} else if (pipe instanceof VerticesVerticesPipe) {
if (queryPipe.getResultElementClass().equals(Vertex.class))
return false;
queryPipe.setDirection(((VerticesVerticesPipe) pipe).getDirection());
queryPipe.setLabels(((VerticesVerticesPipe) pipe).getLabels());
queryPipe.setBranchFactor(((VerticesVerticesPipe) pipe).getBranchFactor());
} else if (pipe instanceof VerticesEdgesPipe) {
if (queryPipe.getResultElementClass().equals(Vertex.class))
return false;
queryPipe.setResultingElementClass(Edge.class);
queryPipe.setDirection(((VerticesEdgesPipe) pipe).getDirection());
queryPipe.setLabels(((VerticesEdgesPipe) pipe).getLabels());
queryPipe.setBranchFactor(((VerticesEdgesPipe) pipe).getBranchFactor());
} else if (pipe instanceof PropertyFilterPipe) {
if (queryPipe.getResultElementClass().equals(Vertex.class))
return false;
final PropertyFilterPipe temp = (PropertyFilterPipe) pipe;
queryPipe.addHasContainer(new QueryPipe.HasContainer(temp.getKey(), temp.getPredicate(), temp.getValue()));
} else if (pipe instanceof IntervalFilterPipe) {
if (queryPipe.getResultElementClass().equals(Vertex.class))
return false;
final IntervalFilterPipe temp = (IntervalFilterPipe) pipe;
queryPipe.addIntervalContainer(new QueryPipe.IntervalContainer(temp.getKey(), temp.getStartValue(), temp.getEndValue()));
} else if (pipe instanceof RangeFilterPipe) {
queryPipe.setLowRange(((RangeFilterPipe) pipe).getLowRange());
queryPipe.setHighRange(((RangeFilterPipe) pipe).getHighRange());
}
pipeline.addPipe(new IdentityPipe());
return true;
} else {
return false;
}
}
private static boolean optimizePipelineForGraphQuery(final GremlinPipeline pipeline, final Pipe pipe) {
GraphQueryPipe queryPipe = null;
for (int i = pipeline.size() - 1; i > 0; i--) {
final Pipe temp = pipeline.get(i);
if (temp instanceof GraphQueryPipe) {
queryPipe = (GraphQueryPipe) temp;
break;
} else if (!(temp instanceof IdentityPipe))
break;
}
if (null != queryPipe) {
if (pipe instanceof PropertyFilterPipe) {
final PropertyFilterPipe temp = (PropertyFilterPipe) pipe;
queryPipe.addHasContainer(new QueryPipe.HasContainer(temp.getKey(), temp.getPredicate(), temp.getValue()));
} else if (pipe instanceof IntervalFilterPipe) {
final IntervalFilterPipe temp = (IntervalFilterPipe) pipe;
queryPipe.addIntervalContainer(new QueryPipe.IntervalContainer(temp.getKey(), temp.getStartValue(), temp.getEndValue()));
} else if (pipe instanceof RangeFilterPipe) {
queryPipe.setLowRange(((RangeFilterPipe) pipe).getLowRange());
queryPipe.setHighRange(((RangeFilterPipe) pipe).getHighRange());
}
pipeline.addPipe(new IdentityPipe());
return true;
} else {
return false;
}
}
}