StepTranslator complete. Both TinkerGraph STANDARD and COMPUTER tests pass in 
full. That was intense. Still lots more to do...


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/af3e34b0
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/af3e34b0
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/af3e34b0

Branch: refs/heads/TINKERPOP-1278
Commit: af3e34b03d4c0bd7906c0bb57114fea00edaafc6
Parents: 7240b54
Author: Marko A. Rodriguez <okramma...@gmail.com>
Authored: Wed Jun 29 08:19:49 2016 -0600
Committer: Marko A. Rodriguez <okramma...@gmail.com>
Committed: Wed Jun 29 08:19:49 2016 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalStrategies.java  |   4 +
 .../dsl/graph/DefaultGraphTraversal.java        |   3 +-
 .../traversal/dsl/graph/GraphTraversal.java     | 718 ++++++++-----------
 .../traversal/dsl/graph/StepTranslator.java     | 267 ++++++-
 .../process/traversal/dsl/graph/Symbols.java    |  25 +-
 .../gremlin/process/traversal/dsl/graph/__.java |   2 +-
 .../util/DefaultTraversalStrategies.java        |  12 +
 .../util/EmptyTraversalStrategies.java          |  11 +
 .../process/traversal/step/map/SelectTest.java  |   2 +-
 9 files changed, 592 insertions(+), 452 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/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 b7fd5c4..65beee1 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
@@ -87,6 +87,10 @@ public interface TraversalStrategies extends Serializable, 
Cloneable {
         return (Optional) toList().stream().filter(s -> 
traversalStrategyClass.isAssignableFrom(s.getClass())).findAny();
     }
 
+    public Translator getTranslator();
+
+    public void setTranslator(final Translator translator);
+
     /**
      * Apply all the {@link TraversalStrategy} optimizers to the {@link 
Traversal} for the stated {@link TraversalEngine}.
      * This method must ensure that the strategies are sorted prior to 
application.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
index 50b9287..f1b878d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
 
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
@@ -29,10 +28,12 @@ public class DefaultGraphTraversal<S, E> extends 
DefaultTraversal<S, E> implemen
 
     public DefaultGraphTraversal() {
         super();
+        this.strategies.setTranslator(new StepTranslator());
     }
 
     public DefaultGraphTraversal(final Graph graph) {
         super(graph);
+        this.strategies.setTranslator(new StepTranslator());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/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 170c1a9..b6e3f21 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
@@ -19,9 +19,6 @@
 package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
 
 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.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
@@ -30,106 +27,39 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ColumnTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FunctionTraverser;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
-import 
org.apache.tinkerpop.gremlin.process.traversal.lambda.PredicateTraverser;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleGlobalStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
-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;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.DedupLocalStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.IdStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.LabelStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaCollectingBarrierStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaFlatMapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.LoopsStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderLocalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProjectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyKeyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyValueStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.RangeLocalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SackStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.SampleLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.TailLocalStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalFlatMapStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalMapStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountSideEffectStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupSideEffectStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupSideEffectStepV3d0;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSideEffectStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackValueStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
-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.step.util.Tree;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -140,11 +70,9 @@ import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -152,7 +80,6 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -193,13 +120,13 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link LambdaMapStep}.
      */
     public default <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, 
E2> function) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function);
-        return this.asAdmin().addStep(new LambdaMapStep<>(this.asAdmin(), 
function));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.map, function);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> map(final Traversal<?, E2> 
mapTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
mapTraversal);
-        return this.asAdmin().addStep(new TraversalMapStep<>(this.asAdmin(), 
mapTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.map, mapTraversal);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -211,8 +138,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link LambdaFlatMapStep}.
      */
     public default <E2> GraphTraversal<S, E2> flatMap(final 
Function<Traverser<E>, Iterator<E2>> function) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function);
-        return this.asAdmin().addStep(new LambdaFlatMapStep<>(this.asAdmin(), 
function));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.flatMap, function);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -224,8 +151,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link TraversalFlatMapStep}.
      */
     public default <E2> GraphTraversal<S, E2> flatMap(final Traversal<?, E2> 
flatMapTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
flatMapTraversal);
-        return this.asAdmin().addStep(new 
TraversalFlatMapStep<>(this.asAdmin(), flatMapTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.flatMap, flatMapTraversal);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -234,8 +161,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link IdStep}.
      */
     public default GraphTraversal<S, Object> id() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new IdStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.id);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -244,8 +171,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link LabelStep}.
      */
     public default GraphTraversal<S, String> label() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new LabelStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.label);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -254,8 +181,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link IdentityStep}.
      */
     public default GraphTraversal<S, E> identity() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new IdentityStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.identity);
+        return this;
     }
 
     /**
@@ -264,13 +191,13 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link ConstantStep}.
      */
     public default <E2> GraphTraversal<S, E2> constant(final E2 e) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), e);
