in gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java [115:173]
private static boolean processHasStep(final HasStep<?> step, final Traversal.Admin<?, ?> traversal) {
if (step.getPreviousStep() instanceof HasStep) {
final HasStep<?> previousStep = (HasStep<?>) step.getPreviousStep();
final List<HasContainer> hasContainers = new ArrayList<>(step.getHasContainers());
for (final HasContainer hasContainer : hasContainers) {
previousStep.addHasContainer(hasContainer);
}
TraversalHelper.copyLabels(step, previousStep, false);
traversal.removeStep(step);
return true;
} else if (step.getPreviousStep() instanceof VertexStep
&& ((VertexStep) step.getPreviousStep()).returnsEdge()
&& 0 == ((VertexStep) step.getPreviousStep()).getEdgeLabels().length) {
final VertexStep<Edge> previousStep = (VertexStep<Edge>) step.getPreviousStep();
final List<Object> edgeLabels = new ArrayList<>();
for (final HasContainer hasContainer : new ArrayList<>(step.getHasContainers())) {
if (hasContainer.getKey().equals(T.label.getAccessor())) {
if (hasContainer.getBiPredicate() == Compare.eq && GValue.instanceOf(hasContainer.getValue(), GType.STRING) &&
edgeLabels.isEmpty()) {
edgeLabels.add(hasContainer.getValue());
step.removeHasContainer(hasContainer);
} else if (hasContainer.getBiPredicate() == Contains.within &&
hasContainer.getValue() instanceof Collection &&
((Collection) hasContainer.getValue()).containsAll(edgeLabels)) {
edgeLabels.addAll((Collection) hasContainer.getValue());
step.removeHasContainer(hasContainer);
} else if (hasContainer.getPredicate() instanceof OrP && edgeLabels.isEmpty()) {
boolean removeContainer = true;
final List<P<?>> orps = ((OrP) hasContainer.getPredicate()).getPredicates();
final List<Object> newEdges = new ArrayList<>();
for (int i = 0; i < orps.size(); i++) {
if (orps.get(i).getBiPredicate() == Compare.eq && GValue.instanceOf(orps.get(i).getValue(), GType.STRING))
newEdges.add(orps.get(i).getValue());
else {
removeContainer = false;
break;
}
}
if (removeContainer) {
edgeLabels.addAll(newEdges);
step.removeHasContainer(hasContainer);
}
}
}
}
if (!edgeLabels.isEmpty()) {
final VertexStep<Edge> newVertexStep = new VertexStep<>(traversal, Edge.class, previousStep.getDirection(), GValue.ensureGValues(edgeLabels.toArray()));
TraversalHelper.replaceStep(previousStep, newVertexStep, traversal);
TraversalHelper.copyLabels(previousStep, newVertexStep, false);
if (step.getHasContainers().isEmpty()) {
TraversalHelper.copyLabels(step, newVertexStep, false);
traversal.removeStep(step);
}
return true;
}
return false;
} else
return false;
}