a better generator for referenced labels in MatchStep related to 
PathRetractionStrategy. One more issue I found is coming up next and then I'm 
moving on from this. CTR.


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

Branch: refs/heads/TINKERPOP-1278
Commit: 4894b67c91517464b798648133fbee3c7c5d6e25
Parents: 402cad1
Author: Marko A. Rodriguez <okramma...@gmail.com>
Authored: Tue Jul 12 10:47:46 2016 -0600
Committer: Marko A. Rodriguez <okramma...@gmail.com>
Committed: Tue Jul 12 11:52:56 2016 -0600

----------------------------------------------------------------------
 .../process/traversal/step/map/MatchStep.java   | 27 +++++++++++---------
 .../structure/TinkerGraphPlayTest.java          | 16 +++++++-----
 2 files changed, 24 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4894b67c/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 768d906..6ac1786 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
@@ -80,7 +80,7 @@ public final class MatchStep<S, E> extends 
ComputerAwareStep<S, Map<String, E>>
     private final String computedStartLabel;
     private MatchAlgorithm matchAlgorithm;
     private Class<? extends MatchAlgorithm> matchAlgorithmClass = 
CountMatchAlgorithm.class; // default is CountMatchAlgorithm (use 
MatchAlgorithmStrategy to change)
-    private final Map<String, Set<String>> referencedLabelsMap = new 
HashMap<>(); // memoization of referenced labels for MatchEndSteps 
(Map<startStepId, referencedLabels>)
+    private Map<String, Set<String>> referencedLabelsMap; // memoization of 
referenced labels for MatchEndSteps (Map<startStepId, referencedLabels>)
 
     private Set<List<Object>> dedups = null;
     private Set<String> dedupLabels = null;
@@ -338,14 +338,18 @@ public final class MatchStep<S, E> extends 
ComputerAwareStep<S, Map<String, E>>
         return false;
     }
 
-    private void generatedReferencedLabelsMap() {
-        for (final Traversal.Admin<?, ?> traversal : this.matchTraversals) {
-            final Set<String> referencedLabels = new HashSet<>();
-            for (final Step<?, ?> step : traversal.getSteps()) {
-                referencedLabels.addAll(PathUtil.getReferencedLabels(step));
+    private Map<String, Set<String>> getReferencedLabelsMap() {
+        if (null == this.referencedLabelsMap) {
+            this.referencedLabelsMap = new HashMap<>();
+            for (final Traversal.Admin<?, ?> traversal : this.matchTraversals) 
{
+                final Set<String> referencedLabels = new HashSet<>();
+                for (final Step<?, ?> step : traversal.getSteps()) {
+                    
referencedLabels.addAll(PathUtil.getReferencedLabels(step));
+                }
+                this.referencedLabelsMap.put(traversal.getStartStep().getId(), 
referencedLabels);
             }
-            this.referencedLabelsMap.put(traversal.getStartStep().getId(), 
referencedLabels);
         }
+        return this.referencedLabelsMap;
     }
 
     private final TraverserSet standardAlgorithmBarrier = new TraverserSet();
@@ -356,7 +360,6 @@ public final class MatchStep<S, E> extends 
ComputerAwareStep<S, Map<String, E>>
 
             if (this.first) {
                 this.first = false;
-                this.generatedReferencedLabelsMap();
                 this.initializeMatchAlgorithm(TraversalEngine.Type.STANDARD);
             } else if (this.standardAlgorithmBarrier.isEmpty()) {
                 for (final Traversal.Admin<?, ?> matchTraversal : 
this.matchTraversals) {
@@ -401,7 +404,6 @@ public final class MatchStep<S, E> extends 
ComputerAwareStep<S, Map<String, E>>
         while (true) {
             if (this.first) {
                 this.first = false;
-                this.generatedReferencedLabelsMap();
                 this.initializeMatchAlgorithm(TraversalEngine.Type.COMPUTER);
             }
             final Traverser.Admin traverser = this.starts.next();
@@ -523,9 +525,10 @@ public final class MatchStep<S, E> extends 
ComputerAwareStep<S, Map<String, E>>
                 return traverser;
             final Set<String> keepers = new 
HashSet<>(this.parent.getKeepLabels());
             final Set<String> tags = traverser.getTags();
-            for (final Traversal.Admin<?, ?> matchTraversal : 
this.parent.matchTraversals) { // get remaining traversal patterns for the 
traverser
-                if (!tags.contains(matchTraversal.getStartStep().getId())) {
-                    
keepers.addAll(this.parent.referencedLabelsMap.get(matchTraversal.getStartStep().getId()));
 // get the reference labels required for those remaining traversals
+            for (final Traversal.Admin<?, ?> matchTraversal : 
this.parent.getGlobalChildren()) { // get remaining traversal patterns for the 
traverser
+                final String startStepId = 
matchTraversal.getStartStep().getId();
+                if (!tags.contains(startStepId)) {
+                    
keepers.addAll(this.parent.getReferencedLabelsMap().get(startStepId)); // get 
the reference labels required for those remaining traversals
                 }
             }
             return PathProcessor.processTraverserPathLabels(traverser, 
keepers); // remove all reference labels that are no longer required

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4894b67c/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git 
a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
 
b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index 7237dfa..3554b34 100644
--- 
a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ 
b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -69,14 +69,16 @@ public class TinkerGraphPlayTest {
         graph.io(GraphMLIo.build()).readGraph("../data/grateful-dead.xml");
         //Graph graph = TinkerFactory.createModern();
 
-        GraphTraversalSource g = 
graph.traversal().withStrategies(PathRetractionStrategy.instance());
-        GraphTraversalSource h = 
graph.traversal().withoutStrategies(PathRetractionStrategy.class);
-
-        for (final GraphTraversalSource source : Arrays.asList(h, g)) {
-            System.out.println(source.V().match(
+        GraphTraversalSource a = 
graph.traversal().withComputer().withStrategies(PathRetractionStrategy.instance());
 // 
.withStrategies(MatchAlgorithmStrategy.build().algorithm(MatchStep.CountMatchAlgorithm.class).create());
+        GraphTraversalSource b = 
graph.traversal().withComputer().withoutStrategies(PathRetractionStrategy.class);
 
//.withStrategies(MatchAlgorithmStrategy.build().algorithm(MatchStep.CountMatchAlgorithm.class).create());
+        GraphTraversalSource c = 
graph.traversal().withStrategies(PathRetractionStrategy.instance()); // 
.withStrategies(MatchAlgorithmStrategy.build().algorithm(MatchStep.CountMatchAlgorithm.class).create());
+        GraphTraversalSource d = 
graph.traversal().withoutStrategies(PathRetractionStrategy.class); 
//.withStrategies(MatchAlgorithmStrategy.build().algorithm(MatchStep.CountMatchAlgorithm.class).create());
+
+        for (final GraphTraversalSource source : Arrays.asList(d, c, b, a)) {
+            System.out.println(source + "--PathRetractionStrategy[" + 
source.getStrategies().toList().contains(PathRetractionStrategy.instance()) + 
"]");
+            System.out.println(TimeUtil.clockWithResult(2, () -> 
source.V().match(
                     __.as("a").out().as("b"),
-                    __.as("b").out().as("c"),
-                    
__.as("c").out().as("d")).select("d").count().profile().next());
+                    __.as("a").both().as("c")).select("a").count().next()));
         }
     }
 

Reply via email to