changed the typing of from() and to() to accept wildcard instead of E as the 
start. this reduces nasty type coersion. Added final addE() test case. Updated 
GremlinDSLProcessor to handle g.addE() and new addV()/addE() traversal methods 
accordingly.


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

Branch: refs/heads/master
Commit: 8ff6bdf44d6a3bc922723c0646b5ad39c3c80268
Parents: f0dc7ff
Author: Marko A. Rodriguez <[email protected]>
Authored: Wed Sep 27 11:36:53 2017 -0600
Committer: Marko A. Rodriguez <[email protected]>
Committed: Wed Sep 27 11:36:53 2017 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  2 +
 gremlin-core/api-changes.json                   | 72 ++++++++++++++++++++
 .../traversal/dsl/GremlinDslProcessor.java      | 34 ++++++++-
 .../traversal/dsl/graph/GraphTraversal.java     |  8 +--
 .../traversal/step/map/AddEdgeStartStep.java    |  6 +-
 .../process/traversal/step/map/AddEdgeTest.java | 39 +++++++++--
 6 files changed, 146 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ff6bdf4/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index fab4ade..6d25baf 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,8 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 
 This release also includes changes from <<release-3-2-7, 3.2.7>>.
 
+* Added missing `GraphTraversalSource.addE()`-method to `GremlinDslProcessor`.
+* Changed `to()` and `from()` traversal-based steps to take a wildcard `?` 
instead of of `E`.
 * Added `addV(traversal)` and `addE(traversal)` so that created element labels 
can be determined dynamically.
 * `PageRankVertexProgram` supports `maxIterations` but will break out early if 
epsilon-based convergence occurs.
 * Added support for epsilon-based convergence in `PageRankVertexProgram`.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ff6bdf4/gremlin-core/api-changes.json
----------------------------------------------------------------------
diff --git a/gremlin-core/api-changes.json b/gremlin-core/api-changes.json
index 2cac4ad..75e1d07 100644
--- a/gremlin-core/api-changes.json
+++ b/gremlin-core/api-changes.json
@@ -9,6 +9,78 @@
           "classSimpleName": "Builder",
           "methodName": "requiresVersion",
           "justification": "Graph providers may run into problems with the 
