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)}, }); } }
