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
