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();
     }