use of org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep in project janusgraph by JanusGraph.
the class JanusGraphStepStrategyTest method applyMultiQueryTraversalSteps.
private void applyMultiQueryTraversalSteps(Traversal.Admin<?, ?> traversal) {
TraversalHelper.getStepsOfAssignableClassRecursively(VertexStep.class, traversal).forEach(vertexStep -> {
JanusGraphVertexStep janusGraphVertexStep = new JanusGraphVertexStep<>(vertexStep);
TraversalHelper.replaceStep(vertexStep, janusGraphVertexStep, vertexStep.getTraversal());
if (JanusGraphTraversalUtil.isEdgeReturnStep(janusGraphVertexStep)) {
HasStepFolder.foldInHasContainer(janusGraphVertexStep, vertexStep.getTraversal(), vertexStep.getTraversal());
}
});
TraversalHelper.getStepsOfAssignableClassRecursively(PropertiesStep.class, traversal).forEach(vertexStep -> {
JanusGraphPropertiesStep janusGraphPropertiesStep = new JanusGraphPropertiesStep<>(vertexStep);
TraversalHelper.replaceStep(vertexStep, janusGraphPropertiesStep, vertexStep.getTraversal());
});
TraversalHelper.getStepsOfAssignableClassRecursively(IsStep.class, traversal).forEach(isStep -> {
Object expectedStep = isStep.getPredicate().getValue();
if (expectedStep.equals(JanusGraphMultiQueryStep.class.getSimpleName())) {
TraversalHelper.replaceStep(isStep, new JanusGraphMultiQueryStep(isStep.getTraversal(), false), isStep.getTraversal());
}
});
}
use of org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep in project titan by thinkaurelius.
the class AdjacentVertexFilterOptimizerStrategy method apply.
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
TraversalHelper.getStepsOfClass(TraversalFilterStep.class, traversal).forEach(originalStep -> {
Traversal.Admin<?, ?> filterTraversal = (Traversal.Admin<?, ?>) originalStep.getLocalChildren().get(0);
List<Step> steps = filterTraversal.getSteps();
if (steps.size() == 2 && (steps.get(0) instanceof EdgeVertexStep || steps.get(0) instanceof EdgeOtherVertexStep) && (steps.get(1) instanceof IsStep)) {
Direction direction = null;
if (steps.get(0) instanceof EdgeVertexStep) {
EdgeVertexStep evs = (EdgeVertexStep) steps.get(0);
if (evs.getDirection() != Direction.BOTH)
direction = evs.getDirection();
} else {
assert steps.get(0) instanceof EdgeOtherVertexStep;
direction = Direction.BOTH;
}
P predicate = ((IsStep) steps.get(1)).getPredicate();
if (direction != null && predicate.getBiPredicate() == Compare.eq && predicate.getValue() instanceof Vertex) {
TitanVertex vertex = TitanTraversalUtil.getTitanVertex((Vertex) predicate.getValue());
Step<?, ?> currentStep = originalStep.getPreviousStep();
while (true) {
if (currentStep instanceof HasStep || currentStep instanceof IdentityStep) {
} else
break;
}
if (currentStep instanceof VertexStep) {
VertexStep vstep = (VertexStep) currentStep;
if (vstep.returnsEdge() && (direction == Direction.BOTH || direction.equals(vstep.getDirection().opposite()))) {
TraversalHelper.replaceStep(originalStep, new HasStep(traversal, HasContainer.makeHasContainers(ImplicitKey.ADJACENT_ID.name(), P.eq(vertex))), traversal);
}
}
}
}
});
}
use of org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep in project janusgraph by JanusGraph.
the class AdjacentVertexFilterOptimizerStrategy method apply.
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
TraversalHelper.getStepsOfClass(TraversalFilterStep.class, traversal).forEach(originalStep -> {
// Check if this filter traversal matches the pattern: _.inV/outV/otherV.is(x)
Traversal.Admin<?, ?> filterTraversal = (Traversal.Admin<?, ?>) originalStep.getLocalChildren().get(0);
List<Step> steps = filterTraversal.getSteps();
if (steps.size() == 2 && (steps.get(0) instanceof EdgeVertexStep || steps.get(0) instanceof EdgeOtherVertexStep) && (steps.get(1) instanceof IsStep)) {
// Get the direction in which we filter on the adjacent vertex (or null if not a valid adjacency filter)
Direction direction = null;
if (steps.get(0) instanceof EdgeVertexStep) {
EdgeVertexStep evs = (EdgeVertexStep) steps.get(0);
if (evs.getDirection() != Direction.BOTH)
direction = evs.getDirection();
} else {
assert steps.get(0) instanceof EdgeOtherVertexStep;
direction = Direction.BOTH;
}
P predicate = ((IsStep) steps.get(1)).getPredicate();
// Check that we have a valid direction and a valid vertex filter predicate
if (direction != null && predicate.getBiPredicate() == Compare.eq && predicate.getValue() instanceof Vertex) {
JanusGraphVertex vertex = JanusGraphTraversalUtil.getJanusGraphVertex((Vertex) predicate.getValue());
// Now, check that this step is preceded by VertexStep that returns edges
Step<?, ?> currentStep = originalStep.getPreviousStep();
while (true) {
if (!(currentStep instanceof HasStep) && !(currentStep instanceof IdentityStep)) {
break;
}
// We can jump over other steps as we move backward
}
if (currentStep instanceof VertexStep) {
VertexStep vertexStep = (VertexStep) currentStep;
if (vertexStep.returnsEdge() && (direction == Direction.BOTH || direction.equals(vertexStep.getDirection().opposite()))) {
// Now replace the step with a has condition
TraversalHelper.replaceStep(originalStep, new HasStep(traversal, HasContainer.makeHasContainers(ImplicitKey.ADJACENT_ID.name(), P.eq(vertex))), traversal);
}
}
}
}
});
}
use of org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep in project janusgraph by JanusGraph.
the class AdjacentVertexFilterOptimizerStrategy method parsePredicate.
private P parsePredicate(OptimizableQueryType type, List<Step> steps) {
switch(type) {
case IS:
IsStep isStep = (IsStep) steps.get(1);
return isStep.getPredicate();
case HASID:
HasStep hasStep = (HasStep) steps.get(1);
HasContainer hasContainer = (HasContainer) hasStep.getHasContainers().get(0);
return hasContainer.getPredicate();
default:
return null;
}
}
Aggregations