-        return this.asAdmin().addStep(new ConstantStep<E, E2>(this.asAdmin(), 
e));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.constant, e);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Vertex> V(final Object... 
vertexIdsOrElements) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
vertexIdsOrElements);
-        return this.asAdmin().addStep(new GraphStep<>(this.asAdmin(), 
Vertex.class, false, vertexIdsOrElements));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.V, vertexIdsOrElements);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -281,8 +208,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Vertex> to(final Direction direction, 
final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), direction, 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Vertex.class, direction, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.to, direction, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -292,8 +219,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Vertex> out(final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Vertex.class, Direction.OUT, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.out, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -303,8 +230,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Vertex> in(final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Vertex.class, Direction.IN, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.in, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -314,8 +241,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Vertex> both(final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Vertex.class, Direction.BOTH, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.both, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -326,8 +253,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Edge> toE(final Direction direction, 
final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), direction, 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Edge.class, direction, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.toE, direction, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -337,8 +264,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Edge> outE(final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Edge.class, Direction.OUT, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.outE, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -348,8 +275,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Edge> inE(final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Edge.class, Direction.IN, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.inE, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -359,8 +286,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link VertexStep}.
      */
     public default GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
edgeLabels);
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), 
Edge.class, Direction.BOTH, edgeLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.bothE, edgeLabels);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -370,8 +297,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link EdgeVertexStep}.
      */
     public default GraphTraversal<S, Vertex> toV(final Direction direction) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), direction);
-        return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), 
direction));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.toV, direction);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -380,8 +307,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link EdgeVertexStep}.
      */
     public default GraphTraversal<S, Vertex> inV() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), 
Direction.IN));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.inV);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -390,8 +317,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link EdgeVertexStep}.
      */
     public default GraphTraversal<S, Vertex> outV() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), 
Direction.OUT));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.outV);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -400,8 +327,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link EdgeVertexStep}.
      */
     public default GraphTraversal<S, Vertex> bothV() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), 
Direction.BOTH));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.bothV);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -410,8 +337,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link EdgeOtherVertexStep}.
      */
     public default GraphTraversal<S, Vertex> otherV() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new EdgeOtherVertexStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.otherV);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -420,8 +347,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link OrderGlobalStep}.
      */
     public default GraphTraversal<S, E> order() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new OrderGlobalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.order);
+        return this;
     }
 
     /**
@@ -431,8 +358,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link OrderGlobalStep} or 
{@link OrderLocalStep}.
      */
     public default GraphTraversal<S, E> order(final Scope scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
OrderGlobalStep<>(this.asAdmin()) : new OrderLocalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.order, scope);
+        return this;
     }
 
     /**
@@ -444,8 +371,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PropertiesStep}.
      */
     public default <E2> GraphTraversal<S, ? extends Property<E2>> 
properties(final String... propertyKeys) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
propertyKeys);
-        return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), 
PropertyType.PROPERTY, propertyKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.properties, propertyKeys);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -457,8 +384,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PropertiesStep}.
      */
     public default <E2> GraphTraversal<S, E2> values(final String... 
propertyKeys) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
propertyKeys);
-        return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), 
PropertyType.VALUE, propertyKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.values, propertyKeys);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -470,8 +397,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PropertyMapStep}.
      */
     public default <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final 
String... propertyKeys) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
propertyKeys);
-        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), 
false, PropertyType.PROPERTY, propertyKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.propertyMap, propertyKeys);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -483,8 +410,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PropertyMapStep}.
      */
     public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final 
String... propertyKeys) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
propertyKeys);
-        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), 
false, PropertyType.VALUE, propertyKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.valueMap, propertyKeys);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -497,13 +424,13 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link PropertyMapStep}.
      */
     public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final 
