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 16:16:24 UTC

tinkerpop git commit: adding source and spawns to StepTranslator... tedium to the core.

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 af3e34b03 -> bff3ad1ce


adding source and spawns to StepTranslator... tedium to the core.


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

Branch: refs/heads/TINKERPOP-1278
Commit: bff3ad1ce918bc048f162d1b44a7e91b11104682
Parents: af3e34b
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 29 10:16:20 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 29 10:16:20 2016 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalSource.java      | 50 ++++++-------
 .../traversal/dsl/TraversalSourceSymbols.java   | 36 ++++++++++
 .../dsl/graph/GraphTraversalSource.java         | 11 +--
 .../traversal/dsl/graph/StepTranslator.java     | 57 +++++++++++++--
 .../process/traversal/dsl/graph/Symbols.java    |  1 +
 .../util/DefaultTraversalStrategies.java        |  3 +-
 .../process/traversal/util/EmptyTranslator.java | 74 ++++++++++++++++++++
 .../process/traversal/util/EmptyTraversal.java  |  2 +-
 8 files changed, 195 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/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 9c7d081..a5e6196 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
@@ -21,12 +21,10 @@ package org.apache.tinkerpop.gremlin.process.traversal;
 import org.apache.tinkerpop.gremlin.process.computer.Computer;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.TraversalSourceSymbols;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.creation.TranslationStrategy;
-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.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
 import java.io.Serializable;
 import java.util.List;
@@ -115,7 +113,7 @@ public interface TraversalSource extends Cloneable {
             traversalStrategies[i + 1] = graphComputerStrategies.get(i);
         }
         final TraversalSource clone = this.withStrategies(traversalStrategies);
-        TraversalHelper.addSourceToCreationStrategies(clone, computer);
+        this.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withComputer, computer);
         return clone;
     }
 
@@ -161,8 +159,7 @@ public interface TraversalSource extends Cloneable {
      */
     public default <A> TraversalSource withSideEffect(final String key, final Supplier<A> initialValue, final BinaryOperator<A> reducer) {
         final TraversalSource clone = this.clone();
-        TraversalHelper.addSourceToCreationStrategies(clone, key, initialValue, reducer);
-        SideEffectStrategy.addSideEffect(clone.getStrategies(), key, (A) initialValue, reducer);
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue, reducer);
         return clone;
     }
 
@@ -177,8 +174,7 @@ public interface TraversalSource extends Cloneable {
      */
     public default <A> TraversalSource withSideEffect(final String key, final A initialValue, final BinaryOperator<A> reducer) {
         final TraversalSource clone = this.clone();
-        TraversalHelper.addSourceToCreationStrategies(clone, key, initialValue, reducer);
-        SideEffectStrategy.addSideEffect(clone.getStrategies(), key, initialValue, reducer);
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue, reducer);
         return clone;
     }
 
@@ -192,8 +188,7 @@ public interface TraversalSource extends Cloneable {
      */
     public default <A> TraversalSource withSideEffect(final String key, final Supplier<A> initialValue) {
         final TraversalSource clone = this.clone();
-        TraversalHelper.addSourceToCreationStrategies(clone, key, initialValue);
-        SideEffectStrategy.addSideEffect(clone.getStrategies(), key, initialValue, null);
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue);
         return clone;
     }
 
@@ -207,8 +202,7 @@ public interface TraversalSource extends Cloneable {
      */
     public default <A> TraversalSource withSideEffect(final String key, final A initialValue) {
         final TraversalSource clone = this.clone();
-        TraversalHelper.addSourceToCreationStrategies(clone, key, initialValue);
-        SideEffectStrategy.addSideEffect(clone.getStrategies(), key, initialValue, null);
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSideEffect, key, initialValue);
         return clone;
     }
 
@@ -222,8 +216,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(initialValue).splitOperator(splitOperator).mergeOperator(mergeOperator).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue, splitOperator, mergeOperator);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator, mergeOperator);
         return clone;
     }
 
@@ -237,8 +231,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).splitOperator(splitOperator).mergeOperator(mergeOperator).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue, splitOperator, mergeOperator);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator, mergeOperator);
         return clone;
     }
 
@@ -250,8 +244,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue);
         return clone;
     }
 
@@ -263,8 +257,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(initialValue).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue);
         return clone;
     }
 
@@ -277,8 +271,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(initialValue).splitOperator(splitOperator).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue, splitOperator);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator);
         return clone;
     }
 
@@ -291,8 +285,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).splitOperator(splitOperator).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue, splitOperator);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, splitOperator);
         return clone;
     }
 
@@ -305,8 +299,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(initialValue).mergeOperator(mergeOperator).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue, mergeOperator);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, mergeOperator);
         return clone;
     }
 
