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

Reply via email to