boolean includeTokens, final String... propertyKeys) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
includeTokens, propertyKeys);
-        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), 
includeTokens, PropertyType.VALUE, propertyKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.valueMap, includeTokens, propertyKeys);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, Collection<E2>> select(final Column 
column) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), column);
-        return this.asAdmin().addStep(new TraversalMapStep<>(this.asAdmin(), 
new ColumnTraversal(column)));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.select, column);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -528,8 +455,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PropertyKeyStep}.
      */
     public default GraphTraversal<S, String> key() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new PropertyKeyStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.key);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -538,8 +465,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PropertyValueStep}.
      */
     public default <E2> GraphTraversal<S, E2> value() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new PropertyValueStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.value);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -548,8 +475,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link PathStep}.
      */
     public default GraphTraversal<S, Path> path() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new PathStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.path);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -560,8 +487,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link MatchStep}.
      */
     public default <E2> GraphTraversal<S, Map<String, E2>> match(final 
Traversal<?, ?>... matchTraversals) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
matchTraversals);
-        return this.asAdmin().addStep(new MatchStep<>(this.asAdmin(), 
ConnectiveStep.Connective.AND, matchTraversals));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.match, matchTraversals);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -571,21 +498,18 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link SackStep}.
      */
     public default <E2> GraphTraversal<S, E2> sack() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sack);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Integer> loops() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new LoopsStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.loops);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, Map<String, E2>> project(final 
String projectKey, final String... otherProjectKeys) {
-        final String[] projectKeys = new String[otherProjectKeys.length + 1];
-        projectKeys[0] = projectKey;
-        System.arraycopy(otherProjectKeys, 0, projectKeys, 1, 
otherProjectKeys.length);
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
projectKeys);
-        return this.asAdmin().addStep(new ProjectStep<>(this.asAdmin(), 
projectKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.project, projectKey, otherProjectKeys);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -599,15 +523,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link SelectStep}.
      */
     public default <E2> GraphTraversal<S, Map<String, E2>> select(final Pop 
pop, final String selectKey1, final String selectKey2, String... 
otherSelectKeys) {
-        final String[] selectKeys = new String[otherSelectKeys.length + 2];
-        selectKeys[0] = selectKey1;
-        selectKeys[1] = selectKey2;
-        System.arraycopy(otherSelectKeys, 0, selectKeys, 2, 
otherSelectKeys.length);
-        if (null == pop)
-            TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
selectKeys);
-        else
-            TraversalHelper.addStepToCreationStrategies(this.asAdmin(), pop, 
selectKeys);
-        return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), pop, 
selectKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.select, pop, selectKey1, selectKey2, otherSelectKeys);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -620,32 +537,33 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link SelectStep}.
      */
     public default <E2> GraphTraversal<S, Map<String, E2>> select(final String 
selectKey1, final String selectKey2, String... otherSelectKeys) {
-        return this.select(null, selectKey1, selectKey2, otherSelectKeys);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.select, selectKey1, selectKey2, otherSelectKeys);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> select(final Pop pop, final 
String selectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), pop, 
selectKey);
-        return this.asAdmin().addStep(new SelectOneStep<>(this.asAdmin(), pop, 
selectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.select, pop, selectKey);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> select(final String selectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), selectKey);
-        return this.asAdmin().addStep(new SelectOneStep<>(this.asAdmin(), 
null, selectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.select, selectKey);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> unfold() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new UnfoldStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.unfold);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, List<E>> fold() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.fold);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final 
BiFunction<E2, E, E2> foldFunction) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), seed, 
foldFunction);
-        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new 
ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.fold, seed, foldFunction);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -654,13 +572,13 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link CountGlobalStep}.
      */
     public default GraphTraversal<S, Long> count() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new CountGlobalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.count);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Long> count(final Scope scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
CountGlobalStep<>(this.asAdmin()) : new CountLocalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.count, scope);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -669,48 +587,48 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link SumGlobalStep}.
      */
     public default <E2 extends Number> GraphTraversal<S, E2> sum() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new SumGlobalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sum);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> sum(final Scope 
scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
SumGlobalStep<>(this.asAdmin()) : new SumLocalStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sum, scope);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> max() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new MaxGlobalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.max);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> max(final Scope 
scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
MaxGlobalStep<>(this.asAdmin()) : new MaxLocalStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.max, scope);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> min() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new MinGlobalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.min);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> min(final Scope 
scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
MinGlobalStep<E2>(this.asAdmin()) : new MinLocalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.min, scope);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> mean() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new MeanGlobalStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.mean);
+        return (GraphTraversal) this;
     }
 
     public default <E2 extends Number> GraphTraversal<S, E2> mean(final Scope 
scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
MeanGlobalStep<>(this.asAdmin()) : new MeanLocalStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.mean, scope);
+        return (GraphTraversal) this;
     }
 
     public default <K, V> GraphTraversal<S, Map<K, V>> group() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new GroupStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.group);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -718,28 +636,28 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      */
     @Deprecated
     public default <K, V> GraphTraversal<S, Map<K, V>> groupV3d0() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new GroupStepV3d0<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.groupV3d0);
+        return (GraphTraversal) this;
     }
 
     public default <K> GraphTraversal<S, Map<K, Long>> groupCount() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new GroupCountStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.groupCount);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Tree> tree() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new TreeStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.tree);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Vertex> addV(final String vertexLabel) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
vertexLabel);
-        return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), 
vertexLabel));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.addV, vertexLabel);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Vertex> addV() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), 
null));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.addV);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -751,36 +669,31 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
         for (int i = 0; i < propertyKeyValues.length; i = i + 2) {
             this.property(propertyKeyValues[i], propertyKeyValues[i + 1]);
         }
-        //((AddVertexStep) 
this.asAdmin().getEndStep()).addPropertyMutations(propertyKeyValues);
         return (GraphTraversal<S, Vertex>) this;
     }
 
     public default GraphTraversal<S, Edge> addE(final String edgeLabel) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabel);
