You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/06/29 19:20:04 UTC
tinkerpop git commit: committing what I have thus far on the
Translator refactor so I don't lose it. The standard StepTranslator is
working great -- something is hose with the language translators -- really
peculiar case where it only fails at g.V(x) and
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1278 bff3ad1ce -> c7d64d0e7
committing what I have thus far on the Translator refactor so I don't lose it. The standard StepTranslator is working great -- something is hose with the language translators -- really peculiar case where it only fails at g.V(x) and works for all g.V().... anywho...
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c7d64d0e
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c7d64d0e
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c7d64d0e
Branch: refs/heads/TINKERPOP-1278
Commit: c7d64d0e7d61ae7fb4a787a55c89bb0bc93fcd3e
Parents: bff3ad1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 29 13:19:59 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 29 13:19:59 2016 -0600
----------------------------------------------------------------------
.../gremlin/process/traversal/Translator.java | 14 +-
.../process/traversal/TraversalSource.java | 70 ++---
.../process/traversal/TraversalStrategies.java | 11 -
.../process/traversal/TraversalStrategy.java | 6 -
.../traversal/dsl/graph/GraphTraversal.java | 8 +-
.../dsl/graph/GraphTraversalSource.java | 59 ++---
.../traversal/dsl/graph/StepTranslator.java | 255 +++++++++++--------
.../process/traversal/dsl/graph/Symbols.java | 3 +
.../strategy/creation/TranslationStrategy.java | 47 +---
.../util/DefaultTraversalStrategies.java | 25 +-
.../process/traversal/util/EmptyTranslator.java | 15 +-
.../process/traversal/util/ScriptTraversal.java | 2 +-
.../process/traversal/util/TraversalHelper.java | 30 ---
.../java/translator/GroovyTranslator.java | 38 ++-
14 files changed, 245 insertions(+), 338 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
index c7e8b5d..6437cce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Translator.java
@@ -19,24 +19,18 @@
package org.apache.tinkerpop.gremlin.process.traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
-
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface Translator extends Cloneable {
+public interface Translator<T extends Traversal.Admin<?, ?>, S extends TraversalSource> extends Cloneable {
public String getAlias();
- public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments);
+ public T addStep(final T traversal, final String stepName, final Object... arguments);
- public default void addSpawnStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
- addStep(traversal, stepName, arguments);
- }
+ public T addSpawnStep(final S traversalSource, final String stepName, final Object... arguments);
- public default void addSource(final TraversalSource traversalSource, final String sourceName, final Object... arguments) {
- addStep(EmptyTraversal.instance(), sourceName, arguments);
- }
+ public S addSource(final S traversalSource, final String sourceName, final Object... arguments);
public Translator getAnonymousTraversalTranslator();
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
index a5e6196..e314a28 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
@@ -100,21 +100,8 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default TraversalSource withComputer(final Computer computer) {
- Class<? extends GraphComputer> graphComputerClass;
- try {
- graphComputerClass = computer.apply(this.getGraph()).getClass();
- } catch (final Exception e) {
- graphComputerClass = computer.getGraphComputerClass();
- }
- final List<TraversalStrategy<?>> graphComputerStrategies = TraversalStrategies.GlobalCache.getStrategies(graphComputerClass).toList();
- final TraversalStrategy[] traversalStrategies = new TraversalStrategy[graphComputerStrategies.size() + 1];
- traversalStrategies[0] = new VertexProgramStrategy(computer);
- for (int i = 0; i < graphComputerStrategies.size(); i++) {
- traversalStrategies[i + 1] = graphComputerStrategies.get(i);
- }
- final TraversalSource clone = this.withStrategies(traversalStrategies);
- this.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withComputer, computer);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withComputer, computer);
+
}
/**
@@ -124,7 +111,10 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default TraversalSource withTranslator(final Translator translator) {
- return this.withStrategies(new TranslationStrategy(translator, this.clone(), null));
+ final TraversalSource clone = this.clone();
+ clone.getStrategies().addStrategies(new TranslationStrategy(clone, null));
+ clone.getStrategies().setTranslator(translator);
+ return clone;
}
/**
@@ -158,9 +148,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSideEffect(final String key, final Supplier<A> initialValue, final BinaryOperator<A> reducer) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue, reducer);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSideEffect, key, initialValue, reducer);
}
/**
@@ -173,9 +161,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSideEffect(final String key, final A initialValue, final BinaryOperator<A> reducer) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue, reducer);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSideEffect, key, initialValue, reducer);
}
/**
@@ -187,9 +173,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSideEffect(final String key, final Supplier<A> initialValue) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSideEffect, key, initialValue);
}
/**
@@ -201,9 +185,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSideEffect(final String key, final A initialValue) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSideEffect, key, initialValue);
}
/**
@@ -216,9 +198,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator, mergeOperator);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue, splitOperator, mergeOperator);
}
/**
@@ -231,9 +211,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator, mergeOperator);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue, splitOperator, mergeOperator);
}
/**
@@ -244,9 +222,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final A initialValue) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue);
}
/**
@@ -257,9 +233,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final Supplier<A> initialValue) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue);
}
/**
@@ -271,9 +245,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue, splitOperator);
}
/**
@@ -285,9 +257,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue, splitOperator);
}
/**
@@ -299,9 +269,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, mergeOperator);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue, mergeOperator);
}
/**
@@ -313,9 +281,7 @@ public interface TraversalSource extends Cloneable {
* @return a new traversal source with updated strategies
*/
public default <A> TraversalSource withSack(final A initialValue, final BinaryOperator<A> mergeOperator) {
- final TraversalSource clone = this.clone();
- clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, mergeOperator);
- return clone;
+ return this.getStrategies().getTranslator().addSource(this, TraversalSourceSymbols.withSack, initialValue, mergeOperator);
}
/**
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
index 65beee1..8436291 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -66,17 +66,6 @@ public interface TraversalStrategies extends Serializable, Cloneable {
public List<TraversalStrategy<?>> toList();
/**
- * Return all the {@link TraversalStrategy} instances associated with this {@link TraversalStrategies} and within a particular strategy class.
- *
- * @param traversalStrategyClass the strategy class to get the strategies for
- * @param <T> the strategy class type
- * @return a sorted list of strategies within the respective strategy class
- */
- public default <T extends TraversalStrategy> List<T> getStrategies(final Class<T> traversalStrategyClass) {
- return (List<T>) toList().stream().filter(s -> traversalStrategyClass.isAssignableFrom(s.getClass())).collect(Collectors.toList());
- }
-
- /**
* Return the {@link TraversalStrategy} instance associated with the provided class.
*
* @param traversalStrategyClass the class of the strategy to get
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
index f7f460f..2bd7978 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
@@ -107,12 +107,6 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ
else
return 0;
}
-
- public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments);
-
- public void addSpawnStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments);
-
- public void addSource(final TraversalSource traversalSource, final String withName, final Object... arguments);
}
/**
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index b6e3f21..f670f8c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -1097,10 +1097,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
* @param keyValues any meta properties to be assigned to this property
*/
public default GraphTraversal<S, E> property(final VertexProperty.Cardinality cardinality, final Object key, final Object value, final Object... keyValues) {
- if (null == cardinality)
- TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key, value, keyValues);
- else
- TraversalHelper.addStepToCreationStrategies(this.asAdmin(), cardinality, key, value, keyValues);
+ //if (null == cardinality)
+ // TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key, value, keyValues);
+ //else
+ // TraversalHelper.addStepToCreationStrategies(this.asAdmin(), cardinality, key, value, keyValues);
// if it can be detected that this call to property() is related to an addV/E() then we can attempt to fold
// the properties into that step to gain an optimization for those graphs that support such capabilities.
if ((this.asAdmin().getEndStep() instanceof AddVertexStep || this.asAdmin().getEndStep() instanceof AddEdgeStep
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
index 62d9758..f5cdc64 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -27,13 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.creation.TranslationStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.RequirementsStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -69,12 +63,6 @@ public class GraphTraversalSource implements TraversalSource {
this(graph, TraversalStrategies.GlobalCache.getStrategies(graph.getClass()));
}
- private <S> GraphTraversal.Admin<S, S> generateTraversal() {
- final GraphTraversal.Admin<S, S> traversal = new DefaultGraphTraversal<>(this.graph);
- traversal.setStrategies(this.strategies);
- return traversal;
- }
-
@Override
public TraversalStrategies getStrategies() {
return this.strategies;
@@ -100,7 +88,10 @@ public class GraphTraversalSource implements TraversalSource {
@Override
public GraphTraversalSource withTranslator(final Translator translator) {
- return this.withStrategies(new TranslationStrategy(translator, this.clone(), __.class));
+ final GraphTraversalSource clone = this.clone();
+ clone.getStrategies().addStrategies(new TranslationStrategy(clone, __.class));
+ clone.getStrategies().setTranslator(translator);
+ return clone;
}
@Override
@@ -190,21 +181,11 @@ public class GraphTraversalSource implements TraversalSource {
}
public GraphTraversalSource withBulk(final boolean useBulk) {
- if (!useBulk) {
- final GraphTraversalSource clone = this.clone();
- RequirementsStrategy.addRequirements(clone.strategies, TraverserRequirement.ONE_BULK);
- TraversalHelper.addSourceToCreationStrategies(clone, useBulk);
- return clone;
- } else {
- return this;
- }
+ return (GraphTraversalSource) this.strategies.getTranslator().addSource(this, Symbols.withBulk, useBulk);
}
public GraphTraversalSource withPath() {
- final GraphTraversalSource clone = this.clone();
- RequirementsStrategy.addRequirements(clone.strategies, TraverserRequirement.PATH);
- TraversalHelper.addSourceToCreationStrategies(clone);
- return clone;
+ return (GraphTraversalSource) this.strategies.getTranslator().addSource(this, Symbols.withPath);
}
//// SPAWNS
@@ -214,41 +195,31 @@ public class GraphTraversalSource implements TraversalSource {
*/
@Deprecated
public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
- final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal();
- TraversalHelper.addSpawnStepToCreationStrategies(traversal, keyValues);
- traversal.addStep(new AddVertexStartStep(traversal, null));
- ((AddVertexStartStep) traversal.getEndStep()).addPropertyMutations(keyValues);
+ final GraphTraversal<Vertex, Vertex> traversal = this.addV();
+ for (int i = 0; i < keyValues.length; i = i + 2) {
+ traversal.property(keyValues[i], keyValues[i + 1]);
+ }
return traversal;
}
public GraphTraversal<Vertex, Vertex> addV(final String label) {
- final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal();
- TraversalHelper.addSpawnStepToCreationStrategies(traversal, label);
- return traversal.addStep(new AddVertexStartStep(traversal, label));
+ return (GraphTraversal) this.strategies.getTranslator().addSpawnStep(this, Symbols.addV, label);
}
public GraphTraversal<Vertex, Vertex> addV() {
- final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal();
- TraversalHelper.addSpawnStepToCreationStrategies(traversal);
- return traversal.addStep(new AddVertexStartStep(traversal, null));
+ return (GraphTraversal) this.strategies.getTranslator().addSpawnStep(this, Symbols.addV);
}
public <S> GraphTraversal<S, S> inject(S... starts) {
- final GraphTraversal.Admin<S, S> traversal = this.generateTraversal();
- TraversalHelper.addSpawnStepToCreationStrategies(traversal, starts);
- return traversal.addStep(new InjectStep<>(traversal, starts));
+ return (GraphTraversal) this.strategies.getTranslator().addSpawnStep(this, Symbols.inject, starts);
}
public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
- final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal();
- this.strategies.getTranslator().addSpawnStep(traversal, Symbols.V, vertexIds);
- return traversal;
+ return (GraphTraversal) this.strategies.getTranslator().addSpawnStep(this, Symbols.V, vertexIds);
}
public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
- final GraphTraversal.Admin<Edge, Edge> traversal = this.generateTraversal();
- this.strategies.getTranslator().addSpawnStep(traversal, Symbols.E, edgesIds);
- return traversal;
+ return (GraphTraversal) this.strategies.getTranslator().addSpawnStep(this, Symbols.E, edgesIds);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java
index 140bf10..311dc3c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java
@@ -19,17 +19,21 @@
package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
+import org.apache.tinkerpop.gremlin.process.computer.Computer;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PageRankVertexProgramStep;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PeerPressureVertexProgramStep;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ProgramVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Pop;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Translator;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.TraversalSourceSymbols;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ColumnTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.FunctionTraverser;
@@ -64,6 +68,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilte
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantStep;
@@ -129,8 +134,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphSt
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TraversalSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.RequirementsStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SackStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SideEffectStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Column;
import org.apache.tinkerpop.gremlin.structure.Direction;
@@ -142,6 +149,7 @@ import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
@@ -154,7 +162,7 @@ import java.util.function.UnaryOperator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class StepTranslator implements Translator {
+public final class StepTranslator implements Translator<GraphTraversal.Admin<?, ?>, GraphTraversalSource> {
@Override
public String getAlias() {
@@ -162,80 +170,107 @@ public final class StepTranslator implements Translator {
}
@Override
- public void addSource(final TraversalSource traversalSource, final String sourceName, final Object... arguments) {
+ public GraphTraversalSource addSource(final GraphTraversalSource traversalSource, final String sourceName, final Object... arguments) {
+ final GraphTraversalSource clone = traversalSource.clone();
switch (sourceName) {
+ case TraversalSourceSymbols.withComputer:
+ Class<? extends GraphComputer> graphComputerClass;
+ try {
+ graphComputerClass = ((Computer) arguments[0]).apply(clone.getGraph()).getClass();
+ } catch (final Exception e) {
+ graphComputerClass = ((Computer) arguments[0]).getGraphComputerClass();
+ }
+ final List<TraversalStrategy<?>> graphComputerStrategies = TraversalStrategies.GlobalCache.getStrategies(graphComputerClass).toList();
+ final TraversalStrategy[] traversalStrategies = new TraversalStrategy[graphComputerStrategies.size() + 1];
+ traversalStrategies[0] = new VertexProgramStrategy(((Computer) arguments[0]));
+ for (int i = 0; i < graphComputerStrategies.size(); i++) {
+ traversalStrategies[i + 1] = graphComputerStrategies.get(i);
+ }
+ clone.getStrategies().addStrategies(traversalStrategies);
+ return clone;
+ case Symbols.withPath:
+ RequirementsStrategy.addRequirements(clone.strategies, TraverserRequirement.PATH);
+ return clone;
+ case Symbols.withBulk:
+ if (1 == arguments.length && !((boolean) arguments[0]))
+ RequirementsStrategy.addRequirements(clone.strategies, TraverserRequirement.ONE_BULK);
+ return clone;
case TraversalSourceSymbols.withSideEffect:
- SideEffectStrategy.addSideEffect(traversalSource.getStrategies(), (String) arguments[0],
+ SideEffectStrategy.addSideEffect(clone.getStrategies(), (String) arguments[0],
arguments[1] instanceof Supplier ? (Supplier) arguments[1] : new ConstantSupplier<>(arguments[1]), 2 == arguments.length ? null : (BinaryOperator) arguments[2]);
- return;
+ return clone;
case TraversalSourceSymbols.withSack:
if (1 == arguments.length) {
- traversalSource.getStrategies().addStrategies(SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
+ clone.getStrategies().addStrategies(SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
(Supplier) arguments[0] :
new ConstantSupplier<>(arguments[0])).create());
} else if (2 == arguments.length) {
if (arguments[1] instanceof UnaryOperator)
- traversalSource.getStrategies().addStrategies(SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
+ clone.getStrategies().addStrategies(SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
(Supplier) arguments[0] :
new ConstantSupplier<>(arguments[0])).splitOperator((UnaryOperator) arguments[1]).create());
else
- traversalSource.getStrategies().addStrategies((SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
+ clone.getStrategies().addStrategies((SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
(Supplier) arguments[0] :
new ConstantSupplier<>(arguments[0])).mergeOperator((BinaryOperator) arguments[1]).create()));
} else {
- traversalSource.getStrategies().addStrategies(SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
+ clone.getStrategies().addStrategies(SackStrategy.build().initialValue(arguments[0] instanceof Supplier ?
(Supplier) arguments[0] :
new ConstantSupplier<>(arguments[0])).splitOperator((UnaryOperator) arguments[1]).mergeOperator((BinaryOperator) arguments[2]).create());
}
- return;
+ return clone;
default:
throw new IllegalArgumentException("The provided step name is not supported by " + StepTranslator.class.getSimpleName() + ": " + sourceName);
}
}
- @Override
- public void addSpawnStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+ public GraphTraversal.Admin<?, ?> addSpawnStep(final GraphTraversalSource traversalSource, final String stepName, final Object... arguments) {
+ final GraphTraversal.Admin<?, ?> traversal = new DefaultGraphTraversal<>(traversalSource.getGraph());
+ traversal.setStrategies(traversalSource.getStrategies().clone());
+ ///
switch (stepName) {
+ case Symbols.addV:
+ return traversal.addStep(new AddVertexStartStep(traversal, 0 == arguments.length ? null : (String) arguments[0]));
+ case Symbols.inject:
+ return traversal.addStep(new InjectStep<>(traversal, arguments));
case Symbols.V:
- traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, arguments));
- return;
+ return traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, arguments));
case Symbols.E:
- traversal.addStep(new GraphStep<>(traversal, Edge.class, true, arguments));
- return;
+ return traversal.addStep(new GraphStep<>(traversal, Edge.class, true, arguments));
default:
throw new IllegalArgumentException("The provided step name is not supported by " + StepTranslator.class.getSimpleName() + ": " + stepName);
}
}
@Override
- public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+ public GraphTraversal.Admin<?, ?> addStep(final GraphTraversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
switch (stepName) {
case Symbols.map:
traversal.addStep(arguments[0] instanceof Traversal ?
new TraversalMapStep<>(traversal, (Traversal) arguments[0]) :
new LambdaMapStep<>(traversal, (Function) arguments[0]));
- return;
+ return traversal;
case Symbols.flatMap:
traversal.addStep(arguments[0] instanceof Traversal ?
new TraversalFlatMapStep<>(traversal, (Traversal) arguments[0]) :
new LambdaFlatMapStep<>(traversal, (Function) arguments[0]));
- return;
+ return traversal;
case Symbols.id:
traversal.addStep(new IdStep<>(traversal));
- return;
+ return traversal;
case Symbols.label:
traversal.addStep(new LabelStep<>(traversal));
- return;
+ return traversal;
case Symbols.identity:
traversal.addStep(new IdentityStep<>(traversal));
- return;
+ return traversal;
case Symbols.constant:
traversal.addStep(new ConstantStep<>(traversal, arguments[0]));
- return;
+ return traversal;
case Symbols.V:
traversal.addStep(new GraphStep<>(traversal, Vertex.class, false, arguments));
- return;
+ return traversal;
case Symbols.to:
if (1 == arguments.length)
((AddEdgeStep) traversal.getEndStep()).addTo(arguments[0] instanceof Vertex ?
@@ -243,64 +278,64 @@ public final class StepTranslator implements Translator {
__.select((String) arguments[0]));
else
traversal.addStep(new VertexStep<>(traversal, Vertex.class, (Direction) arguments[0], (String[]) arguments[1]));
- return;
+ return traversal;
case Symbols.out:
traversal.addStep(new VertexStep<>(traversal, Vertex.class, Direction.OUT, (String[]) arguments));
- return;
+ return traversal;
case Symbols.in:
traversal.addStep(new VertexStep<>(traversal, Vertex.class, Direction.IN, (String[]) arguments));
- return;
+ return traversal;
case Symbols.both:
traversal.addStep(new VertexStep<>(traversal, Vertex.class, Direction.BOTH, (String[]) arguments));
- return;
+ return traversal;
case Symbols.toE:
traversal.addStep(new VertexStep<>(traversal, Edge.class, (Direction) arguments[0], (String[]) arguments[1]));
- return;
+ return traversal;
case Symbols.outE:
traversal.addStep(new VertexStep<>(traversal, Edge.class, Direction.OUT, (String[]) arguments));
- return;
+ return traversal;
case Symbols.inE:
traversal.addStep(new VertexStep<>(traversal, Edge.class, Direction.IN, (String[]) arguments));
- return;
+ return traversal;
case Symbols.bothE:
traversal.addStep(new VertexStep<>(traversal, Edge.class, Direction.BOTH, (String[]) arguments));
- return;
+ return traversal;
case Symbols.toV:
traversal.addStep(new EdgeVertexStep(traversal, (Direction) arguments[0]));
- return;
+ return traversal;
case Symbols.outV:
traversal.addStep(new EdgeVertexStep(traversal, Direction.OUT));
- return;
+ return traversal;
case Symbols.inV:
traversal.addStep(new EdgeVertexStep(traversal, Direction.IN));
- return;
+ return traversal;
case Symbols.bothV:
traversal.addStep(new EdgeVertexStep(traversal, Direction.BOTH));
- return;
+ return traversal;
case Symbols.otherV:
traversal.addStep(new EdgeOtherVertexStep(traversal));
- return;
+ return traversal;
case Symbols.order:
traversal.addStep(arguments.length == 0 || Scope.global == arguments[0] ?
new OrderGlobalStep<>(traversal) :
new OrderLocalStep<>(traversal));
- return;
+ return traversal;
case Symbols.properties:
traversal.addStep(new PropertiesStep<>(traversal, PropertyType.PROPERTY, (String[]) arguments));
- return;
+ return traversal;
case Symbols.values:
traversal.addStep(new PropertiesStep<>(traversal, PropertyType.VALUE, (String[]) arguments));
- return;
+ return traversal;
case Symbols.propertyMap:
traversal.addStep(0 != arguments.length && arguments[0] instanceof Boolean ?
new PropertyMapStep<>(traversal, (boolean) arguments[0], PropertyType.PROPERTY, (String[]) arguments[1]) :
new PropertyMapStep<>(traversal, false, PropertyType.PROPERTY, (String[]) arguments));
- return;
+ return traversal;
case Symbols.valueMap:
traversal.addStep(0 != arguments.length && arguments[0] instanceof Boolean ?
new PropertyMapStep<>(traversal, (boolean) arguments[0], PropertyType.VALUE, (String[]) arguments[1]) :
new PropertyMapStep<>(traversal, false, PropertyType.VALUE, (String[]) arguments));
- return;
+ return traversal;
case Symbols.select:
if (arguments[0] instanceof Column)
traversal.addStep(new TraversalMapStep<>(traversal, new ColumnTraversal((Column) arguments[0])));
@@ -325,19 +360,19 @@ public final class StepTranslator implements Translator {
traversal.addStep(new SelectStep<>(traversal, null, selectKeys));
}
}
- return;
+ return traversal;
case Symbols.key:
traversal.addStep(new PropertyKeyStep(traversal));
- return;
+ return traversal;
case Symbols.value:
traversal.addStep(new PropertyValueStep<>(traversal));
- return;
+ return traversal;
case Symbols.path:
traversal.addStep(new PathStep<>(traversal));
- return;
+ return traversal;
case Symbols.match:
traversal.addStep(new MatchStep<>(traversal, ConnectiveStep.Connective.AND, (Traversal[]) arguments));
- return;
+ return traversal;
case Symbols.sack:
if (0 == arguments.length)
traversal.addStep(new SackStep<>(traversal));
@@ -347,71 +382,71 @@ public final class StepTranslator implements Translator {
sackValueStep.modulateBy((String) arguments[1]);
traversal.addStep(sackValueStep);
}
- return;
+ return traversal;
case Symbols.loops:
traversal.addStep(new LoopsStep<>(traversal));
- return;
+ return traversal;
case Symbols.project:
final String[] projectKeys = new String[((String[]) arguments[1]).length + 1];
projectKeys[0] = (String) arguments[0];
System.arraycopy((arguments[1]), 0, projectKeys, 1, ((String[]) arguments[1]).length);
traversal.addStep(new ProjectStep<>(traversal, projectKeys));
- return;
+ return traversal;
case Symbols.unfold:
traversal.addStep(new UnfoldStep<>(traversal));
- return;
+ return traversal;
case Symbols.fold:
traversal.addStep(0 == arguments.length ?
new FoldStep<>(traversal) :
new FoldStep<>(traversal, arguments[0] instanceof Supplier ?
(Supplier) arguments[0] :
new ConstantSupplier(arguments[0]), (BiFunction) arguments[1]));
- return;
+ return traversal;
case Symbols.count:
traversal.addStep(0 == arguments.length || Scope.global == arguments[0] ?
new CountGlobalStep<>(traversal) :
new CountLocalStep<>(traversal));
- return;
+ return traversal;
case Symbols.sum:
traversal.addStep(0 == arguments.length || Scope.global == arguments[0] ?
new SumGlobalStep<>(traversal) :
new SumLocalStep<>(traversal));
- return;
+ return traversal;
case Symbols.max:
traversal.addStep(0 == arguments.length || Scope.global == arguments[0] ?
new MaxGlobalStep<>(traversal) :
new MaxLocalStep<>(traversal));
- return;
+ return traversal;
case Symbols.min:
traversal.addStep(0 == arguments.length || Scope.global == arguments[0] ?
new MinGlobalStep<>(traversal) :
new MinLocalStep<>(traversal));
- return;
+ return traversal;
case Symbols.mean:
traversal.addStep(0 == arguments.length || Scope.global == arguments[0] ?
new MeanGlobalStep<>(traversal) :
new MeanLocalStep<>(traversal));
- return;
+ return traversal;
case Symbols.group:
traversal.addStep(0 == arguments.length ?
new GroupStep<>(traversal) :
new GroupSideEffectStep<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.groupV3d0:
traversal.addStep(0 == arguments.length ?
new GroupStepV3d0<>(traversal) :
new GroupSideEffectStepV3d0<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.groupCount:
traversal.addStep(0 == arguments.length ?
new GroupCountStep<>(traversal) :
new GroupCountSideEffectStep<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.tree:
traversal.addStep(0 == arguments.length ?
new TreeStep<>(traversal) :
new TreeSideEffectStep<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.addV:
traversal.addStep(1 == arguments.length ?
new AddVertexStep<>(traversal, (String) arguments[0]) :
@@ -421,30 +456,30 @@ public final class StepTranslator implements Translator {
traversal.addStep(new AddPropertyStep<>(traversal, null, arguments[i], arguments[i + 1]));
}
}
- return;
+ return traversal;
case Symbols.addE:
if (1 == arguments.length)
traversal.addStep(new AddEdgeStep<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.from:
((AddEdgeStep) traversal.getEndStep()).addFrom(arguments[0] instanceof Vertex ?
(Vertex) arguments[0] :
__.select((String) arguments[0]));
- return;
+ return traversal;
case Symbols.filter:
traversal.addStep(arguments[0] instanceof Traversal ?
new TraversalFilterStep<>(traversal, (Traversal) arguments[0]) :
new LambdaFilterStep<>(traversal, (Predicate) arguments[0]));
- return;
+ return traversal;
case Symbols.or:
traversal.addStep(new OrStep<>(traversal, (Traversal[]) arguments));
- return;
+ return traversal;
case Symbols.and:
traversal.addStep(new AndStep<>(traversal, (Traversal[]) arguments));
- return;
+ return traversal;
case Symbols.inject:
traversal.addStep(new InjectStep<>(traversal, arguments));
- return;
+ return traversal;
case Symbols.dedup:
if (0 == arguments.length)
traversal.addStep(new DedupGlobalStep<>(traversal));
@@ -455,7 +490,7 @@ public final class StepTranslator implements Translator {
new DedupGlobalStep<>(traversal, (String[]) arguments[1]) :
new DedupLocalStep<>(traversal));
}
- return;
+ return traversal;
case Symbols.where:
traversal.addStep(arguments[0] instanceof Traversal.Admin ?
TraversalHelper.getVariableLocations((Traversal.Admin) arguments[0]).isEmpty() ?
@@ -464,7 +499,7 @@ public final class StepTranslator implements Translator {
arguments[0] instanceof String ?
new WherePredicateStep<>(traversal, Optional.of((String) arguments[0]), (P) arguments[1]) :
new WherePredicateStep<>(traversal, Optional.empty(), (P) arguments[0]));
- return;
+ return traversal;
case Symbols.has:
if (1 == arguments.length) {
traversal.addStep(new TraversalFilterStep<>(traversal, __.values((String) arguments[0])));
@@ -487,38 +522,38 @@ public final class StepTranslator implements Translator {
(P) arguments[2] :
P.eq(arguments[2]))));
}
- return;
+ return traversal;
case Symbols.hasNot:
traversal.addStep(new NotStep<>(traversal, __.values((String) arguments[0])));
- return;
+ return traversal;
case Symbols.hasLabel:
traversal.addStep(new HasStep<>(traversal, 0 == arguments.length ?
HasContainer.makeHasContainers(T.label.getAccessor(), P.eq(arguments[0])) :
HasContainer.makeHasContainers(T.label.getAccessor(), P.within(arguments))));
- return;
+ return traversal;
case Symbols.hasId:
traversal.addStep(new HasStep<>(traversal, 0 == arguments.length ?
HasContainer.makeHasContainers(T.id.getAccessor(), P.eq(arguments[0])) :
HasContainer.makeHasContainers(T.id.getAccessor(), P.within(arguments))));
- return;
+ return traversal;
case Symbols.hasKey:
traversal.addStep(new HasStep<>(traversal, 0 == arguments.length ?
HasContainer.makeHasContainers(T.key.getAccessor(), P.eq(arguments[0])) :
HasContainer.makeHasContainers(T.key.getAccessor(), P.within(arguments))));
- return;
+ return traversal;
case Symbols.hasValue:
traversal.addStep(new HasStep<>(traversal, 0 == arguments.length ?
HasContainer.makeHasContainers(T.value.getAccessor(), P.eq(arguments[0])) :
HasContainer.makeHasContainers(T.value.getAccessor(), P.within(arguments))));
- return;
+ return traversal;
case Symbols.is:
traversal.addStep(new IsStep<>(traversal, arguments[0] instanceof P ?
(P) arguments[0] :
P.eq(arguments[0])));
- return;
+ return traversal;
case Symbols.not:
traversal.addStep(new NotStep<>(traversal, (Traversal) arguments[0]));
- return;
+ return traversal;
case Symbols.range:
if (2 == arguments.length)
traversal.addStep(new RangeGlobalStep<>(traversal, (long) arguments[0], (long) arguments[1]));
@@ -526,7 +561,7 @@ public final class StepTranslator implements Translator {
traversal.addStep(Scope.global == arguments[0] ?
new RangeGlobalStep<>(traversal, (long) arguments[1], (long) arguments[2]) :
new RangeLocalStep<>(traversal, (long) arguments[1], (long) arguments[2]));
- return;
+ return traversal;
case Symbols.limit:
if (1 == arguments.length)
traversal.addStep(new RangeGlobalStep<>(traversal, 0, (long) arguments[0]));
@@ -534,7 +569,7 @@ public final class StepTranslator implements Translator {
traversal.addStep(Scope.global == arguments[0] ?
new RangeGlobalStep<>(traversal, 0, (long) arguments[1]) :
new RangeLocalStep<>(traversal, 0, (long) arguments[1]));
- return;
+ return traversal;
case Symbols.tail:
if (0 == arguments.length)
traversal.addStep(new TailGlobalStep<>(traversal, 1L));
@@ -548,19 +583,19 @@ public final class StepTranslator implements Translator {
traversal.addStep(Scope.global == arguments[0] ?
new TailGlobalStep<>(traversal, (long) arguments[1]) :
new TailLocalStep<>(traversal, (long) arguments[1]));
- return;
+ return traversal;
case Symbols.coin:
traversal.addStep(new CoinStep<>(traversal, (double) arguments[0]));
- return;
+ return traversal;
case Symbols.timeLimit:
traversal.addStep(new TimeLimitStep<>(traversal, (long) arguments[0]));
- return;
+ return traversal;
case Symbols.simplePath:
traversal.addStep(new SimplePathStep<>(traversal));
- return;
+ return traversal;
case Symbols.cyclicPath:
traversal.addStep(new CyclicPathStep<>(traversal));
- return;
+ return traversal;
case Symbols.sample:
if (1 == arguments.length)
traversal.addStep(new SampleGlobalStep<>(traversal, (int) arguments[0]));
@@ -568,43 +603,43 @@ public final class StepTranslator implements Translator {
traversal.addStep(Scope.global == arguments[0] ?
new SampleGlobalStep<>(traversal, (int) arguments[1]) :
new SampleLocalStep<>(traversal, (int) arguments[1]));
- return;
+ return traversal;
case Symbols.drop:
traversal.addStep(new DropStep<>(traversal));
- return;
+ return traversal;
case Symbols.sideEffect:
traversal.addStep(arguments[0] instanceof Traversal ?
new TraversalSideEffectStep<>(traversal, (Traversal) arguments[0]) :
new LambdaSideEffectStep<>(traversal, (Consumer) arguments[0]));
- return;
+ return traversal;
case Symbols.cap:
traversal.addStep(1 == arguments.length ?
new SideEffectCapStep<>(traversal, (String) arguments[0]) :
new SideEffectCapStep<>(traversal, (String) arguments[0], (String[]) arguments[1]));
- return;
+ return traversal;
case Symbols.aggregate:
traversal.addStep(new AggregateStep<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.store:
traversal.addStep(new StoreStep<>(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.subgraph:
traversal.addStep(new SubgraphStep(traversal, (String) arguments[0]));
- return;
+ return traversal;
case Symbols.profile:
traversal.addStep(new ProfileSideEffectStep<>(traversal, 0 == arguments.length ?
ProfileSideEffectStep.DEFAULT_METRICS_KEY :
(String) arguments[0]));
if (0 == arguments.length)
traversal.addStep(new SideEffectCapStep<>(traversal, ProfileSideEffectStep.DEFAULT_METRICS_KEY));
- return;
+ return traversal;
case Symbols.branch:
final BranchStep branchStep = new BranchStep<>(traversal);
branchStep.setBranchTraversal(arguments[0] instanceof Traversal.Admin ?
(Traversal.Admin) arguments[0] :
__.map((Function) arguments[0]).asAdmin());
traversal.addStep(branchStep);
- return;
+ return traversal;
case Symbols.choose:
if (1 == arguments.length)
traversal.addStep(new ChooseStep<>(traversal, arguments[0] instanceof Traversal.Admin ?
@@ -616,19 +651,19 @@ public final class StepTranslator implements Translator {
(Traversal.Admin) arguments[0] :
__.filter(new PredicateTraverser<>((Predicate) arguments[0])).asAdmin(),
(Traversal.Admin) arguments[1], (Traversal.Admin) arguments[2]));
- return;
+ return traversal;
case Symbols.optional:
traversal.addStep(new ChooseStep<>(traversal, (Traversal.Admin) arguments[0], ((Traversal.Admin) arguments[0]).clone(), __.identity().asAdmin()));
- return;
+ return traversal;
case Symbols.union:
traversal.addStep(new UnionStep<>(traversal, Arrays.copyOf(arguments, arguments.length, Traversal.Admin[].class)));
- return;
+ return traversal;
case Symbols.coalesce:
traversal.addStep(new CoalesceStep<>(traversal, Arrays.copyOf(arguments, arguments.length, Traversal.Admin[].class)));
- return;
+ return traversal;
case Symbols.repeat:
RepeatStep.addRepeatToTraversal(traversal, (Traversal.Admin) arguments[0]);
- return;
+ return traversal;
case Symbols.emit:
if (0 == arguments.length)
RepeatStep.addEmitToTraversal(traversal, TrueTraversal.instance());
@@ -636,38 +671,38 @@ public final class StepTranslator implements Translator {
RepeatStep.addEmitToTraversal(traversal, (Traversal.Admin) arguments[0]);
else
RepeatStep.addEmitToTraversal(traversal, __.filter((Predicate) arguments[0]).asAdmin());
- return;
+ return traversal;
case Symbols.until:
if (arguments[0] instanceof Traversal.Admin)
RepeatStep.addUntilToTraversal(traversal, (Traversal.Admin) arguments[0]);
else
RepeatStep.addUntilToTraversal(traversal, __.filter((Predicate) arguments[0]).asAdmin());
- return;
+ return traversal;
case Symbols.times:
if (traversal.getEndStep() instanceof TimesModulating)
((TimesModulating) traversal.getEndStep()).modulateTimes((int) arguments[0]);
else
RepeatStep.addUntilToTraversal(traversal, new LoopTraversal<>((int) arguments[0]));
- return;
+ return traversal;
case Symbols.barrier:
traversal.addStep(0 == arguments.length ?
new NoOpBarrierStep<>(traversal) :
arguments[0] instanceof Consumer ?
new LambdaCollectingBarrierStep<>(traversal, (Consumer) arguments[0], Integer.MAX_VALUE) :
new NoOpBarrierStep<>(traversal, (int) arguments[0]));
- return;
+ return traversal;
case Symbols.local:
traversal.addStep(new LocalStep<>(traversal, (Traversal.Admin) arguments[0]));
- return;
+ return traversal;
case Symbols.pageRank:
traversal.addStep(new PageRankVertexProgramStep(traversal, 0 == arguments.length ? 0.85d : (double) arguments[0]));
- return;
+ return traversal;
case Symbols.peerPressure:
traversal.addStep(new PeerPressureVertexProgramStep(traversal));
- return;
+ return traversal;
case Symbols.program:
traversal.addStep(new ProgramVertexProgramStep(traversal, (VertexProgram) arguments[0]));
- return;
+ return traversal;
case Symbols.by:
if (0 == arguments.length)
((ByModulating) traversal.getEndStep()).modulateBy();
@@ -695,7 +730,7 @@ public final class StepTranslator implements Translator {
((ByModulating) traversal.getEndStep()).modulateBy((Function) arguments[0], (Comparator) arguments[1]);
}
- return;
+ return traversal;
case Symbols.as:
if (traversal.getSteps().isEmpty())
traversal.addStep(new StartStep<>(traversal));
@@ -706,13 +741,13 @@ public final class StepTranslator implements Translator {
traversal.getEndStep().addLabel(otherLabels[i]);
}
}
- return;
+ return traversal;
case Symbols.option:
if (1 == arguments.length)
((TraversalOptionParent) traversal.getEndStep()).addGlobalChildOption(TraversalOptionParent.Pick.any, (Traversal.Admin) arguments[0]);
else
((TraversalOptionParent) traversal.getEndStep()).addGlobalChildOption(arguments[0], (Traversal.Admin) arguments[1]);
- return;
+ return traversal;
default:
throw new IllegalArgumentException("The provided step name is not supported by " + StepTranslator.class.getSimpleName() + ": " + stepName);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/Symbols.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/Symbols.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/Symbols.java
index bf482df..b8e314b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/Symbols.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/Symbols.java
@@ -132,4 +132,7 @@ public final class Symbols {
public static final String times = "times";
public static final String as = "as";
public static final String option = "option";
+
+ public static final String withPath = "withPath";
+ public static final String withBulk = "withBulk";
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
index 5ce712c..7ca1123 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
@@ -23,10 +23,11 @@ import org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.StepTranslator;
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.Translator;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
@@ -41,13 +42,11 @@ import java.util.function.Function;
*/
public class TranslationStrategy extends AbstractTraversalStrategy<TraversalStrategy.CreationStrategy> implements TraversalStrategy.CreationStrategy {
- private final Translator translator;
private final TraversalSource traversalSource;
private final Class anonymousTraversalClass;
- public TranslationStrategy(final Translator translator, final TraversalSource traversalSource, final Class anonymousTraversalClass) {
- this.translator = translator;
+ public TranslationStrategy(final TraversalSource traversalSource, final Class anonymousTraversalClass) {
this.traversalSource = traversalSource;
this.anonymousTraversalClass = anonymousTraversalClass;
this.createAnonymousTraversalFunction();
@@ -66,11 +65,13 @@ public class TranslationStrategy extends AbstractTraversalStrategy<TraversalStra
return;
// translate the traversal and add its steps to this traversal
- final ScriptEngine scriptEngine = ScriptEngineCache.get(this.translator.getTargetLanguage());
+ final ScriptEngine scriptEngine = ScriptEngineCache.get(traversal.getStrategies().getTranslator().getTargetLanguage());
final Bindings bindings = scriptEngine.createBindings();
scriptEngine.getContext().getBindings(ScriptContext.ENGINE_SCOPE).forEach(bindings::put);
- bindings.put(this.translator.getAlias(), this.traversalSource);
- final Traversal.Admin<?, ?> translatedTraversal = (Traversal.Admin<?, ?>) scriptEngine.eval(this.translator.getTraversalScript(), bindings);
+ final TraversalSource clone = this.traversalSource.clone();
+ clone.getStrategies().setTranslator(new StepTranslator());
+ bindings.put(traversal.getStrategies().getTranslator().getAlias(), clone);
+ final Traversal.Admin<?, ?> translatedTraversal = (Traversal.Admin<?, ?>) scriptEngine.eval(traversal.getStrategies().getTranslator().getTraversalScript(), bindings);
assert !translatedTraversal.isLocked();
assert !traversal.isLocked();
traversal.setSideEffects(translatedTraversal.getSideEffects());
@@ -82,31 +83,6 @@ public class TranslationStrategy extends AbstractTraversalStrategy<TraversalStra
}
}
- @Override
- public void addSpawnStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
- final TranslationStrategy clone = new TranslationStrategy(this.translator.clone(), this.traversalSource, this.anonymousTraversalClass);
- traversal.setStrategies(traversal.getStrategies().clone().addStrategies(clone));
- clone.createAnonymousTraversalFunction();
- clone.translator.addSpawnStep(traversal, stepName, arguments);
- }
-
- @Override
- public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
- this.translator.addStep(traversal, stepName, arguments);
- }
-
- @Override
- public void addSource(final TraversalSource traversalSource, final String sourceName, final Object... arguments) {
- final TranslationStrategy clone = new TranslationStrategy(this.translator.clone(), this.traversalSource, this.anonymousTraversalClass);
- traversalSource.getStrategies().addStrategies(clone);
- clone.createAnonymousTraversalFunction();
- clone.translator.addSource(traversalSource, sourceName, arguments);
- }
-
- public Translator getTranslator() {
- return this.translator;
- }
-
public TraversalSource getTraversalSource() {
return this.traversalSource;
}
@@ -115,10 +91,9 @@ public class TranslationStrategy extends AbstractTraversalStrategy<TraversalStra
if (null != this.anonymousTraversalClass) {
final Function<? extends Traversal.Admin, ? extends Traversal.Admin> function = traversal -> {
try {
- traversal.setStrategies(traversal.getStrategies().clone().addStrategies(
- new TranslationStrategy(this.translator.getAnonymousTraversalTranslator(),
- this.traversalSource,
- this.anonymousTraversalClass)));
+ TraversalStrategies clone = traversal.getStrategies().clone();
+ clone.setTranslator(this.traversalSource.getStrategies().getTranslator().getAnonymousTraversalTranslator());
+ traversal.setStrategies(clone);
return traversal;
} catch (final Exception e) {
throw new IllegalStateException(e.getMessage(), e);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
index 2495a78..830b887 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
@@ -26,9 +26,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Optional;
/**
@@ -38,7 +36,6 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
protected List<TraversalStrategy<?>> traversalStrategies = new ArrayList<>();
protected Translator translator = EmptyTranslator.instance();
- protected transient Map<Class<? extends TraversalStrategy>, List<TraversalStrategy<?>>> strategyMap = null;
@Override
@SuppressWarnings({"unchecked", "varargs"})
@@ -54,7 +51,6 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
}
this.traversalStrategies.removeAll(toRemove);
Collections.addAll(this.traversalStrategies, strategies);
- this.strategyMap = null;
this.traversalStrategies = TraversalStrategies.sortStrategies(this.traversalStrategies);
return this;
}
@@ -70,10 +66,8 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
removed = true;
}
}
- if (removed) {
- this.strategyMap = null;
+ if (removed)
this.traversalStrategies = TraversalStrategies.sortStrategies(this.traversalStrategies);
- }
return this;
}
@@ -102,22 +96,6 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
}
@Override
- public <T extends TraversalStrategy> List<T> getStrategies(final Class<T> traversalStrategyClass) {
- if (null == this.strategyMap) {
- this.strategyMap = new HashMap<>();
- for (final TraversalStrategy strategy : this.traversalStrategies) {
- this.strategyMap.compute((Class) strategy.getClass().getInterfaces()[0], (key, value) -> {
- assert TraversalStrategy.class.isAssignableFrom(key);
- if (null == value) value = new ArrayList<>();
- value.add(strategy);
- return value;
- });
- }
- }
- return (List<T>) this.strategyMap.getOrDefault(traversalStrategyClass, Collections.emptyList());
- }
-
- @Override
public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
for (final TraversalStrategy<?> traversalStrategy : this.traversalStrategies) {
traversalStrategy.apply(traversal);
@@ -130,7 +108,6 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
final DefaultTraversalStrategies clone = (DefaultTraversalStrategies) super.clone();
clone.traversalStrategies = new ArrayList<>(this.traversalStrategies.size());
clone.traversalStrategies.addAll(this.traversalStrategies);
- clone.strategyMap = null;
clone.translator = this.translator.clone();
return clone;
} catch (final CloneNotSupportedException e) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTranslator.java
index 9ef181a..20ce2e0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTranslator.java
@@ -21,11 +21,12 @@ package org.apache.tinkerpop.gremlin.process.traversal.util;
import org.apache.tinkerpop.gremlin.process.traversal.Translator;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class EmptyTranslator implements Translator {
+public final class EmptyTranslator implements Translator<Traversal.Admin<?, ?>, TraversalSource> {
private static final EmptyTranslator INSTANCE = new EmptyTranslator();
@@ -39,8 +40,18 @@ public final class EmptyTranslator implements Translator {
}
@Override
- public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+ public Traversal.Admin<?, ?> addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+ return traversal;
+ }
+ @Override
+ public Traversal.Admin<?, ?> addSpawnStep(TraversalSource traversalSource, String stepName, Object... arguments) {
+ return EmptyTraversal.instance();
+ }
+
+ @Override
+ public TraversalSource addSource(TraversalSource traversalSource, String sourceName, Object... arguments) {
+ return traversalSource;
}
@Override
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ScriptTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ScriptTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ScriptTraversal.java
index 73e1e2a..4d8fe06 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ScriptTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ScriptTraversal.java
@@ -60,7 +60,7 @@ public final class ScriptTraversal<S, E> extends DefaultTraversal<S, E> {
public ScriptTraversal(final TranslationStrategy translationStrategy, final Object... bindings) {
super();
- final Translator translator = translationStrategy.getTranslator();
+ final Translator translator = translationStrategy.getTraversalSource().getStrategies().getTranslator();
final TraversalSource traversalSource = translationStrategy.getTraversalSource().withoutStrategies(TranslationStrategy.class, RemoteStrategy.class);
//
this.alias = translator.getAlias();
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index 2b03497..14c0b5f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -566,36 +566,6 @@ public final class TraversalHelper {
return false;
}
- public static void addStepToCreationStrategies(final Traversal.Admin<?, ?> traversal, final Object... arguments) {
- final List<TraversalStrategy.CreationStrategy> strategies = traversal.getStrategies().getStrategies(TraversalStrategy.CreationStrategy.class);
- if (!strategies.isEmpty()) {
- final String stepName = Thread.currentThread().getStackTrace()[2].getMethodName();
- for (final TraversalStrategy.CreationStrategy creationStrategy : strategies) {
- creationStrategy.addStep(traversal, stepName, arguments);
- }
- }
- }
-
- public static void addSpawnStepToCreationStrategies(final Traversal.Admin<?, ?> traversal, final Object... arguments) {
- final List<TraversalStrategy.CreationStrategy> strategies = traversal.getStrategies().getStrategies(TraversalStrategy.CreationStrategy.class);
- if (!strategies.isEmpty()) {
- final String stepName = Thread.currentThread().getStackTrace()[2].getMethodName();
- for (final TraversalStrategy.CreationStrategy creationStrategy : strategies) {
- creationStrategy.addSpawnStep(traversal, stepName, arguments);
- }
- }
- }
-
- public static void addSourceToCreationStrategies(final TraversalSource traversalSource, final Object... arguments) {
- final List<TraversalStrategy.CreationStrategy> strategies = traversalSource.getStrategies().getStrategies(TraversalStrategy.CreationStrategy.class);
- if (!strategies.isEmpty()) {
- final String sourceName = Thread.currentThread().getStackTrace()[2].getMethodName();
- for (final TraversalStrategy.CreationStrategy creationStrategy : strategies) {
- creationStrategy.addSource(traversalSource, sourceName, arguments);
- }
- }
- }
-
public static void removeAllSteps(final Traversal.Admin<?, ?> traversal) {
while (!traversal.getSteps().isEmpty()) {
traversal.removeStep(0);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7d64d0e/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java
index cc29516..e8f6ba0 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java
@@ -22,13 +22,14 @@ package org.apache.tinkerpop.gremlin.java.translator;
import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
+import org.apache.tinkerpop.gremlin.process.traversal.Translator;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.creation.TranslationStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
-import org.apache.tinkerpop.gremlin.process.traversal.Translator;
import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
@@ -41,7 +42,7 @@ import java.util.List;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class GroovyTranslator implements Translator {
+public final class GroovyTranslator implements Translator<Traversal.Admin<?, ?>, TraversalSource> {
private StringBuilder traversalScript;
private final String alias;
@@ -75,14 +76,13 @@ public final class GroovyTranslator implements Translator {
return this.alias;
}
- @Override
- public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+ private void updateTraversalScript(final String methodName, Object... arguments) {
final List<Object> objects = TranslatorHelper.flattenArguments(arguments);
if (objects.isEmpty())
- this.traversalScript.append(".").append(stepName).append("()");
+ this.traversalScript.append(".").append(methodName).append("()");
else {
this.traversalScript.append(".");
- String temp = stepName + "(";
+ String temp = methodName + "(";
for (final Object object : objects) {
temp = temp + convertToString(object) + ",";
}
@@ -91,6 +91,28 @@ public final class GroovyTranslator implements Translator {
}
@Override
+ public Traversal.Admin<?, ?> addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+ this.updateTraversalScript(stepName, arguments);
+ return traversal;
+ }
+
+ @Override
+ public Traversal.Admin<?, ?> addSpawnStep(final TraversalSource traversalSource, String stepName, Object... arguments) {
+ final TraversalSource clone = traversalSource.clone();
+ ((GroovyTranslator)clone.getStrategies().getTranslator()).updateTraversalScript(stepName, arguments);
+ final Traversal.Admin<?, ?> traversal = new DefaultGraphTraversal<>(clone.getGraph());
+ traversal.setStrategies(clone.getStrategies());
+ return traversal;
+ }
+
+ @Override
+ public TraversalSource addSource(final TraversalSource traversalSource, String sourceName, Object... arguments) {
+ final TraversalSource clone = traversalSource.clone();
+ ((GroovyTranslator)clone.getStrategies().getTranslator()).updateTraversalScript(sourceName, arguments);
+ return clone;
+ }
+
+ @Override
public Translator getAnonymousTraversalTranslator() {
return new GroovyTranslator("__");
}
@@ -151,7 +173,7 @@ public final class GroovyTranslator implements Translator {
final String lambdaString = ((Lambda) object).getLambdaScript();
return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}";
} else if (object instanceof Traversal)
- return ((Traversal) object).asAdmin().getStrategies().getStrategy(TranslationStrategy.class).get().getTranslator().getTraversalScript();
+ return ((Traversal) object).asAdmin().getStrategies().getTranslator().getTraversalScript();
else
return null == object ? "null" : object.toString();
}