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