You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/19 02:52:11 UTC

incubator-tinkerpop git commit: even smarter about ensuring that computed conjunction patterns are not repeated.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 999f55f33 -> ea9b5461b


even smarter about ensuring that computed conjunction patterns are not repeated.


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

Branch: refs/heads/master
Commit: ea9b5461b52b8c54abe9ad8737f3eda0079cbba3
Parents: 999f55f
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 18 18:52:08 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 18 18:52:08 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/step/map/MatchStep.java    | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/ea9b5461/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
index 218a087..90498d5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
@@ -244,20 +244,17 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
                     }
                 }
             }
-            if (null == traverser)
+            if (null == traverser) {
                 traverser = this.starts.next();
-            else if (hasMatched(this.conjunction, traverser))
+                traverser.path().addLabel(this.getId()); // so the traverser never returns to this branch ever again
+            } else if (hasMatched(this.conjunction, traverser))
                 return IteratorUtils.of(traverser.split(this.getBindings(traverser), this));
 
             if (this.conjunction == Conjunction.AND) {
-                final Traversal.Admin<Object, Object> conjunctionTraversal = this.getMatchAlgorithm().apply(traverser); // determine which sub-pattern the traverser should try next
-                traverser.path().addLabel(conjunctionTraversal.getStartStep().getId()); // so the and() path is no longer taken once returned
-                conjunctionTraversal.addStart(traverser); // determine which sub-pattern the traverser should try next
+                this.getMatchAlgorithm().apply(traverser).addStart(traverser); // determine which sub-pattern the traverser should try next
             } else {  // OR
                 for (final Traversal.Admin<?, ?> conjunctionTraversal : this.conjunctionTraversals) {
-                    final Traverser split = traverser.split();
-                    split.path().addLabel(conjunctionTraversal.getParent().asStep().getId());  // so the or() path is no longer taken once returned
-                    conjunctionTraversal.addStart(split);
+                    conjunctionTraversal.addStart(traverser.split());
                 }
             }
         }
@@ -266,6 +263,8 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
     @Override
     protected Iterator<Traverser<Map<String, E>>> computerAlgorithm() throws NoSuchElementException {
         final Traverser.Admin traverser = this.starts.next();
+        if(!traverser.path().hasLabel(this.getId()))
+            traverser.path().addLabel(this.getId()); // so the traverser never returns to this branch ever again
         if (hasMatched(this.conjunction, traverser)) {
             traverser.setStepId(this.getNextStep().getId());
             return IteratorUtils.of(traverser.split(this.getBindings(traverser), this));
@@ -273,14 +272,12 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
 
         if (this.conjunction == Conjunction.AND) {
             final Traversal.Admin<Object, Object> conjunctionTraversal = this.getMatchAlgorithm().apply(traverser); // determine which sub-pattern the traverser should try next
-            traverser.path().addLabel(conjunctionTraversal.getStartStep().getId()); // so the and() path is no longer taken once returned
             traverser.setStepId(conjunctionTraversal.getStartStep().getId()); // go down the traversal match sub-pattern
             return IteratorUtils.of(traverser);
         } else { // OR
-            final List<Traverser<Map<String, E>>> traversers = new ArrayList<>();
+            final List<Traverser<Map<String, E>>> traversers = new ArrayList<>(this.conjunctionTraversals.size());
             this.conjunctionTraversals.forEach(conjunctionTraversal -> {
                 final Traverser.Admin split = traverser.split();
-                split.path().addLabel(conjunctionTraversal.getParent().asStep().getId());  // so the or() path is no longer taken once returned
                 split.setStepId(conjunctionTraversal.getStartStep().getId());
                 traversers.add(split);
             });