-        return this.asAdmin().addStep(new AddEdgeStep<>(this.asAdmin(), 
edgeLabel));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.addE, edgeLabel);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, E> to(final String toStepLabel) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
toStepLabel);
-        ((AddEdgeStep) 
this.asAdmin().getEndStep()).addTo(__.select(toStepLabel));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.to, toStepLabel);
         return this;
     }
 
     public default GraphTraversal<S, E> from(final String fromStepLabel) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
fromStepLabel);
-        ((AddEdgeStep) 
this.asAdmin().getEndStep()).addFrom(__.select(fromStepLabel));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.from, fromStepLabel);
         return this;
     }
 
     public default GraphTraversal<S, E> to(final Traversal<E, Vertex> 
toVertex) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), toVertex);
-        ((AddEdgeStep) this.asAdmin().getEndStep()).addTo(toVertex);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.to, toVertex);
         return this;
     }
 
     public default GraphTraversal<S, E> from(final Traversal<E, Vertex> 
fromVertex) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
fromVertex);
-        ((AddEdgeStep) this.asAdmin().getEndStep()).addFrom(fromVertex);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.from, fromVertex);
         return this;
     }
 
@@ -837,28 +750,28 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
     ///////////////////// FILTER STEPS /////////////////////
 
     public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> 
predicate) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), predicate);
-        return this.asAdmin().addStep(new LambdaFilterStep<>(this.asAdmin(), 
predicate));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.filter, predicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> filter(final Traversal<?, ?> 
filterTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
filterTraversal);
-        return this.asAdmin().addStep(new 
TraversalFilterStep<>(this.asAdmin(), (Traversal) filterTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.filter, filterTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> or(final Traversal<?, ?>... 
orTraversals) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
orTraversals);
-        return this.asAdmin().addStep(new OrStep(this.asAdmin(), 
orTraversals));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.or, orTraversals);
+        return this;
     }
 
     public default GraphTraversal<S, E> and(final Traversal<?, ?>... 
andTraversals) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
andTraversals);
-        return this.asAdmin().addStep(new AndStep(this.asAdmin(), 
andTraversals));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.and, andTraversals);
+        return this;
     }
 
     public default GraphTraversal<S, E> inject(final E... injections) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
injections);
-        return this.asAdmin().addStep(new InjectStep<>(this.asAdmin(), 
injections));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.inject, injections);
+        return this;
     }
 
     /**
@@ -869,8 +782,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link DedupGlobalStep}.
      */
     public default GraphTraversal<S, E> dedup(final Scope scope, final 
String... dedupLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, 
dedupLabels);
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new 
DedupGlobalStep<>(this.asAdmin(), dedupLabels) : new 
DedupLocalStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.dedup, scope, dedupLabels);
+        return this;
     }
 
     /**
@@ -880,96 +793,98 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link DedupGlobalStep}.
      */
     public default GraphTraversal<S, E> dedup(final String... dedupLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
dedupLabels);
-        return this.asAdmin().addStep(new DedupGlobalStep<>(this.asAdmin(), 
dedupLabels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.dedup, dedupLabels);
+        return this;
     }
 
     public default GraphTraversal<S, E> where(final String startKey, final 
P<String> predicate) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), startKey, 
predicate);
-        return this.asAdmin().addStep(new WherePredicateStep<>(this.asAdmin(), 
Optional.ofNullable(startKey), predicate));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.where, startKey, predicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> where(final P<String> predicate) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), predicate);
-        return this.asAdmin().addStep(new WherePredicateStep<>(this.asAdmin(), 
Optional.empty(), predicate));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.where, predicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> where(final Traversal<?, ?> 
whereTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
whereTraversal);
-        return 
TraversalHelper.getVariableLocations(whereTraversal.asAdmin()).isEmpty() ?
-                this.asAdmin().addStep(new 
TraversalFilterStep<>(this.asAdmin(), (Traversal) whereTraversal)) :
-                this.asAdmin().addStep(new 
WhereTraversalStep<>(this.asAdmin(), whereTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.where, whereTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final String propertyKey, final 
P<?> predicate) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
propertyKey, predicate);
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), 
HasContainer.makeHasContainers(propertyKey, predicate)));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, propertyKey, predicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final T accessor, final P<?> 
predicate) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), accessor, 
predicate);
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), 
HasContainer.makeHasContainers(accessor.getAccessor(), predicate)));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, accessor, predicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final String propertyKey, final 
Object value) {
-        if (value instanceof P)
-            return this.has(propertyKey, (P) value);
-        else if (value instanceof Traversal)
-            return this.has(propertyKey, (Traversal) value);
-        else
-            return this.has(propertyKey, P.eq(value));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, propertyKey, value);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final T accessor, final Object 
value) {
-        return this.has(accessor.getAccessor(), value);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, accessor, value);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final String label, final String 
propertyKey, final P<?> predicate) {
-        return this.has(T.label, label).has(propertyKey, predicate);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, label, propertyKey, predicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final String label, final String 
propertyKey, final Object value) {
-        return this.has(T.label, label).has(propertyKey, value);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, label, propertyKey, value);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final T accessor, final 
Traversal<?, ?> propertyTraversal) {
-        return this.has(accessor.getAccessor(), propertyTraversal);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, accessor, propertyTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final String propertyKey, final 
Traversal<?, ?> propertyTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
propertyKey, propertyTraversal);
-        return this.asAdmin().addStep(
-                new TraversalFilterStep<>(this.asAdmin(), 
propertyTraversal.asAdmin().addStep(0,
-                        new PropertiesStep(propertyTraversal.asAdmin(), 
PropertyType.VALUE, propertyKey))));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, propertyKey, propertyTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> has(final String propertyKey) {
-        return this.filter(__.values(propertyKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.has, propertyKey);
+        return this;
     }
 
     public default GraphTraversal<S, E> hasNot(final String propertyKey) {
-        return this.not(__.values(propertyKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.hasNot, propertyKey);
+        return this;
     }
 
     public default GraphTraversal<S, E> hasLabel(final String... labels) {
-        return labels.length == 1 ? this.has(T.label, labels[0]) : 
this.has(T.label, P.within(labels));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.hasLabel, labels);
+        return this;
     }
 
     public default GraphTraversal<S, E> hasId(final Object... ids) {
-        return ids.length == 1 ? this.has(T.id, ids[0]) : this.has(T.id, 
P.within(ids));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.hasId, ids);
+        return this;
     }
 
     public default GraphTraversal<S, E> hasKey(final String... keys) {
-        return keys.length == 1 ? this.has(T.key, keys[0]) : this.has(T.key, 
P.within(keys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.hasKey, keys);
+        return this;
     }
 
     public default GraphTraversal<S, E> hasValue(final Object... values) {
-        return values.length == 1 ? this.has(T.value, values[0]) : 
this.has(T.value, P.within(values));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.hasValue, values);
+        return this;
     }
 
     public default GraphTraversal<S, E> is(final P<E> predicate) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), predicate);
