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