took into account a @dkuppitz comment about not checking for hasStepOfAssignableClass as it just wastes clock cycles. Also, came up with a cleaner algorithm for determing whether the final NoOpBarrierStep should be added or not. Faster and less memory usage.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/d634953f Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/d634953f Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/d634953f Branch: refs/heads/TINKERPOP-1254 Commit: d634953fd1d016c8d840183e3fb0d29d0b92a2c1 Parents: 6208b90 Author: Marko A. Rodriguez <[email protected]> Authored: Tue Jun 28 14:42:44 2016 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Tue Jun 28 14:42:44 2016 -0600 ---------------------------------------------------------------------- .../optimization/RepeatUnrollStrategy.java | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d634953f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategy.java index 2139e81..79135a3 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategy.java @@ -41,8 +41,7 @@ public final class RepeatUnrollStrategy extends AbstractTraversalStrategy<Traver @Override public void apply(final Traversal.Admin<?, ?> traversal) { - if (!TraversalHelper.hasStepOfAssignableClass(RepeatStep.class, traversal) || - TraversalHelper.onGraphComputer(traversal)) + if (TraversalHelper.onGraphComputer(traversal)) return; for (int i = 0; i < traversal.getSteps().size(); i++) { @@ -56,18 +55,15 @@ public final class RepeatUnrollStrategy extends AbstractTraversalStrategy<Traver final int loops = (int) ((LoopTraversal) repeatStep.getUntilTraversal()).getMaxLoops(); for (int j = 0; j < loops; j++) { TraversalHelper.insertTraversal(insertIndex, repeatTraversal.clone(), traversal); - insertIndex = insertIndex + repeatLength + 1; - traversal.addStep(insertIndex, new NoOpBarrierStep<>(traversal)); + insertIndex = insertIndex + repeatLength; + if (j != (loops - 1) || !(traversal.getSteps().get(insertIndex).getNextStep() instanceof Barrier)) // only add a final NoOpBarrier is subsequent step is not a barrier + traversal.addStep(++insertIndex, new NoOpBarrierStep<>(traversal)); } - - final NoOpBarrierStep<?> lastStep = (NoOpBarrierStep) traversal.getSteps().get(insertIndex); - Step<?, ?> labelStep = lastStep; - if (lastStep.getNextStep() instanceof Barrier) { - labelStep = traversal.getSteps().get(insertIndex - 1); - traversal.removeStep(insertIndex); // remove last NoOpBarrierStep + // label last step if repeat() was labeled + if (!repeatStep.getLabels().isEmpty()) { + final Step<?, ?> lastStep = traversal.getSteps().get(insertIndex); + repeatStep.getLabels().forEach(lastStep::addLabel); } - if (!repeatStep.getLabels().isEmpty()) - repeatStep.getLabels().forEach(labelStep::addLabel); traversal.removeStep(i); // remove the RepeatStep }
