Special `RangeByIsCountStrategy` handling for `repeat()`'s `emit()` and `until()`.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/70e8c2a6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/70e8c2a6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/70e8c2a6 Branch: refs/heads/master Commit: 70e8c2a682e9b6849e4e893c2109b7d924292a2d Parents: 498585b Author: Daniel Kuppitz <daniel_kupp...@hotmail.com> Authored: Thu May 26 15:14:48 2016 +0200 Committer: Daniel Kuppitz <daniel_kupp...@hotmail.com> Committed: Fri May 27 13:25:37 2016 +0200 ---------------------------------------------------------------------- .../optimization/RangeByIsCountStrategy.java | 16 ++++++++++++++-- .../optimization/RangeByIsCountStrategyTest.java | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/70e8c2a6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java index 09aa730..835a8f9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java @@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; +import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep; @@ -41,6 +42,7 @@ import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.BiPredicate; @@ -94,9 +96,19 @@ public final class RangeByIsCountStrategy extends AbstractTraversalStrategy<Trav final boolean update = highRange == null || highRangeCandidate > highRange; if (update) { final boolean isNested = !(parent instanceof EmptyStep); + if (isNested) { + if (parent instanceof RepeatStep) { + final RepeatStep repeatStep = (RepeatStep) parent; + useNotStep = Objects.equals(traversal, repeatStep.getUntilTraversal()) + || Objects.equals(traversal, repeatStep.getEmitTraversal()); + } else { + useNotStep = parent instanceof SideEffectStep; + } + } else { + useNotStep = true; + } highRange = highRangeCandidate; - useNotStep = curr.getLabels().isEmpty() && next.getLabels().isEmpty() - && (!isNested || parent instanceof SideEffectStep) + useNotStep &= curr.getLabels().isEmpty() && next.getLabels().isEmpty() && next.getNextStep() instanceof EmptyStep && ((highRange <= 1L && predicate.equals(Compare.lt)) || (highRange == 1L && (predicate.equals(Compare.eq) || predicate.equals(Compare.lte)))); http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/70e8c2a6/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java index e62c3a6..820d4cc 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java @@ -145,6 +145,8 @@ public class RangeByIsCountStrategyTest { {__.sideEffect(__.count().is(0)), __.sideEffect(__.not(__.identity()))}, {__.branch(__.count().is(0)), __.branch(__.count().limit(1).is(0))}, {__.count().is(0).store("x"), __.limit(1).count().is(0).store("x")}, + {__.repeat(__.out()).until(__.outE().count().is(0)), __.repeat(__.out()).until(__.not(__.outE()))}, + {__.repeat(__.out()).emit(__.outE().count().is(0)), __.repeat(__.out()).emit(__.not(__.outE()))}, }); } }