Repository: tinkerpop
Updated Branches:
  refs/heads/tp32 028cb4737 -> 71d0d913b


Resolved CHANGELOG merge conflict and added missing backtick.


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

Branch: refs/heads/tp32
Commit: d1956eae3d03ee1bd6b35d3e83926b8fc7737f22
Parents: e3e1dca
Author: Ted Wilmes <[email protected]>
Authored: Fri Mar 24 14:37:23 2017 -0500
Committer: Ted Wilmes <[email protected]>
Committed: Fri Mar 24 14:37:23 2017 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  3 ++-
 .../optimization/PathRetractionStrategy.java    |  7 ++++-
 .../PathRetractionStrategyTest.java             | 28 +++++++++++++++++---
 3 files changed, 32 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d1956eae/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index ed26f7a..af41d1f 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -29,9 +29,10 @@ TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET)
 * De-registered metrics on Gremlin Server shutdown.
 * Added "help" command option on `:remote config` for plugins that support 
that feature in the Gremlin Console.
 * Allowed for multiple scripts and related arguments to be passed to 
`gremlin.sh` via `-i` and `-e`.
+* 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.
+* Improved script compilation in `GremlinGroovyScriptEngine` to use better 
caching, log long compile times and prevent failed compilations from 
recompiling on future requests.
 * Script compilation is synchronised.
 * Script compilation times are placed in to logs.
 * Failed scripts will not be recompiled.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d1956eae/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..56f9f66 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 
LABELED_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/d1956eae/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..f42a914 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,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization;
 
+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 +28,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.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.mockito.internal.util.collections.Sets;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -52,6 +57,8 @@ import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.where;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy.MAX_BARRIER_SIZE;
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * @author Ted Wilmes (http://twilmes.org)
@@ -75,6 +82,8 @@ public class PathRetractionStrategyTest {
     @Parameterized.Parameter(value = 2)
     public Traversal.Admin optimized;
 
+    private static final String PATH_RETRACTION_STRATEGY_DISABLED = "[]";
+
     @Test
     public void doTest() {
         for (final TraversalStrategies currentStrategies : this.strategies) {
@@ -114,6 +123,14 @@ public class PathRetractionStrategyTest {
     @Parameterized.Parameters(name = "{0}")
     public static Iterable<Object[]> generateTestParameters() {
 
+        final VertexProgram labeledPathVertexProgram = 
mock(VertexProgram.class);
+        final VertexProgram pathVertexProgram = mock(VertexProgram.class);
+        final VertexProgram emptyRequirementsVertexProgram = 
mock(VertexProgram.class);
+
+        
when(labeledPathVertexProgram.getTraverserRequirements()).thenReturn(Sets.newSet(TraverserRequirement.LABELED_PATH));
+        
when(pathVertexProgram.getTraverserRequirements()).thenReturn(Sets.newSet(TraverserRequirement.PATH));
+        
when(emptyRequirementsVertexProgram.getTraverserRequirements()).thenReturn(Collections.EMPTY_SET);
+
         return Arrays.asList(new Object[][]{
                 {out(), "[]", null},
                 {__.V().as("a").out().as("b").where(neq("a")).out(), "[[]]", 
null},
@@ -126,14 +143,14 @@ public class PathRetractionStrategyTest {
                         as("a").in("created").as("b"),
                         
as("b").in("knows").as("c")).select("c").out("created").where(neq("a")).values("name"),
                         "[[a, c], [a], []]", null},
-                {__.V().as("a").out().select("a").path(), "[]", null},
-                {__.V().as("a").out().select("a").map(t -> t.path().get("a")), 
"[]", null}, // lambda introspection is not possible
+                {__.V().as("a").out().select("a").path(), 
PATH_RETRACTION_STRATEGY_DISABLED, null},
+                {__.V().as("a").out().select("a").map(t -> t.path().get("a")), 
PATH_RETRACTION_STRATEGY_DISABLED, null}, // lambda introspection is not 
possible
                 {__.V().as("a").out().select("a").subgraph("b"), "[[]]", null},
                 {__.V().as("a").out().select("a").subgraph("b").select("a"), 
"[[a], []]", null},
                 {__.V().out().out().match(
                         as("a").in("created").as("b"),
                         
as("b").in("knows").as("c")).select("c").out("created").where(neq("a")).values("name").path(),
-                        "[]", null},
+                        PATH_RETRACTION_STRATEGY_DISABLED, null},
                 
{__.V().out().as("a").where(neq("a")).out().where(neq("a")).out(), "[[a], []]", 
null},
                 
{__.V().out().as("a").where(out().select("a").values("prop").count().is(gte(1))).out().where(neq("a")),
 "[[[a]], []]", null},
                 {__.V().as("a").out().as("b").where(out().select("a", "b", 
"c").values("prop").count().is(gte(1))).out().where(neq("a")).out().select("b"),
@@ -191,6 +208,9 @@ 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().where(neq("a")).program(labeledPathVertexProgram), 
PATH_RETRACTION_STRATEGY_DISABLED, null},
+                
{__.V().as("a").out().where(neq("a")).program(pathVertexProgram).select("a"), 
PATH_RETRACTION_STRATEGY_DISABLED, null},
+                
{__.V().as("a").out().program(emptyRequirementsVertexProgram).select("a"), 
"[[]]", null}
         });
     }
-}
+}
\ No newline at end of file

Reply via email to