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
                 }

Reply via email to