You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2019/04/06 01:10:26 UTC
[tinkerpop] 01/01: TINKERPOP-2193 Allow a Traversal to know what
TraversalSource it spawned from
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 <sp...@genoprime.com>
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);
}