test suite if they do not have a way to detect the version and type of IO being 
requested of them so that they can provide the right version of their 
IoRegistry instances."
+        },
+        {
+          "code": "java.method.parameterTypeParameterChanged",
+          "old": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::to(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<E, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "new": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::to(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "oldType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<E extends 
java.lang.Object, org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "newType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "package": 
"org.apache.tinkerpop.gremlin.process.traversal.dsl.graph",
+          "classSimpleName": "DefaultGraphTraversal",
+          "methodName": "to",
+          "parameterIndex": "0",
+          "justification": "Generalized from E to ? to reduce overly 
complicated typing"
+        },
+        {
+          "code": "java.method.parameterTypeParameterChanged",
+          "old": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::from(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<E, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "new": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::from(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "oldType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<E extends 
java.lang.Object, org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "newType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "package": 
"org.apache.tinkerpop.gremlin.process.traversal.dsl.graph",
+          "classSimpleName": "DefaultGraphTraversal",
+          "methodName": "from",
+          "parameterIndex": "0",
+          "justification": "Generalized from E to ? to reduce overly 
complicated typing"
+        },
+        {
+          "code": "java.method.parameterTypeParameterChanged",
+          "old": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::to(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<E, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "new": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::to(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "oldType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<E extends 
java.lang.Object, org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "newType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "package": 
"org.apache.tinkerpop.gremlin.process.traversal.dsl.graph",
+          "classSimpleName": "GraphTraversal",
+          "methodName": "to",
+          "parameterIndex": "0",
+          "justification": "Generalized from E to ? to reduce overly 
complicated typing"
+        },
+        {
+          "code": "java.method.parameterTypeParameterChanged",
+          "old": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::from(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<E, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "new": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::from(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "oldType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<E extends 
java.lang.Object, org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "newType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "package": 
"org.apache.tinkerpop.gremlin.process.traversal.dsl.graph",
+          "classSimpleName": "GraphTraversal",
+          "methodName": "from",
+          "parameterIndex": "0",
+          "justification": "Generalized from E to ? to reduce overly 
complicated typing"
+        },
+        {
+          "code": "java.method.parameterTypeParameterChanged",
+          "old": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::to(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<E, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "new": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::to(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "oldType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<E extends 
java.lang.Object, org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "newType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "package": 
"org.apache.tinkerpop.gremlin.process.traversal.dsl.graph",
+          "classSimpleName": "Admin",
+          "methodName": "to",
+          "parameterIndex": "0",
+          "justification": "Generalized from E to ? to reduce overly 
complicated typing"
+        },
+        {
+          "code": "java.method.parameterTypeParameterChanged",
+          "old": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::from(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<E, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "new": "method parameter 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, E> 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal<S, 
E>::from(===org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>===)",
+          "oldType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<E extends 
java.lang.Object, org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "newType": 
"org.apache.tinkerpop.gremlin.process.traversal.Traversal<?, 
org.apache.tinkerpop.gremlin.structure.Vertex>",
+          "package": 
"org.apache.tinkerpop.gremlin.process.traversal.dsl.graph",
+          "classSimpleName": "Admin",
+          "methodName": "from",
+          "parameterIndex": "0",
+          "justification": "Generalized from E to ? to reduce overly 
complicated typing"
         }
       ]
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ff6bdf4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index 470dd4b..f98e9e7 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -26,10 +26,12 @@ import com.squareup.javapoet.ParameterizedTypeName;
 import com.squareup.javapoet.TypeName;
 import com.squareup.javapoet.TypeSpec;
 import com.squareup.javapoet.TypeVariableName;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStartStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
@@ -245,7 +247,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
                     .addStatement("$N clone = this.clone()", 
ctx.traversalSourceClazz)
                     .addStatement("clone.getBytecode().addStep($T.addV)", 
GraphTraversal.Symbols.class)
                     .addStatement("$N traversal = new $N(clone)", 
ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
-                    .addStatement("return ($T) traversal.asAdmin().addStep(new 
$T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
+                    .addStatement("return ($T) traversal.asAdmin().addStep(new 
$T(traversal, (String) null))", ctx.traversalClassName, 
AddVertexStartStep.class)
                     .returns(ParameterizedTypeName.get(ctx.traversalClassName, 
ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
                     .build());
             traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
@@ -258,6 +260,36 @@ public class GremlinDslProcessor extends AbstractProcessor 
{
                     .addStatement("return ($T) traversal.asAdmin().addStep(new 
$T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
                     .returns(ParameterizedTypeName.get(ctx.traversalClassName, 
ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
                     .build());
+            traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+                    .addModifiers(Modifier.PUBLIC)
+                    .addAnnotation(Override.class)
+                    .addParameter(Traversal.class, "vertexLabelTraversal")
+                    .addStatement("$N clone = this.clone()", 
ctx.traversalSourceClazz)
+                    .addStatement("clone.getBytecode().addStep($T.addV, 
vertexLabelTraversal)", GraphTraversal.Symbols.class)
+                    .addStatement("$N traversal = new $N(clone)", 
ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+                    .addStatement("return ($T) traversal.asAdmin().addStep(new 
$T(traversal, vertexLabelTraversal))", ctx.traversalClassName, 
AddVertexStartStep.class)
+                    .returns(ParameterizedTypeName.get(ctx.traversalClassName, 
ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+                    .build());
+            traversalSourceClass.addMethod(MethodSpec.methodBuilder("addE")
+                    .addModifiers(Modifier.PUBLIC)
+                    .addAnnotation(Override.class)
+                    .addParameter(String.class, "label")
+                    .addStatement("$N clone = this.clone()", 
ctx.traversalSourceClazz)
+                    .addStatement("clone.getBytecode().addStep($T.addV, 
label)", GraphTraversal.Symbols.class)
+                    .addStatement("$N traversal = new $N(clone)", 
ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+                    .addStatement("return ($T) traversal.asAdmin().addStep(new 
$T(traversal, label))", ctx.traversalClassName, AddEdgeStartStep.class)
+                    .returns(ParameterizedTypeName.get(ctx.traversalClassName, 
ClassName.get(Edge.class), ClassName.get(Edge.class)))
+                    .build());
+            traversalSourceClass.addMethod(MethodSpec.methodBuilder("addE")
+                    .addModifiers(Modifier.PUBLIC)
+                    .addAnnotation(Override.class)
+                    .addParameter(Traversal.class, "edgeLabelTraversal")
+                    .addStatement("$N clone = this.clone()", 
ctx.traversalSourceClazz)
+                    .addStatement("clone.getBytecode().addStep($T.addV, 
edgeLabelTraversal)", GraphTraversal.Symbols.class)
+                    .addStatement("$N traversal = new $N(clone)", 
ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+                    .addStatement("return ($T) traversal.asAdmin().addStep(new 
$T(traversal, edgeLabelTraversal))", ctx.traversalClassName, 
AddEdgeStartStep.class)
+                    .returns(ParameterizedTypeName.get(ctx.traversalClassName, 
ClassName.get(Edge.class), ClassName.get(Edge.class)))
+                    .build());
             traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
                     .addModifiers(Modifier.PUBLIC)
                     .addAnnotation(Override.class)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ff6bdf4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index e64b233..44a7a3a 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -968,7 +968,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, 
E> {
      * @since 3.3.1
      */
     public default GraphTraversal<S, Vertex> addV(final Traversal<?, String> 
vertexLabelTraversal) {
-        this.asAdmin().getBytecode().addStep(Symbols.addV);
+        this.asAdmin().getBytecode().addStep(Symbols.addV, 
vertexLabelTraversal);
         return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), 
vertexLabelTraversal.asAdmin()));
     }
 
@@ -1005,7 +1005,7 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @since 3.3.1
      */
     public default GraphTraversal<S, Edge> addE(final Traversal<?, String> 
edgeLabelTraversal) {
-        this.asAdmin().getBytecode().addStep(Symbols.addE);
+        this.asAdmin().getBytecode().addStep(Symbols.addE, edgeLabelTraversal);
         return this.asAdmin().addStep(new AddEdgeStep<>(this.asAdmin(), 
edgeLabelTraversal.asAdmin()));
     }
 
@@ -1046,7 +1046,7 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @see <a 
href="http://tinkerpop.apache.org/docs/${project.version}/reference/#addedge-step";
 target="_blank">Reference Documentation - From Step</a>
      * @since 3.1.0-incubating
      */
-    public default GraphTraversal<S, E> to(final Traversal<E, Vertex> 
toVertex) {
+    public default GraphTraversal<S, E> to(final Traversal<?, Vertex> 
toVertex) {
         this.asAdmin().getBytecode().addStep(Symbols.to, toVertex);
         ((FromToModulating) 
this.asAdmin().getEndStep()).addTo(toVertex.asAdmin());
         return this;
@@ -1061,7 +1061,7 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
      * @see <a 
href="http://tinkerpop.apache.org/docs/${project.version}/reference/#addedge-step";
 target="_blank">Reference Documentation - From Step</a>
      * @since 3.1.0-incubating
      */
-    public default GraphTraversal<S, E> from(final Traversal<E, Vertex> 
fromVertex) {
+    public default GraphTraversal<S, E> from(final Traversal<?, Vertex> 
fromVertex) {
         this.asAdmin().getBytecode().addStep(Symbols.from, fromVertex);
         ((FromToModulating) 
this.asAdmin().getEndStep()).addFrom(fromVertex.asAdmin());
         return this;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ff6bdf4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
index e5c023b..73f69a0 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
@@ -33,7 +33,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.ListCallbackRegistry;
-import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -66,7 +65,7 @@ public final class AddEdgeStartStep extends 
AbstractStep<Edge, Edge>
         this.parameters.set(this, T.label, edgeLabel);
     }
 
-    public AddEdgeStartStep(final Traversal.Admin traversal, final 
Traversal<?,String> edgeLabelTraversal) {
+    public AddEdgeStartStep(final Traversal.Admin traversal, final 
Traversal<?, String> edgeLabelTraversal) {
         super(traversal);
         this.parameters.set(this, T.label, edgeLabelTraversal);
     }
@@ -115,8 +114,7 @@ public final class AddEdgeStartStep extends 
AbstractStep<Edge, Edge>
             if (fromVertex instanceof Attachable)
                 fromVertex = ((Attachable<Vertex>) fromVertex)
                         
.attach(Attachable.Method.get(this.getTraversal().getGraph().orElse(EmptyGraph.instance())));
-            final String edgeLabel = this.parameters.get(T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
-
+            final String edgeLabel = (String) this.parameters.get(traverser, 
T.label, () -> Edge.DEFAULT_LABEL).get(0);
             final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, 
this.parameters.getKeyValues(traverser, TO, FROM, T.label));
             if (callbackRegistry != null) {
                 final Event.EdgeAddedEvent vae = new 
Event.EdgeAddedEvent(DetachedFactory.detach(edge, true));

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ff6bdf4/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
index 0bf2ba6..ba79a5b 100644
--- 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
+++ 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
@@ -36,10 +36,15 @@ import org.junit.runner.RunWith;
 import java.util.Arrays;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.Order.decr;
+import static org.apache.tinkerpop.gremlin.process.traversal.Scope.local;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.V;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select;
+import static org.apache.tinkerpop.gremlin.structure.Column.keys;
+import static org.apache.tinkerpop.gremlin.structure.Column.values;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
@@ -68,7 +73,9 @@ public abstract class AddEdgeTest extends 
AbstractGremlinProcessTest {
 
     public abstract Traversal<Edge, Edge> 
get_g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X(final Vertex a, final 
Vertex b);
 
-    public abstract Traversal<Vertex,Edge> 
get_g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX();
+    public abstract Traversal<Vertex, Edge> 
get_g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX();
+
+    public abstract Traversal<Edge, Edge> 
get_g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_decrX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX();
 
     ///////
 
@@ -261,17 +268,32 @@ public abstract class AddEdgeTest extends 
AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, 
feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
     public void 
g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX() 
{
-        final Traversal<Vertex,Edge> traversal =  
get_g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX();
+        final Traversal<Vertex, Edge> traversal = 
get_g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX();
         printTraversalForm(traversal);
-        final Edge edge =traversal.next();
+        final Edge edge = traversal.next();
         assertFalse(traversal.hasNext());
-        assertEquals("created",edge.label());
+        assertEquals("created", edge.label());
         assertEquals(convertToVertexId("marko"), edge.inVertex().id());
         assertEquals(convertToVertexId("lop"), edge.outVertex().id());
         assertEquals(6L, g.V().count().next().longValue());
         assertEquals(7L, g.E().count().next().longValue());
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, 
feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+    public void 
g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_decrX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX()
 {
+        final Traversal<Edge, Edge> traversal = 
get_g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_decrX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX();
+        printTraversalForm(traversal);
+        final Edge edge = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals("created", edge.label());
+        assertEquals(convertToVertexId("vadas"), edge.outVertex().id());
+        assertEquals(convertToVertexId("lop"), edge.inVertex().id());
+        assertEquals(6L, g.V().count().next().longValue());
+        assertEquals(7L, g.E().count().next().longValue());
+    }
+
     public static class Traversals extends AddEdgeTest {
 
         @Override
@@ -320,8 +342,13 @@ public abstract class AddEdgeTest extends 
AbstractGremlinProcessTest {
         }
 
         @Override
-        public Traversal<Vertex,Edge> 
get_g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX()
 {
-            return 
g.V().has("name","marko").as("a").outE("created").as("b").inV().addE(select("b").label()).to("a");
+        public Traversal<Vertex, Edge> 
get_g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX()
 {
+            return g.V().has("name", 
"marko").as("a").outE("created").as("b").inV().addE(select("b").label()).to("a");
+        }
+
+        @Override
+        public Traversal<Edge, Edge> 
get_g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_decrX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX()
 {
+            return 
g.addE(V().outE().label().groupCount().order(local).by(values, 
decr).select(keys).<String>unfold().limit(1)).from(V().has("name", 
"vadas")).to(V().has("name", "lop"));
         }
     }
 }

Reply via email to