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


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/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 140488e..797375e 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/StepTranslator.java
@@ -19,18 +19,36 @@
 
 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.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.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.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;
@@ -45,6 +63,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicate
 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.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;
@@ -58,6 +77,7 @@ 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;
@@ -68,6 +88,7 @@ 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;
@@ -91,6 +112,7 @@ 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;
@@ -99,16 +121,23 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSide
 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.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Column;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 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.util.function.ConstantSupplier;
 
+import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
@@ -120,6 +149,11 @@ import java.util.function.Supplier;
  * @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;
@@ -162,25 +196,25 @@ public final class StepTranslator implements Translator {
                     traversal.addStep(new VertexStep<>(traversal, 
Vertex.class, (Direction) arguments[0], (String[]) arguments[1]));
                 return;
             case Symbols.out:
-                traversal.addStep(new VertexStep<>(traversal, Vertex.class, 
Direction.OUT, (String[]) arguments[0]));
+                traversal.addStep(new VertexStep<>(traversal, Vertex.class, 
Direction.OUT, (String[]) arguments));
                 return;
             case Symbols.in:
-                traversal.addStep(new VertexStep<>(traversal, Vertex.class, 
Direction.IN, (String[]) arguments[0]));
+                traversal.addStep(new VertexStep<>(traversal, Vertex.class, 
Direction.IN, (String[]) arguments));
                 return;
             case Symbols.both:
-                traversal.addStep(new VertexStep<>(traversal, Vertex.class, 
Direction.BOTH, (String[]) arguments[0]));
+                traversal.addStep(new VertexStep<>(traversal, Vertex.class, 
Direction.BOTH, (String[]) arguments));
                 return;
             case Symbols.toE:
                 traversal.addStep(new VertexStep<>(traversal, Edge.class, 
(Direction) arguments[0], (String[]) arguments[1]));
                 return;
             case Symbols.outE:
-                traversal.addStep(new VertexStep<>(traversal, Edge.class, 
Direction.OUT, (String[]) arguments[0]));
+                traversal.addStep(new VertexStep<>(traversal, Edge.class, 
Direction.OUT, (String[]) arguments));
                 return;
             case Symbols.inE:
-                traversal.addStep(new VertexStep<>(traversal, Edge.class, 
Direction.IN, (String[]) arguments[0]));
+                traversal.addStep(new VertexStep<>(traversal, Edge.class, 
Direction.IN, (String[]) arguments));
                 return;
             case Symbols.bothE:
-                traversal.addStep(new VertexStep<>(traversal, Edge.class, 
Direction.BOTH, (String[]) arguments[0]));
+                traversal.addStep(new VertexStep<>(traversal, Edge.class, 
Direction.BOTH, (String[]) arguments));
                 return;
             case Symbols.toV:
                 traversal.addStep(new EdgeVertexStep(traversal, (Direction) 
arguments[0]));
@@ -209,19 +243,19 @@ public final class StepTranslator implements Translator {
                 traversal.addStep(new PropertiesStep<>(traversal, 
PropertyType.VALUE, (String[]) arguments));
                 return;
             case Symbols.propertyMap:
-                traversal.addStep(arguments[0] instanceof Boolean ?
+                traversal.addStep(0 != arguments.length && arguments[0] 
instanceof Boolean ?
                         new PropertyMapStep<>(traversal, (boolean) 
arguments[0], PropertyType.PROPERTY, (String[]) arguments[1]) :
-                        new PropertyMapStep<>(traversal, false, 
PropertyType.PROPERTY, (String[]) arguments[0]));
+                        new PropertyMapStep<>(traversal, false, 
PropertyType.PROPERTY, (String[]) arguments));
                 return;
             case Symbols.valueMap:
-                traversal.addStep(arguments[0] instanceof Boolean ?
+                traversal.addStep(0 != arguments.length && arguments[0] 
instanceof Boolean ?
                         new PropertyMapStep<>(traversal, (boolean) 
arguments[0], PropertyType.VALUE, (String[]) arguments[1]) :
-                        new PropertyMapStep<>(traversal, false, 
PropertyType.VALUE, (String[]) arguments[0]));
+                        new PropertyMapStep<>(traversal, false, 
PropertyType.VALUE, (String[]) arguments));
                 return;
             case Symbols.select:
                 if (arguments[0] instanceof Column)
                     traversal.addStep(new TraversalMapStep<>(traversal, new 
ColumnTraversal((Column) arguments[0])));
-                else if (arguments[0] instanceof Pop)
+                else if (arguments[0] instanceof Pop) {
                     if (arguments[1] instanceof String)
                         traversal.addStep(new SelectOneStep<>(traversal, (Pop) 
arguments[0], (String) arguments[1]));
                     else {
@@ -231,8 +265,8 @@ public final class StepTranslator implements Translator {
                         System.arraycopy(arguments[3], 0, selectKeys, 2, 
((String[]) arguments[3]).length);
                         traversal.addStep(new SelectStep<>(traversal, (Pop) 
arguments[0], selectKeys));
                     }
-                else {
-                    if (arguments[0] instanceof String)
+                } else {
+                    if (1 == arguments.length && arguments[0] instanceof 
String)
                         traversal.addStep(new SelectOneStep<>(traversal, null, 
(String) arguments[0]));
                     else {
                         final String[] selectKeys = new String[((String[]) 
arguments[2]).length + 2];
@@ -253,7 +287,7 @@ public final class StepTranslator implements Translator {
                 traversal.addStep(new PathStep<>(traversal));
                 return;
             case Symbols.match:
-                traversal.addStep(new MatchStep<>(traversal, 
ConnectiveStep.Connective.AND, (Traversal[]) arguments[0]));
+                traversal.addStep(new MatchStep<>(traversal, 
ConnectiveStep.Connective.AND, (Traversal[]) arguments));
                 return;
             case Symbols.sack:
                 if (0 == arguments.length)
@@ -280,7 +314,9 @@ public final class StepTranslator implements Translator {
             case Symbols.fold:
                 traversal.addStep(0 == arguments.length ?
                         new FoldStep<>(traversal) :
-                        new FoldStep<>(traversal, (Supplier) arguments[0], 
(BiFunction) arguments[1]));
+                        new FoldStep<>(traversal, arguments[0] instanceof 
Supplier ?
+                                (Supplier) arguments[0] :
+                                new ConstantSupplier(arguments[0]), 
(BiFunction) arguments[1]));
                 return;
             case Symbols.count:
                 traversal.addStep(0 == arguments.length || Scope.global == 
arguments[0] ?
@@ -320,7 +356,7 @@ public final class StepTranslator implements Translator {
             case Symbols.groupCount:
                 traversal.addStep(0 == arguments.length ?
                         new GroupCountStep<>(traversal) :
-                        new GroupSideEffectStep<>(traversal, (String) 
arguments[0]));
+                        new GroupCountSideEffectStep<>(traversal, (String) 
arguments[0]));
                 return;
             case Symbols.tree:
                 traversal.addStep(0 == arguments.length ?
@@ -361,21 +397,75 @@ public final class StepTranslator implements Translator {
                 traversal.addStep(new InjectStep<>(traversal, arguments));
                 return;
             case Symbols.dedup:
-                traversal.addStep(arguments[0] instanceof String[] ?
-                        new DedupGlobalStep<>(traversal, (String[]) 
arguments[0]) :
-                        arguments[0] == Scope.global ?
-                                new DedupGlobalStep<>(traversal, (String[]) 
arguments[1]) :
-                                new DedupLocalStep<>(traversal));
+                if (0 == arguments.length)
+                    traversal.addStep(new DedupGlobalStep<>(traversal));
+                else {
+                    traversal.addStep(arguments instanceof String[] ?
+                            new DedupGlobalStep<>(traversal, (String[]) 
arguments) :
+                            arguments[0] == Scope.global ?
+                                    new DedupGlobalStep<>(traversal, 
(String[]) arguments[1]) :
+                                    new DedupLocalStep<>(traversal));
+                }
                 return;
             case Symbols.where:
-                traversal.addStep(arguments[0] instanceof Traversal ?
-                        new WhereTraversalStep<>(traversal, (Traversal) 
arguments[0]) :
+                traversal.addStep(arguments[0] instanceof Traversal.Admin ?
+                        TraversalHelper.getVariableLocations((Traversal.Admin) 
arguments[0]).isEmpty() ?
+                                new TraversalFilterStep<>(traversal, 
(Traversal.Admin) arguments[0]) :
+                                new WhereTraversalStep<>(traversal, 
(Traversal.Admin) arguments[0]) :
                         arguments[0] instanceof String ?
                                 new WherePredicateStep<>(traversal, 
Optional.of((String) arguments[0]), (P) arguments[1]) :
                                 new WherePredicateStep<>(traversal, 
Optional.empty(), (P) arguments[0]));
                 return;
+            case Symbols.has:
+                if (1 == arguments.length) {
+                    traversal.addStep(new TraversalFilterStep<>(traversal, 
__.values((String) arguments[0])));
+                } else if (2 == arguments.length) {
+                    final String propertyKey = arguments[0] instanceof T ? 
((T) arguments[0]).getAccessor() : (String) arguments[0];
+                    if (arguments[1] instanceof Traversal.Admin) {
+                        traversal.addStep(
+                                new TraversalFilterStep<>(traversal, 
((Traversal.Admin) arguments[1]).addStep(0,
+                                        new PropertiesStep((Traversal.Admin) 
arguments[1], PropertyType.VALUE, propertyKey))));
+                    } else {
+                        final P predicate = arguments[1] instanceof P ? (P) 
arguments[1] : P.eq(arguments[1]);
+                        traversal.addStep(new HasStep<>(traversal, 
HasContainer.makeHasContainers(propertyKey, predicate)));
+                    }
+                } else if (3 == arguments.length) {
+                    traversal.addStep(new HasStep<>(traversal, 
HasContainer.makeHasContainers(T.label.getAccessor(), P.eq(arguments[0]))));
+                    traversal.addStep(new HasStep<>(traversal, 
HasContainer.makeHasContainers(arguments[1] instanceof T ?
+                                    ((T) arguments[1]).getAccessor() :
+                                    (String) arguments[1],
+                            arguments[2] instanceof P ?
+                                    (P) arguments[2] :
+                                    P.eq(arguments[2]))));
+                }
+                return;
+            case Symbols.hasNot:
+                traversal.addStep(new NotStep<>(traversal, __.values((String) 
arguments[0])));
+                return;
+            case Symbols.hasLabel:
+                traversal.addStep(new HasStep<>(traversal, 0 == 
arguments.length ?
+                        HasContainer.makeHasContainers(T.label.getAccessor(), 
P.eq(arguments[0])) :
+                        HasContainer.makeHasContainers(T.label.getAccessor(), 
P.within(arguments))));
+                return;
+            case Symbols.hasId:
+                traversal.addStep(new HasStep<>(traversal, 0 == 
arguments.length ?
+                        HasContainer.makeHasContainers(T.id.getAccessor(), 
P.eq(arguments[0])) :
+                        HasContainer.makeHasContainers(T.id.getAccessor(), 
P.within(arguments))));
+                return;
+            case Symbols.hasKey:
+                traversal.addStep(new HasStep<>(traversal, 0 == 
arguments.length ?
+                        HasContainer.makeHasContainers(T.key.getAccessor(), 
P.eq(arguments[0])) :
+                        HasContainer.makeHasContainers(T.key.getAccessor(), 
P.within(arguments))));
+                return;
+            case Symbols.hasValue:
+                traversal.addStep(new HasStep<>(traversal, 0 == 
arguments.length ?
+                        HasContainer.makeHasContainers(T.value.getAccessor(), 
P.eq(arguments[0])) :
+                        HasContainer.makeHasContainers(T.value.getAccessor(), 
P.within(arguments))));
+                return;
             case Symbols.is:
-                traversal.addStep(new IsStep<>(traversal, arguments[0] 
instanceof P ? (P) arguments[0] : P.eq(arguments[0])));
+                traversal.addStep(new IsStep<>(traversal, arguments[0] 
instanceof P ?
+                        (P) arguments[0] :
+                        P.eq(arguments[0])));
                 return;
             case Symbols.not:
                 traversal.addStep(new NotStep<>(traversal, (Traversal) 
arguments[0]));
@@ -390,16 +480,16 @@ public final class StepTranslator implements Translator {
                 return;
             case Symbols.limit:
                 if (1 == arguments.length)
-                    traversal.addStep(new RangeGlobalStep<>(traversal, 0, 
(int) arguments[0]));
+                    traversal.addStep(new RangeGlobalStep<>(traversal, 0, 
(long) arguments[0]));
                 else
                     traversal.addStep(Scope.global == arguments[0] ?
-                            new RangeGlobalStep<>(traversal, 0, (int) 
arguments[1]) :
-                            new RangeLocalStep<>(traversal, 0, (int) 
arguments[1]));
+                            new RangeGlobalStep<>(traversal, 0, (long) 
arguments[1]) :
+                            new RangeLocalStep<>(traversal, 0, (long) 
arguments[1]));
                 return;
             case Symbols.tail:
                 if (0 == arguments.length)
                     traversal.addStep(new TailGlobalStep<>(traversal, 1L));
-                if (arguments[0] instanceof Long)
+                else if (arguments[0] instanceof Long)
                     traversal.addStep(new TailGlobalStep<>(traversal, (long) 
arguments[0]));
                 else if (1 == arguments.length)
                     traversal.addStep(Scope.global == arguments[0] ?
@@ -439,7 +529,9 @@ public final class StepTranslator implements Translator {
                         new LambdaSideEffectStep<>(traversal, (Consumer) 
arguments[0]));
                 return;
             case Symbols.cap:
-                traversal.addStep(new SideEffectCapStep<>(traversal, (String) 
arguments[0], (String[]) arguments[1]));
+                traversal.addStep(1 == arguments.length ?
+                        new SideEffectCapStep<>(traversal, (String) 
arguments[0]) :
+                        new SideEffectCapStep<>(traversal, (String) 
arguments[0], (String[]) arguments[1]));
                 return;
             case Symbols.aggregate:
                 traversal.addStep(new AggregateStep<>(traversal, (String) 
arguments[0]));
@@ -449,12 +541,129 @@ public final class StepTranslator implements Translator {
                 return;
             case Symbols.subgraph:
                 traversal.addStep(new SubgraphStep(traversal, (String) 
arguments[0]));
+                return;
             case Symbols.profile:
                 traversal.addStep(new ProfileSideEffectStep<>(traversal, 0 == 
arguments.length ?
                         ProfileSideEffectStep.DEFAULT_METRICS_KEY :
                         (String) arguments[0]));
                 if (0 == arguments.length)
                     traversal.addStep(new SideEffectCapStep<>(traversal, 
ProfileSideEffectStep.DEFAULT_METRICS_KEY));
+                return;
+            case Symbols.branch:
+                final BranchStep branchStep = new BranchStep<>(traversal);
+                branchStep.setBranchTraversal(arguments[0] instanceof 
Traversal.Admin ?
+                        (Traversal.Admin) arguments[0] :
+                        __.map((Function) arguments[0]).asAdmin());
+                traversal.addStep(branchStep);
+                return;
+            case Symbols.choose:
+                if (1 == arguments.length)
+                    traversal.addStep(new ChooseStep<>(traversal, arguments[0] 
instanceof Traversal.Admin ?
+                            (Traversal.Admin) arguments[0] :
+                            __.map(new FunctionTraverser<>((Function) 
arguments[0])).asAdmin()));
+                else
+                    traversal.addStep(new ChooseStep<>(traversal,
+                            arguments[0] instanceof Traversal.Admin ?
+                                    (Traversal.Admin) arguments[0] :
+                                    __.filter(new 
PredicateTraverser<>((Predicate) arguments[0])).asAdmin(),
+                            (Traversal.Admin) arguments[1], (Traversal.Admin) 
arguments[2]));
+                return;
+            case Symbols.optional:
+                traversal.addStep(new ChooseStep<>(traversal, 
(Traversal.Admin) arguments[0], ((Traversal.Admin) arguments[0]).clone(), 
__.identity().asAdmin()));
+                return;
+            case Symbols.union:
+                traversal.addStep(new UnionStep<>(traversal, 
Arrays.copyOf(arguments, arguments.length, Traversal.Admin[].class)));
+                return;
+            case Symbols.coalesce:
+                traversal.addStep(new CoalesceStep<>(traversal, 
Arrays.copyOf(arguments, arguments.length, Traversal.Admin[].class)));
+                return;
+            case Symbols.repeat:
+                RepeatStep.addRepeatToTraversal(traversal, (Traversal.Admin) 
arguments[0]);
+                return;
+            case Symbols.emit:
+                if (0 == arguments.length)
+                    RepeatStep.addEmitToTraversal(traversal, 
TrueTraversal.instance());
+                else if (arguments[0] instanceof Traversal.Admin)
+                    RepeatStep.addEmitToTraversal(traversal, (Traversal.Admin) 
arguments[0]);
+                else
+                    RepeatStep.addEmitToTraversal(traversal, 
__.filter((Predicate) arguments[0]).asAdmin());
+                return;
+            case Symbols.until:
+                if (arguments[0] instanceof Traversal.Admin)
+                    RepeatStep.addUntilToTraversal(traversal, 
(Traversal.Admin) arguments[0]);
+                else
+                    RepeatStep.addUntilToTraversal(traversal, 
__.filter((Predicate) arguments[0]).asAdmin());
+                return;
+            case Symbols.times:
+                if (traversal.getEndStep() instanceof TimesModulating)
+                    ((TimesModulating) 
traversal.getEndStep()).modulateTimes((int) arguments[0]);
+                else
+                    RepeatStep.addUntilToTraversal(traversal, new 
LoopTraversal<>((int) arguments[0]));
+                return;
+            case Symbols.barrier:
+                traversal.addStep(0 == arguments.length ?
+                        new NoOpBarrierStep<>(traversal) :
+                        arguments[0] instanceof Consumer ?
+                                new LambdaCollectingBarrierStep<>(traversal, 
(Consumer) arguments[0], Integer.MAX_VALUE) :
+                                new NoOpBarrierStep<>(traversal, (int) 
arguments[0]));
+                return;
+            case Symbols.local:
+                traversal.addStep(new LocalStep<>(traversal, (Traversal.Admin) 
arguments[0]));
+                return;
+            case Symbols.pageRank:
+                traversal.addStep(new PageRankVertexProgramStep(traversal, 0 
== arguments.length ? 0.85d : (double) arguments[0]));
+                return;
+            case Symbols.peerPressure:
+                traversal.addStep(new 
PeerPressureVertexProgramStep(traversal));
+                return;
+            case Symbols.program:
+                traversal.addStep(new ProgramVertexProgramStep(traversal, 
(VertexProgram) arguments[0]));
+                return;
+            case Symbols.by:
+                if (0 == arguments.length)
+                    ((ByModulating) traversal.getEndStep()).modulateBy();
+                else if (1 == arguments.length) {
+                    if (arguments[0] instanceof String)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((String) arguments[0]);
+                    else if (arguments[0] instanceof T)
+                        ((ByModulating) traversal.getEndStep()).modulateBy((T) 
arguments[0]);
+                    else if (arguments[0] instanceof Traversal.Admin)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((Traversal.Admin) arguments[0]);
+                    else if (arguments[0] instanceof Function)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((Function) arguments[0]);
+                    else if (arguments[0] instanceof Order)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((Order) arguments[0]);
+                    else if (arguments[0] instanceof Comparator)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((Comparator) arguments[0]);
+                } else {
+                    if (arguments[0] instanceof String)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((String) arguments[0], (Comparator) 
arguments[1]);
+                    else if (arguments[0] instanceof T)
+                        ((ByModulating) traversal.getEndStep()).modulateBy((T) 
arguments[0], (Comparator) arguments[1]);
+                    else if (arguments[0] instanceof Traversal.Admin)
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((Traversal.Admin) arguments[0], (Comparator) 
arguments[1]);
+                    else
+
+                        ((ByModulating) 
traversal.getEndStep()).modulateBy((Function) arguments[0], (Comparator) 
arguments[1]);
+                }
+                return;
+            case Symbols.as:
+                if (traversal.getSteps().isEmpty())
+                    traversal.addStep(new StartStep<>(traversal));
+                traversal.getEndStep().addLabel((String) arguments[0]);
+                if (arguments.length > 1) {
+                    final String[] otherLabels = (String[]) arguments[1];
+                    for (int i = 0; i < otherLabels.length; i++) {
+                        traversal.getEndStep().addLabel(otherLabels[i]);
+                    }
+                }
+                return;
+            case Symbols.option:
+                if (1 == arguments.length)
+                    ((TraversalOptionParent) 
traversal.getEndStep()).addGlobalChildOption(TraversalOptionParent.Pick.any, 
(Traversal.Admin) arguments[0]);
+                else
+                    ((TraversalOptionParent) 
traversal.getEndStep()).addGlobalChildOption(arguments[0], (Traversal.Admin) 
arguments[1]);
+                return;
             default:
                 throw new IllegalArgumentException("The provided step name is 
not supported by " + StepTranslator.class.getSimpleName() + ": " + stepName);
         }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/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 d3ce01a..3cf825a 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
@@ -87,6 +87,11 @@ public final class Symbols {
     public static final String dedup = "dedup";
     public static final String where = "where";
     public static final String has = "has";
+    public static final String hasNot = "hasNot";
+    public static final String hasLabel = "hasLabel";
+    public static final String hasId = "hasId";
+    public static final String hasKey = "hasKey";
+    public static final String hasValue = "hasValue";
     public static final String is = "is";
     public static final String not = "not";
     public static final String range = "range";
@@ -106,6 +111,24 @@ public final class Symbols {
     public static final String store = "store";
     public static final String aggregate = "aggregate";
     public static final String subgraph = "subgraph";
-
     public static final String profile = "profile";
+    public static final String barrier = "barrier";
+    public static final String local = "local";
+    public static final String emit = "emit";
+    public static final String repeat = "repeat";
+    public static final String until = "until";
+    public static final String branch = "branch";
+    public static final String union = "union";
+    public static final String coalesce = "coalesce";
+    public static final String choose = "choose";
+    public static final String optional = "optional";
+
+    public static final String pageRank = "pageRank";
+    public static final String peerPressure = "peerPressure";
+    public static final String program = "program";
+
+    public static final String by = "by";
+    public static final String times = "times";
+    public static final String as = "as";
+    public static final String option = "option";
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index ef46bf2..c4edbff 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -999,7 +999,7 @@ public class __ {
     /**
      * @see GraphTraversal#optional(Traversal)
      */
-    public static <A, B> GraphTraversal<A, B> optional(final Traversal<?, B> 
optionalTraversal) {
+    public static <A> GraphTraversal<A, A> optional(final Traversal<?, A> 
optionalTraversal) {
         return __.<A>start().optional(optionalTraversal);
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/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 0895569..9adf480 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
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
+import org.apache.tinkerpop.gremlin.process.traversal.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -36,6 +37,7 @@ import java.util.Optional;
 public class DefaultTraversalStrategies implements TraversalStrategies {
 
     protected List<TraversalStrategy<?>> traversalStrategies = new 
ArrayList<>();
+    protected Translator translator;
     protected transient Map<Class<? extends TraversalStrategy>, 
List<TraversalStrategy<?>>> strategyMap = null;
 
     @Override
@@ -76,6 +78,16 @@ public class DefaultTraversalStrategies implements 
TraversalStrategies {
     }
 
     @Override
+    public void setTranslator(final Translator translator) {
+        this.translator = translator;
+    }
+
+    @Override
+    public Translator getTranslator() {
+        return this.translator;
+    }
+
+    @Override
     public List<TraversalStrategy<?>> toList() {
         return Collections.unmodifiableList(this.traversalStrategies);
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
index 556cf5c..734fd20 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
+import org.apache.tinkerpop.gremlin.process.traversal.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -43,6 +44,16 @@ public final class EmptyTraversalStrategies implements 
TraversalStrategies {
     }
 
     @Override
+    public Translator getTranslator() {
+        return null;
+    }
+
+    @Override
+    public void setTranslator(Translator translator) {
+
+    }
+
+    @Override
     public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
 
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/af3e34b0/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
index f75b0f4..6e418b2 100644
--- 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
+++ 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
@@ -614,7 +614,7 @@ public abstract class SelectTest extends 
AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_asXa_bX_out_asXcX_selectXkeysX() {
+    public void g_V_asXa_bX_out_asXcX_path_selectXkeysX() {
         final Traversal<Vertex, Collection<Set<String>>> traversal = 
get_g_V_asXa_bX_out_asXcX_path_selectXkeysX();
         int counter = 0;
         while (traversal.hasNext()) {

Reply via email to