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