-        return this.asAdmin().addStep(new IsStep<>(this.asAdmin(), predicate));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.is, predicate);
+        return this;
     }
 
     /**
@@ -979,12 +894,13 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link IsStep}.
      */
     public default GraphTraversal<S, E> is(final Object value) {
-        return this.is(value instanceof P ? (P<E>) value : P.eq((E) value));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.is, value);
+        return this;
     }
 
     public default GraphTraversal<S, E> not(final Traversal<?, ?> 
notTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
notTraversal);
-        return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), 
(Traversal<E, ?>) notTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.not, notTraversal);
+        return this;
     }
 
     /**
@@ -994,56 +910,48 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link CoinStep}.
      */
     public default GraphTraversal<S, E> coin(final double probability) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
probability);
-        return this.asAdmin().addStep(new CoinStep<>(this.asAdmin(), 
probability));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.coin, probability);
+        return this;
     }
 
     public default GraphTraversal<S, E> range(final long low, final long high) 
{
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), low, high);
-        return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), 
low, high));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.range, low, high);
+        return this;
     }
 
     public default <E2> GraphTraversal<S, E2> range(final Scope scope, final 
long low, final long high) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, 
low, high);
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new RangeGlobalStep<>(this.asAdmin(), low, high)
-                : new RangeLocalStep<>(this.asAdmin(), low, high));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.range, scope, low, high);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, E> limit(final long limit) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), limit);
-        return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), 0, 
limit));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.limit, limit);
+        return this;
     }
 
     public default <E2> GraphTraversal<S, E2> limit(final Scope scope, final 
long limit) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, 
limit);
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new RangeGlobalStep<>(this.asAdmin(), 0, limit)
-                : new RangeLocalStep<>(this.asAdmin(), 0, limit));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.limit, scope, limit);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, E> tail() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new TailGlobalStep<>(this.asAdmin(), 1));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.tail);
+        return this;
     }
 
     public default GraphTraversal<S, E> tail(final long limit) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), limit);
-        return this.asAdmin().addStep(new TailGlobalStep<>(this.asAdmin(), 
limit));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.tail, limit);
+        return this;
     }
 
     public default <E2> GraphTraversal<S, E2> tail(final Scope scope) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope);
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new TailGlobalStep<>(this.asAdmin(), 1)
-                : new TailLocalStep<>(this.asAdmin(), 1));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.tail, scope);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> tail(final Scope scope, final 
long limit) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, 
limit);
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new TailGlobalStep<>(this.asAdmin(), limit)
-                : new TailLocalStep<>(this.asAdmin(), limit));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.tail, scope, limit);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -1053,8 +961,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link TimeLimitStep}
      */
     public default GraphTraversal<S, E> timeLimit(final long timeLimit) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), timeLimit);
-        return this.asAdmin().addStep(new TimeLimitStep<E>(this.asAdmin(), 
timeLimit));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.timeLimit, timeLimit);
+        return this;
     }
 
     /**
@@ -1063,8 +971,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @return the traversal with an appended {@link SimplePathStep}.
      */
     public default GraphTraversal<S, E> simplePath() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.simplePath);