@@ -319,8 +313,8 @@ 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.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).mergeOperator(mergeOperator).create());
-        TraversalHelper.addSourceToCreationStrategies(clone, initialValue, mergeOperator);
+        final TraversalSource clone = this.clone();
+        clone.getStrategies().getTranslator().addSource(clone, TraversalSourceSymbols.withSack, initialValue, mergeOperator);
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/TraversalSourceSymbols.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/TraversalSourceSymbols.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/TraversalSourceSymbols.java
new file mode 100644
index 0000000..1099e84
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/TraversalSourceSymbols.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.dsl;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalSourceSymbols {
+
+    private TraversalSourceSymbols() {
+        // all static methods
+    }
+
+    public static final String withSack = "withSack";
+    public static final String withStrategies = "withStrategies";
+    public static final String withoutStrategies = "withoutStrategies";
+    public static final String withComputer = "withComputer";
+    public static final String withSideEffect = "withSideEffect";
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/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 cbc51d2..62d9758 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
@@ -20,6 +20,7 @@ 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.traversal.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
@@ -32,7 +33,6 @@ 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.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -61,6 +61,7 @@ public class GraphTraversalSource implements TraversalSource {
     public GraphTraversalSource(final Graph graph, final TraversalStrategies traversalStrategies) {
         this.graph = graph;
         this.strategies = traversalStrategies;
+        this.strategies.setTranslator(new StepTranslator());
         __.setAnonymousTraversalFunction(null); // TODO: work to remove
     }
 
@@ -240,14 +241,14 @@ public class GraphTraversalSource implements TraversalSource {
 
     public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
         final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal();
-        TraversalHelper.addSpawnStepToCreationStrategies(traversal, vertexIds);
-        return traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, vertexIds));
+        this.strategies.getTranslator().addSpawnStep(traversal, Symbols.V, vertexIds);
+        return traversal;
     }
 
     public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
         final GraphTraversal.Admin<Edge, Edge> traversal = this.generateTraversal();
-        TraversalHelper.addSpawnStepToCreationStrategies(traversal, edgesIds);
-        return traversal.addStep(new GraphStep<>(traversal, Edge.class, true, edgesIds));
+        this.strategies.getTranslator().addSpawnStep(traversal, Symbols.E, edgesIds);
+        return traversal;
     }
 
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/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 797375e..140bf10 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
@@ -29,6 +29,8 @@ 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.dsl.TraversalSourceSymbols;
 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;
@@ -127,6 +129,8 @@ 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.SackStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SideEffectStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Column;
 import org.apache.tinkerpop.gremlin.structure.Direction;
@@ -140,26 +144,71 @@ import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Optional;
 import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public final class StepTranslator implements Translator {
 
-    private static <V> V[] orEmpty(final Object... object) {
-        return 0 == object.length ? (V[]) new Object[]{} : (V[]) object;
-    }
-
     @Override
     public String getAlias() {
         return null;
     }
 
     @Override
+    public void addSource(final TraversalSource traversalSource, final String sourceName, final Object... arguments) {
+        switch (sourceName) {
+            case TraversalSourceSymbols.withSideEffect:
+                SideEffectStrategy.addSideEffect(traversalSource.getStrategies(), (String) arguments[0],
+                        arguments[1] instanceof Supplier ? (Supplier) arguments[1] : new ConstantSupplier<>(arguments[1]), 2 == arguments.length ? null : (BinaryOperator) arguments[2]);
+                return;
+            case TraversalSourceSymbols.withSack:
+                if (1 == arguments.length) {
+                    traversalSource.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 ?
+                                (Supplier) arguments[0] :
+                                new ConstantSupplier<>(arguments[0])).splitOperator((UnaryOperator) arguments[1]).create());
+                    else
+                        traversalSource.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 ?
+                            (Supplier) arguments[0] :
+                            new ConstantSupplier<>(arguments[0])).splitOperator((UnaryOperator) arguments[1]).mergeOperator((BinaryOperator) arguments[2]).create());
+                }
+                return;
+            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) {
+        switch (stepName) {
+            case Symbols.V:
+                traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, arguments));
+                return;
+            case Symbols.E:
+                traversal.addStep(new GraphStep<>(traversal, Edge.class, true, arguments));
+                return;
+            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) {
         switch (stepName) {
             case Symbols.map:

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/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 3cf825a..bf482df 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
@@ -35,6 +35,7 @@ public final class Symbols {
     public static final String identity = "identity";
     public static final String constant = "constant";
     public static final String V = "V";
+    public static final String E = "E";
     public static final String to = "to";
     public static final String out = "out";
     public static final String in = "in";

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/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 9adf480..2495a78 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
@@ -37,7 +37,7 @@ import java.util.Optional;
 public class DefaultTraversalStrategies implements TraversalStrategies {
 
     protected List<TraversalStrategy<?>> traversalStrategies = new ArrayList<>();
-    protected Translator translator;
+    protected Translator translator = EmptyTranslator.instance();
     protected transient Map<Class<? extends TraversalStrategy>, List<TraversalStrategy<?>>> strategyMap = null;
 
     @Override
@@ -131,6 +131,7 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
             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) {
             throw new IllegalStateException(e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/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
new file mode 100644
index 0000000..9ef181a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTranslator.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyTranslator implements Translator {
+
+    private static final EmptyTranslator INSTANCE = new EmptyTranslator();
+
+    private EmptyTranslator() {
+        // instance only
+    }
+
+    @Override
+    public String getAlias() {
+        return "";
+    }
+
+    @Override
+    public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+
+    }
+
+    @Override
+    public Translator getAnonymousTraversalTranslator() {
+        return EmptyTranslator.INSTANCE;
+    }
+
+    @Override
+    public String getTraversalScript() {
+        return "";
+    }
+
+    @Override
+    public Translator clone() {
+        return this;
+    }
+
+    @Override
+    public String getSourceLanguage() {
+        return "none";
+    }
+
+    @Override
+    public String getTargetLanguage() {
+        return "none";
+    }
+
+    public static final EmptyTranslator instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bff3ad1c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
index 35d551b..a9ba7ab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
@@ -38,7 +38,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class EmptyTraversal<S, E> implements Traversal.Admin<S, E> {
+public final class EmptyTraversal<S, E> implements Traversal.Admin<S, E> {
 
     private static final EmptyTraversal INSTANCE = new EmptyTraversal();
     private static final TraversalSideEffects SIDE_EFFECTS = EmptyTraversalSideEffects.instance();