This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2193 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 2ca135ccd116e2dcc054febbebc8f88b2cc01dd0 Author: Stephen Mallette <[email protected]> AuthorDate: Fri Apr 5 21:10:01 2019 -0400 TINKERPOP-2193 Allow a Traversal to know what TraversalSource it spawned from --- CHANGELOG.asciidoc | 1 + .../tinkerpop/gremlin/process/traversal/Traversal.java | 12 ++++++++++++ .../gremlin/process/traversal/util/DefaultTraversal.java | 9 +++++++++ .../tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java | 12 ++++-------- .../sparql/process/traversal/strategy/SparqlStrategy.java | 7 ++++++- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 4aa71a5..517fb34 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima This release also includes changes from <<release-3-3-7, 3.3.7>>. +* Allow a `Traversal` to know what `TraversalSource` it spawned from. [[release-3-4-1]] === TinkerPop 3.4.1 (Release Date: March 18, 2019) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java index 30435ab..a325547 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java @@ -491,8 +491,20 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A */ public boolean isLocked(); + /** + * Gets the {@link Graph} instance associated to this {@link Traversal}. + */ public Optional<Graph> getGraph(); + /** + * Gets the {@link TraversalSource} that spawned the {@link Traversal} instance initially if present. This + * {@link TraversalSource} should have spawned from the associated {@link Graph} returned from + * {@link #getGraph()}. + */ + public default Optional<TraversalSource> getTraversalSource() { + return Optional.empty(); + } + public void setGraph(final Graph graph); public default boolean equals(final Traversal.Admin<S, E> other) { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java index 6e805bc..b869064 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java @@ -53,6 +53,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> { private Step<?, E> finalEndStep = EmptyStep.instance(); private final StepPosition stepPosition = new StepPosition(); protected transient Graph graph; + protected transient TraversalSource g; protected List<Step> steps = new ArrayList<>(); // steps will be repeatedly retrieved from this traversal so wrap them once in an immutable list that can be reused protected List<Step> unmodifiableSteps = Collections.unmodifiableList(steps); @@ -69,6 +70,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> { this.graph = graph; this.strategies = traversalStrategies; this.bytecode = bytecode; + this.g = null; } public DefaultTraversal(final Graph graph) { @@ -77,10 +79,12 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> { public DefaultTraversal(final TraversalSource traversalSource) { this(traversalSource.getGraph(), traversalSource.getStrategies(), traversalSource.getBytecode()); + this.g = traversalSource; } public DefaultTraversal(final TraversalSource traversalSource, final DefaultTraversal.Admin<S,E> traversal) { this(traversalSource.getGraph(), traversalSource.getStrategies(), traversal.getBytecode()); + this.g = traversalSource; steps.addAll(traversal.getSteps()); } @@ -332,6 +336,11 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> { } @Override + public Optional<TraversalSource> getTraversalSource() { + return Optional.ofNullable(this.g); + } + + @Override public void setGraph(final Graph graph) { this.graph = graph; } diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java index 8a454f6..1dbb173 100644 --- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java +++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java @@ -98,15 +98,11 @@ public class SparqlToGremlinCompiler { int traversalIndex = 0; final int numberOfTraversal = traversalList.size(); final int numberOfOptionalTraversal = optionalTraversals.size(); - Traversal arrayOfAllTraversals[] = null; + final Traversal[] arrayOfAllTraversals = (numberOfOptionalTraversal > 0) ? + new Traversal[numberOfTraversal - numberOfOptionalTraversal + 1] : + new Traversal[numberOfTraversal - numberOfOptionalTraversal]; - if (numberOfOptionalTraversal > 0) { - arrayOfAllTraversals = new Traversal[numberOfTraversal - numberOfOptionalTraversal +1]; - } else { - arrayOfAllTraversals = new Traversal[numberOfTraversal - numberOfOptionalTraversal]; - } - - Traversal arrayOfOptionalTraversals[] = new Traversal[numberOfOptionalTraversal]; + final Traversal[] arrayOfOptionalTraversals = new Traversal[numberOfOptionalTraversal]; for (Traversal tempTrav : traversalList) { arrayOfAllTraversals[traversalIndex++] = tempTrav; diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java index 65a042c..7a62e31 100644 --- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java +++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java @@ -21,12 +21,14 @@ package org.apache.tinkerpop.gremlin.sparql.process.traversal.strategy; import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.sparql.SparqlToGremlinCompiler; import org.apache.tinkerpop.gremlin.sparql.process.traversal.dsl.sparql.SparqlTraversalSource; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; import java.util.Collections; @@ -74,8 +76,11 @@ public class SparqlStrategy extends AbstractTraversalStrategy<TraversalStrategy. // further assumes that there is just one argument to that injection which is a string (i.e. sparql query) if (injections.length == 1 && injections[0] instanceof String) { final String sparql = (String) injections[0]; + + // try to grab the TraversalSource from the Traversal, but if it's not there then try to the Graph + // instance and spawn one off from there. final Traversal<Vertex, ?> sparqlTraversal = SparqlToGremlinCompiler.compile( - traversal.getGraph().get(), sparql); + (GraphTraversalSource) traversal.getTraversalSource().orElseGet(() -> traversal.getGraph().map(Graph::traversal).get()), sparql); TraversalHelper.insertTraversal(stepWithSparql, sparqlTraversal.asAdmin(), traversal); traversal.removeStep(stepWithSparql); }
