in gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java [80:137]
public void apply(final Traversal.Admin<?, ?> traversal) {
// drop()/element() is a problem for bulked edge/meta properties because of Property equality changes in TINKERPOP-2318
// which made it so that a Property is equal if the key/value is equal. as a result, they bulk together which
// is fine for almost all cases except when you wish to drop the property.
if (TraversalHelper.onGraphComputer(traversal) ||
traversal.getTraverserRequirements().contains(TraverserRequirement.PATH) ||
TraversalHelper.hasStepOfAssignableClass(DropStep.class, traversal)||
TraversalHelper.hasStepOfAssignableClass(ElementStep.class, traversal))
return;
boolean foundFlatMap = false;
boolean labeledPath = false;
for (int i = 0; i < traversal.getSteps().size(); i++) {
final Step<?, ?> step = traversal.getSteps().get(i);
if (step.getLabels().contains(BARRIER_PLACEHOLDER)) {
TraversalHelper.insertAfterStep(new NoOpBarrierStep<>(traversal, MAX_BARRIER_SIZE), step, traversal);
step.removeLabel(BARRIER_PLACEHOLDER);
if (step.getLabels().contains(BARRIER_COPY_LABELS)) {
step.removeLabel(BARRIER_COPY_LABELS);
TraversalHelper.copyLabels(step, step.getNextStep(), true);
}
}
if (step instanceof PathProcessor) {
final Set<String> keepLabels = ((PathProcessor) step).getKeepLabels();
if (null != keepLabels && keepLabels.isEmpty()) // if no more path data, then start barrier'ing again
labeledPath = false;
}
if (step instanceof FlatMapStep &&
!(step instanceof VertexStep && ((VertexStep) step).returnsEdge()) ||
(step instanceof GraphStep &&
(i > 0 || ((GraphStep) step).getIds().length >= BIG_START_SIZE ||
(((GraphStep) step).getIds().length == 0 && !(step.getNextStep() instanceof HasStep))))) {
// DiscardStep, EmptyStep signify the end of the traversal where no barriers are really going to be
// helpful after that. ProfileSideEffectStep means the traversal had profile() called on it and if
// we don't account for that a barrier will inject at the end of the traversal where it wouldn't
// be otherwise. LazyBarrierStrategy executes before the finalization strategy of ProfileStrategy
// so additionally injected ProfileSideEffectStep instances should not have effect here.
if (foundFlatMap && !labeledPath &&
!(step.getNextStep() instanceof Barrier) &&
!(step.getNextStep() instanceof DiscardStep) &&
!(step.getNextStep() instanceof EmptyStep) &&
!(step.getNextStep() instanceof ProfileSideEffectStep)) {
final Step noOpBarrierStep = new NoOpBarrierStep<>(traversal, MAX_BARRIER_SIZE);
TraversalHelper.copyLabels(step, noOpBarrierStep, true);
TraversalHelper.insertAfterStep(noOpBarrierStep, step, traversal);
} else
foundFlatMap = true;
}
if (!step.getLabels().isEmpty())
labeledPath = true;
}
}