RepeatUnrollStrategy will not unroll for 0 loops. Also, made the NoOpBarrier of 
RepeatUnrollStrategy a lazy barrier of 5000 just to be OME safe. Added more 
test patterns to RepeatUnrollStrategyTest.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/91e00101
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/91e00101
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/91e00101

Branch: refs/heads/TINKERPOP-1278
Commit: 91e00101a26883401d8a2f1c96754ba6dbd22a1f
Parents: 5c5b1a9
Author: Marko A. Rodriguez <[email protected]>
Authored: Sun Jul 17 08:34:14 2016 -0600
Committer: Marko A. Rodriguez <[email protected]>
Committed: Sun Jul 17 08:34:14 2016 -0600

----------------------------------------------------------------------
 .../optimization/RepeatUnrollStrategy.java      |  4 +--
 .../optimization/RepeatUnrollStrategyTest.java  | 28 +++++++++++---------
 2 files changed, 17 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/91e00101/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 79135a3..fdc7e85 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
@@ -47,7 +47,7 @@ public final class RepeatUnrollStrategy extends 
AbstractTraversalStrategy<Traver
         for (int i = 0; i < traversal.getSteps().size(); i++) {
             if (traversal.getSteps().get(i) instanceof RepeatStep) {
                 final RepeatStep<?> repeatStep = (RepeatStep) 
traversal.getSteps().get(i);
-                if (null == repeatStep.getEmitTraversal() && 
repeatStep.getUntilTraversal() instanceof LoopTraversal) {
+                if (null == repeatStep.getEmitTraversal() && 
repeatStep.getUntilTraversal() instanceof LoopTraversal && ((LoopTraversal) 
repeatStep.getUntilTraversal()).getMaxLoops() > 0) {
                     final Traversal.Admin<?, ?> repeatTraversal = 
repeatStep.getGlobalChildren().get(0);
                     final int repeatLength = repeatTraversal.getSteps().size() 
- 1;
                     repeatTraversal.removeStep(repeatLength); // removes the 
RepeatEndStep
@@ -57,7 +57,7 @@ public final class RepeatUnrollStrategy extends 
AbstractTraversalStrategy<Traver
                         TraversalHelper.insertTraversal(insertIndex, 
repeatTraversal.clone(), 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));
+                            traversal.addStep(++insertIndex, new 
NoOpBarrierStep<>(traversal, 5000));
                     }
                     // label last step if repeat() was labeled
                     if (!repeatStep.getLabels().isEmpty()) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/91e00101/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java
index d409cc2..4a02218 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java
@@ -73,24 +73,26 @@ public class RepeatUnrollStrategyTest {
 
         @Parameterized.Parameters(name = "{0}")
         public static Iterable<Object[]> generateTestParameters() {
-
+            final int maxBarrierSize = 5000;
             final Predicate<Traverser<Vertex>> predicate = t -> t.loops() > 5;
             return Arrays.asList(new Traversal[][]{
+                    {__.repeat(__.out()).times(0), 
__.repeat(__.out()).times(0)},
+                    {__.<Vertex>times(0).repeat(__.out()), 
__.<Vertex>times(0).repeat(__.out())},
                     {__.identity(), __.identity()},
-                    
{__.out().as("a").in().repeat(__.outE("created").bothV()).times(2).in(), 
__.out().as("a").in().outE("created").bothV().barrier().outE("created").bothV().barrier().in()},
-                    
{__.out().repeat(__.outE("created").bothV()).times(1).in(), 
__.out().outE("created").bothV().barrier().in()},
-                    {__.repeat(__.outE("created").bothV()).times(1).in(), 
__.outE("created").bothV().barrier().in()},
-                    
{__.repeat(__.out()).times(2).as("x").repeat(__.in().as("b")).times(3), 
__.out().barrier().out().barrier().as("x").in().as("b").barrier().in().as("b").barrier().in().as("b").barrier()},
-                    {__.repeat(__.outE("created").inV()).times(2), 
__.outE("created").inV().barrier().outE("created").inV().barrier()},
-                    {__.repeat(__.out()).times(3), 
__.out().barrier().out().barrier().out().barrier()},
-                    
{__.repeat(__.local(__.select("a").out("knows"))).times(2), 
__.local(__.select("a").out("knows")).barrier().local(__.select("a").out("knows")).barrier()},
-                    {__.<Vertex>times(2).repeat(__.out()), 
__.out().barrier().out().barrier()},
-                    
{__.<Vertex>out().times(2).repeat(__.out().as("a")).as("x"), 
__.out().out().as("a").barrier().out().as("a").barrier().as("x")},
+                    
{__.out().as("a").in().repeat(__.outE("created").bothV()).times(2).in(), 
__.out().as("a").in().outE("created").bothV().barrier(maxBarrierSize).outE("created").bothV().barrier(maxBarrierSize).in()},
+                    
{__.out().repeat(__.outE("created").bothV()).times(1).in(), 
__.out().outE("created").bothV().barrier(maxBarrierSize).in()},
+                    {__.repeat(__.outE("created").bothV()).times(1).in(), 
__.outE("created").bothV().barrier(maxBarrierSize).in()},
+                    
{__.repeat(__.out()).times(2).as("x").repeat(__.in().as("b")).times(3), 
__.out().barrier(maxBarrierSize).out().barrier(maxBarrierSize).as("x").in().as("b").barrier(maxBarrierSize).in().as("b").barrier(maxBarrierSize).in().as("b").barrier(maxBarrierSize)},
+                    {__.repeat(__.outE("created").inV()).times(2), 
__.outE("created").inV().barrier(maxBarrierSize).outE("created").inV().barrier(maxBarrierSize)},
+                    {__.repeat(__.out()).times(3), 
__.out().barrier(maxBarrierSize).out().barrier(maxBarrierSize).out().barrier(maxBarrierSize)},
+                    
{__.repeat(__.local(__.select("a").out("knows"))).times(2), 
__.local(__.select("a").out("knows")).barrier(maxBarrierSize).local(__.select("a").out("knows")).barrier(maxBarrierSize)},
+                    {__.<Vertex>times(2).repeat(__.out()), 
__.out().barrier(maxBarrierSize).out().barrier(maxBarrierSize)},
+                    
{__.<Vertex>out().times(2).repeat(__.out().as("a")).as("x"), 
__.out().out().as("a").barrier(maxBarrierSize).out().as("a").barrier(maxBarrierSize).as("x")},
                     {__.repeat(__.out()).emit().times(2), 
__.repeat(__.out()).emit().times(2)},
                     {__.repeat(__.out()).until(predicate), 
__.repeat(__.out()).until(predicate)},
-                    
{__.repeat(__.out()).until(predicate).repeat(__.out()).times(2), 
__.repeat(__.out()).until(predicate).out().barrier().out().barrier()},
-                    {__.repeat(__.union(__.both(), 
__.identity())).times(2).out(), __.union(__.both(), 
__.identity()).barrier().union(__.both(), __.identity()).barrier().out()},
-                    
{__.in().repeat(__.out("knows")).times(3).as("a").count().is(0), 
__.in().out("knows").barrier().out("knows").barrier().out("knows").as("a").count().is(0)},
+                    
{__.repeat(__.out()).until(predicate).repeat(__.out()).times(2), 
__.repeat(__.out()).until(predicate).out().barrier(maxBarrierSize).out().barrier(maxBarrierSize)},
+                    {__.repeat(__.union(__.both(), 
__.identity())).times(2).out(), __.union(__.both(), 
__.identity()).barrier(maxBarrierSize).union(__.both(), 
__.identity()).barrier(maxBarrierSize).out()},
+                    
{__.in().repeat(__.out("knows")).times(3).as("a").count().is(0), 
__.in().out("knows").barrier(maxBarrierSize).out("knows").barrier(maxBarrierSize).out("knows").as("a").count().is(0)},
             });
         }
     }

Reply via email to