Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1652 [created] a5e3c4f33


TINKERPOP-1652 Disable PathRetractionStrategy strategy if VertexProgramStep has 
LABELLED_PATH requirement

If traversal has a VertexProgramStep with a LABELED_PATH, 
PathRetractionStrategy is not run.


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

Branch: refs/heads/TINKERPOP-1652
Commit: a5e3c4f33642043d2f7c7a473cd4024c956d6f28
Parents: 3821792
Author: Ted Wilmes <[email protected]>
Authored: Thu Mar 16 09:23:29 2017 -0500
Committer: Ted Wilmes <[email protected]>
Committed: Thu Mar 16 09:23:29 2017 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../optimization/PathRetractionStrategy.java    |  7 ++-
 .../PathRetractionStrategyTest.java             | 63 +++++++++++++++++++-
 3 files changed, 69 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a5e3c4f3/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index a77991e..a84c27b 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Updated PathRetractionStrategy to not run if the provided traversal contains 
a VertexProgramStep that has a LABELED_PATH requirement.
 * Added various metrics to the `GremlinGroovyScriptEngine` around script 
compilation and exposed them in Gremlin Server.
 * Moved the `caffeine` dependency down to `gremlin-groovy` and out of 
`gremlin-server`.
 * Improved script compilation in `GremlinGroovyScriptEngine to use better 
caching, log long compile times and prevent failed compilations from 
recompiling on future requests.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a5e3c4f3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
index bd27a3e..b690c27 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization;
 
+import 
org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -72,7 +73,11 @@ public final class PathRetractionStrategy extends 
AbstractTraversalStrategy<Trav
     public void apply(final Traversal.Admin<?, ?> traversal) {
         // do not apply this strategy if there are lambdas as you can't 
introspect to know what path information the lambdas are using
         // do not apply this strategy if a PATH requirement step is being used 
(in the future, we can do PATH requirement lookhead to be more intelligent 
about its usage)
-        if (TraversalHelper.anyStepRecursively(step -> step instanceof 
LambdaHolder || step.getRequirements().contains(TraverserRequirement.PATH), 
TraversalHelper.getRootTraversal(traversal)))
+        // do not apply this strategy if a VertexProgramStep is present with 
LABELLED_PATH requirements
+        if (TraversalHelper.anyStepRecursively(step -> step instanceof 
LambdaHolder ||
+                        
step.getRequirements().contains(TraverserRequirement.PATH) ||
+                        (step instanceof VertexProgramStep && 
step.getRequirements().contains(TraverserRequirement.LABELED_PATH)),
+                TraversalHelper.getRootTraversal(traversal)))
             return;
 
         final boolean onGraphComputer = 
TraversalHelper.onGraphComputer(traversal);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a5e3c4f3/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategyTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategyTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategyTest.java
index 2a87f47..69dd0fd 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategyTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategyTest.java
@@ -18,6 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization;
 
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.computer.Memory;
+import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
+import org.apache.tinkerpop.gremlin.process.computer.Messenger;
+import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
 import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
@@ -27,13 +32,17 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.javatuples.Tuple;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -191,6 +200,58 @@ public class PathRetractionStrategyTest {
                 {__.V().as("a").optional(bothE().dedup().as("b")).
                         choose(select("b"), select("a","b"), 
project("a").by(select("a"))),
                         "[[[a, b]], [[a, b]], [[a, b]], [[[a, b]]], [[a, 
b]]]", null},
+                {__.V().as("a").out().select("a").program(new 
MockVertexProgram(
+                        new 
HashSet<>(Arrays.asList(TraverserRequirement.LABELED_PATH)))), "[]", null}
         });
     }
-}
+
+    // do nothing mock vertex program for traverser requirement testing
+    private static class MockVertexProgram implements VertexProgram<Tuple> {
+
+        private final Set<TraverserRequirement> traverserRequirements;
+
+        public MockVertexProgram(final Set<TraverserRequirement> 
traverserRequirements) {
+            this.traverserRequirements = traverserRequirements;
+        }
+
+        @Override
+        public void setup(final Memory memory) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void execute(final Vertex vertex, final Messenger<Tuple> 
messenger, final Memory memory) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Set<TraverserRequirement> getTraverserRequirements() {
+            return traverserRequirements;
+        }
+
+        @Override
+        public boolean terminate(final Memory memory) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Set<MessageScope> getMessageScopes(final Memory memory) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public VertexProgram<Tuple> clone() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public GraphComputer.ResultGraph getPreferredResultGraph() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public GraphComputer.Persist getPreferredPersist() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
\ No newline at end of file

Reply via email to