+        return this;
     }
 
     /**
@@ -1073,80 +981,78 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @return the traversal with an appended {@link CyclicPathStep}.
      */
     public default GraphTraversal<S, E> cyclicPath() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.cyclicPath);
+        return this;
     }
 
     public default GraphTraversal<S, E> sample(final int amountToSample) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
amountToSample);
-        return this.asAdmin().addStep(new SampleGlobalStep<>(this.asAdmin(), 
amountToSample));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sample, amountToSample);
+        return this;
     }
 
     public default GraphTraversal<S, E> sample(final Scope scope, final int 
amountToSample) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, 
amountToSample);
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new SampleGlobalStep<>(this.asAdmin(), amountToSample)
-                : new SampleLocalStep<>(this.asAdmin(), amountToSample));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sample, scope, amountToSample);
+        return this;
     }
 
     public default GraphTraversal<S, E> drop() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep(new DropStep<>(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.drop);
+        return this;
     }
 
     ///////////////////// SIDE-EFFECT STEPS /////////////////////
 
     public default GraphTraversal<S, E> sideEffect(final 
Consumer<Traverser<E>> consumer) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), consumer);
-        return this.asAdmin().addStep(new 
LambdaSideEffectStep<>(this.asAdmin(), consumer));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sideEffect, consumer);
+        return this;
     }
 
     public default GraphTraversal<S, E> sideEffect(final Traversal<?, ?> 
sideEffectTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectTraversal);
-        return this.asAdmin().addStep(new 
TraversalSideEffectStep<>(this.asAdmin(), (Traversal) sideEffectTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sideEffect, sideEffectTraversal);
+        return this;
     }
 
     public default <E2> GraphTraversal<S, E2> cap(final String sideEffectKey, 
final String... sideEffectKeys) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey, sideEffectKeys);
-        return this.asAdmin().addStep(new SideEffectCapStep<>(this.asAdmin(), 
sideEffectKey, sideEffectKeys));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.cap, sideEffectKey, sideEffectKeys);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, Edge> subgraph(final String 
sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new SubgraphStep(this.asAdmin(), 
sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.subgraph, sideEffectKey);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, E> aggregate(final String sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), 
sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.aggregate, sideEffectKey);
+        return this;
     }
 
     public default GraphTraversal<S, E> group(final String sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new 
GroupSideEffectStep<>(this.asAdmin(), sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.group, sideEffectKey);
+        return this;
     }
 
     /**
      * @deprecated As of release 3.1.0, replaced by {@link #group(String)}.
      */
     public default GraphTraversal<S, E> groupV3d0(final String sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new 
GroupSideEffectStepV3d0<>(this.asAdmin(), sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.groupV3d0, sideEffectKey);
+        return this;
     }
 
     public default GraphTraversal<S, E> groupCount(final String sideEffectKey) 
{
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new 
GroupCountSideEffectStep<>(this.asAdmin(), sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.groupCount, sideEffectKey);
+        return this;
     }
 
     public default GraphTraversal<S, E> tree(final String sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new TreeSideEffectStep<>(this.asAdmin(), 
sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.tree, sideEffectKey);
+        return this;
     }
 
     public default <V, U> GraphTraversal<S, E> sack(final BiFunction<V, U, V> 
sackOperator) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sackOperator);
-        return this.asAdmin().addStep(new SackValueStep<>(this.asAdmin(), 
sackOperator));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.sack, sackOperator);
+        return this;
     }
 
     /**
@@ -1158,21 +1064,19 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> store(final String sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), 
sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.store, sideEffectKey);
+        return this;
     }
 
     public default GraphTraversal<S, E> profile(final String sideEffectKey) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
sideEffectKey);
-        return this.asAdmin().addStep(new 
ProfileSideEffectStep<>(this.asAdmin(), sideEffectKey));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.profile, sideEffectKey);
+        return this;
     }
 
     @Override
     public default GraphTraversal<S, TraversalMetrics> profile() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin()
-                .addStep(new ProfileSideEffectStep<>(this.asAdmin(), 
ProfileSideEffectStep.DEFAULT_METRICS_KEY))
-                .addStep(new SideEffectCapStep<Object, 
TraversalMetrics>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.profile);
+        return (GraphTraversal) this;
     }
 
     /**
@@ -1235,225 +1139,201 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
     ///////////////////// BRANCH STEPS /////////////////////
 
     public default <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> 
branchTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
branchTraversal);
-        final BranchStep<E, E2, M> branchStep = new 
BranchStep<>(this.asAdmin());
-        branchStep.setBranchTraversal((Traversal.Admin<E, M>) branchTraversal);
-        return this.asAdmin().addStep(branchStep);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.branch, branchTraversal);
+        return (GraphTraversal) this;
     }
 
     public default <M, E2> GraphTraversal<S, E2> branch(final 
Function<Traverser<E>, M> function) {
-        return this.branch(__.map(function));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.branch, function);
+        return (GraphTraversal) this;
     }
 
     public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> 
choiceTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
choiceTraversal);
-        return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), 
(Traversal.Admin<E, M>) choiceTraversal));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.choose, choiceTraversal);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> 
traversalPredicate,
                                                      final Traversal<?, E2> 
trueChoice, final Traversal<?, E2> falseChoice) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
traversalPredicate, trueChoice, falseChoice);
-        return this.asAdmin().addStep(new ChooseStep<E, E2, 
Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) traversalPredicate, 
(Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.choose, traversalPredicate, trueChoice, falseChoice);
+        return (GraphTraversal) this;
     }
 
     public default <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> 
choiceFunction) {
-        return this.choose(__.map(new FunctionTraverser<>(choiceFunction)));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.choose, choiceFunction);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> choose(final Predicate<E> 
choosePredicate,
                                                      final Traversal<?, E2> 
trueChoice, final Traversal<?, E2> falseChoice) {
-        return this.choose(__.filter(new 
PredicateTraverser<>(choosePredicate)), trueChoice, falseChoice);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.choose, choosePredicate, trueChoice, falseChoice);
+        return (GraphTraversal) this;
     }
 
-    public default <E2> GraphTraversal<S, E2> optional(final Traversal<?, E2> 
optionalTraversal) {
-        return this.choose(optionalTraversal, 
optionalTraversal.asAdmin().clone(), __.identity());
+    public default GraphTraversal<S, E> optional(final Traversal<?, E> 
optionalTraversal) {
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.optional, optionalTraversal);
+        return this;
     }
 
     public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... 
unionTraversals) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
unionTraversals);
-        return this.asAdmin().addStep(new UnionStep(this.asAdmin(), 
Arrays.copyOf(unionTraversals, unionTraversals.length, 
Traversal.Admin[].class)));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.union, unionTraversals);
+        return (GraphTraversal) this;
     }
 
     public default <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, 
E2>... coalesceTraversals) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
coalesceTraversals);
-        return this.asAdmin().addStep(new CoalesceStep(this.asAdmin(), 
Arrays.copyOf(coalesceTraversals, coalesceTraversals.length, 
Traversal.Admin[].class)));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.coalesce, coalesceTraversals);
+        return (GraphTraversal) this;
     }
 
     public default GraphTraversal<S, E> repeat(final Traversal<?, E> 
repeatTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
repeatTraversal);
-        return RepeatStep.addRepeatToTraversal(this, (Traversal.Admin<E, E>) 
repeatTraversal);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.repeat, repeatTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> emit(final Traversal<?, ?> 
emitTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
emitTraversal);
-        return RepeatStep.addEmitToTraversal(this, (Traversal.Admin<E, ?>) 
emitTraversal);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.emit, emitTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> emit(final Predicate<Traverser<E>> 
emitPredicate) {
-        return this.emit(__.filter(emitPredicate));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.emit, emitPredicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> emit() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return RepeatStep.addEmitToTraversal(this, TrueTraversal.instance());
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.emit);
+        return this;
     }
 
     public default GraphTraversal<S, E> until(final Traversal<?, ?> 
untilTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
untilTraversal);
-        return RepeatStep.addUntilToTraversal(this, (Traversal.Admin<E, ?>) 
untilTraversal);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.until, untilTraversal);
+        return this;
     }
 
     public default GraphTraversal<S, E> until(final Predicate<Traverser<E>> 
untilPredicate) {
-        return this.until(__.filter(untilPredicate));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.until, untilPredicate);
+        return this;
     }
 
     public default GraphTraversal<S, E> times(final int maxLoops) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), maxLoops);
-        if (this.asAdmin().getEndStep() instanceof TimesModulating) {
-            ((TimesModulating) 
this.asAdmin().getEndStep()).modulateTimes(maxLoops);
-            return this;
-        } else
-            return RepeatStep.addUntilToTraversal(this, new 
LoopTraversal<>(maxLoops));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.times, maxLoops);
+        return this;
     }
 
     public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> 
localTraversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
localTraversal);
-        return this.asAdmin().addStep(new LocalStep<>(this.asAdmin(), 
localTraversal.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.local, localTraversal);
+        return (GraphTraversal) this;
     }
 
     /////////////////// VERTEX PROGRAM STEPS ////////////////
 
     public default GraphTraversal<S, E> pageRank() {
-        return this.pageRank(0.85d);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.pageRank);
+        return this;
     }
 
     public default GraphTraversal<S, E> pageRank(final double alpha) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), alpha);
-        return this.asAdmin().addStep((Step<E, E>) new 
PageRankVertexProgramStep(this.asAdmin(), alpha));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.pageRank, alpha);
+        return this;
     }
 
     public default GraphTraversal<S, E> peerPressure() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        return this.asAdmin().addStep((Step<E, E>) new 
PeerPressureVertexProgramStep(this.asAdmin()));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.peerPressure);
+        return this;
     }
 
     public default GraphTraversal<S, E> program(final VertexProgram<?> 
vertexProgram) {
-        return this.asAdmin().addStep((Step<E, E>) new 
ProgramVertexProgramStep(this.asAdmin(), vertexProgram));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.program, vertexProgram);
+        return this;
     }
 
     ///////////////////// UTILITY STEPS /////////////////////
 
     public default GraphTraversal<S, E> as(final String stepLabel, final 
String... stepLabels) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), stepLabel, 
stepLabels);
-        if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new 
StartStep<>(this.asAdmin()));
-        final Step<?, E> endStep = this.asAdmin().getEndStep();
-        endStep.addLabel(stepLabel);
-        for (final String label : stepLabels) {
-            endStep.addLabel(label);
-        }
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.as, stepLabel, stepLabels);
         return this;
     }
 
     public default GraphTraversal<S, E> barrier() {
-        return this.barrier(Integer.MAX_VALUE);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.barrier);
+        return this;
     }
 
     public default GraphTraversal<S, E> barrier(final int maxBarrierSize) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
maxBarrierSize);
-        return this.asAdmin().addStep(new NoOpBarrierStep<>(this.asAdmin(), 
maxBarrierSize));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.barrier, maxBarrierSize);
+        return this;
     }
 
     public default GraphTraversal<S, E> barrier(final 
Consumer<TraverserSet<Object>> barrierConsumer) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
barrierConsumer);
-        return this.asAdmin().addStep(new 
LambdaCollectingBarrierStep<>(this.asAdmin(), (Consumer) barrierConsumer, 
Integer.MAX_VALUE));
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.barrier, barrierConsumer);
+        return this;
     }
 
 
     //// BY-MODULATORS
 
     public default GraphTraversal<S, E> by() {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin());
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy();
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by);
         return this;
     }
 
     public default GraphTraversal<S, E> by(final Traversal<?, ?> traversal) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), traversal);
-        ((ByModulating) 
this.asAdmin().getEndStep()).modulateBy(traversal.asAdmin());
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, traversal);
         return this;
     }
 
     public default GraphTraversal<S, E> by(final T token) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), token);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(token);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, token);
         return this;
     }
 
     public default GraphTraversal<S, E> by(final String key) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(key);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, key);
         return this;
     }
 
     public default <V> GraphTraversal<S, E> by(final Function<V, Object> 
function) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(function);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, function);
         return this;
     }
 
     //// COMPARATOR BY-MODULATORS
 
     public default <V> GraphTraversal<S, E> by(final Traversal<?, ?> 
traversal, final Comparator<V> comparator) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), traversal, 
comparator);
-        ((ByModulating) 
this.asAdmin().getEndStep()).modulateBy(traversal.asAdmin(), comparator);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, traversal, comparator);
         return this;
     }
 
     public default GraphTraversal<S, E> by(final Comparator<E> comparator) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
comparator);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(comparator);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, comparator);
         return this;
     }
 
     public default GraphTraversal<S, E> by(final Order order) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), order);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(order);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, order);
         return this;
     }
 
     public default <V> GraphTraversal<S, E> by(final String key, final 
Comparator<V> comparator) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key, 
comparator);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(key, 
comparator);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, key, comparator);
         return this;
     }
 
-    /*public default <V> GraphTraversal<S, E> by(final Column column, final 
Comparator<V> comparator) {
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(column, 
comparator);
-        return this;
-    }
-
-    public default <V> GraphTraversal<S, E> by(final T token, final 
Comparator<V> comparator) {
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(token, 
comparator);
-        return this;
-    }*/
-
     public default <U> GraphTraversal<S, E> by(final Function<U, Object> 
function, final Comparator comparator) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function, 
comparator);
-        ((ByModulating) this.asAdmin().getEndStep()).modulateBy(function, 
comparator);
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.by, function, comparator);
         return this;
     }
 
     ////
 
     public default <M, E2> GraphTraversal<S, E> option(final M pickToken, 
final Traversal<E, E2> traversalOption) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), pickToken, 
traversalOption);
-        ((TraversalOptionParent<M, E, E2>) 
this.asAdmin().getEndStep()).addGlobalChildOption(pickToken, 
traversalOption.asAdmin());
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.option, pickToken, traversalOption);
         return this;
     }
 
     public default <E2> GraphTraversal<S, E> option(final Traversal<E, E2> 
traversalOption) {
-        TraversalHelper.addStepToCreationStrategies(this.asAdmin(), 
traversalOption);
-        return this.option(TraversalOptionParent.Pick.any, 
traversalOption.asAdmin());
+        this.asAdmin().getStrategies().getTranslator().addStep(this.asAdmin(), 
Symbols.option, traversalOption);
+        return this;
     }
 
     ////

Reply via email to