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")); } } }
