added GraphTraversalSource.addV(traversal) and GraphTraversalSource.addE(traversal). Added 2 more test cases. One more to go. Updated upgrade docs accordingly.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f0dc7ff5 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f0dc7ff5 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f0dc7ff5 Branch: refs/heads/master Commit: f0dc7ff5d72e4ba8532326fe9b99c35b476f4b09 Parents: bd2c3b2 Author: Marko A. Rodriguez <[email protected]> Authored: Wed Sep 27 10:55:56 2017 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Wed Sep 27 10:55:56 2017 -0600 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 2 +- docs/src/upgrade/release-3.3.x.asciidoc | 6 +++ .../traversal/dsl/graph/GraphTraversal.java | 2 +- .../dsl/graph/GraphTraversalSource.java | 25 ++++++++----- .../traversal/step/map/AddEdgeStartStep.java | 5 +++ .../traversal/step/map/AddVertexStartStep.java | 5 +++ .../traversal/step/map/AddVertexTest.java | 39 ++++++++++++++++++++ 7 files changed, 73 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index c9d0509..fab4ade 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -25,7 +25,7 @@ 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 `addV(traversal)` and `addE(traversal)`, where created element labels can be determined dynamically. +* 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`. * Fixed two major bugs in how PageRank was being calculated in `PageRankVertexProgram`. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/docs/src/upgrade/release-3.3.x.asciidoc ---------------------------------------------------------------------- diff --git a/docs/src/upgrade/release-3.3.x.asciidoc b/docs/src/upgrade/release-3.3.x.asciidoc index fa50d47..e677995 100644 --- a/docs/src/upgrade/release-3.3.x.asciidoc +++ b/docs/src/upgrade/release-3.3.x.asciidoc @@ -29,6 +29,12 @@ Please see the link:https://github.com/apache/tinkerpop/blob/3.3.1/CHANGELOG.asc === Upgrading for Users +==== addV(traversal) and addE(traversal) + +The `GraphTraversal` and `GraphTraversalSource` methods of `addV()` and `addE()` have been extended to support dynamic +label determination upon element creation. Both these methods can take a `Traversal<?, String>` where the first `String` +returned by the traversal is used as the label of the respective element. + ==== PageRankVertexProgram There were two major bugs in the way in which PageRank was being calculated in `PageRankVertexProgram`. First, teleportation http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/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 d3de413..e64b233 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 @@ -981,7 +981,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { */ public default GraphTraversal<S, Vertex> addV() { this.asAdmin().getBytecode().addStep(Symbols.addV); - return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), Vertex.DEFAULT_LABEL)); + return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), (String) null)); } /** http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java index 2d4b94f..81a0a71 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java @@ -23,14 +23,11 @@ import org.apache.tinkerpop.gremlin.process.computer.Computer; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection; import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Bindings; import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; +import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine; -import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine; 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; @@ -39,14 +36,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Requir import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; -import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Transaction; import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.apache.tinkerpop.gremlin.structure.util.ElementHelper; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import java.util.ArrayList; -import java.util.List; import java.util.Optional; import java.util.function.BinaryOperator; import java.util.function.Supplier; @@ -261,11 +254,18 @@ public class GraphTraversalSource implements TraversalSource { return traversal.addStep(new AddVertexStartStep(traversal, label)); } + public GraphTraversal<Vertex, Vertex> addV(final Traversal<?, String> vertexLabelTraversal) { + final GraphTraversalSource clone = this.clone(); + clone.bytecode.addStep(GraphTraversal.Symbols.addV, vertexLabelTraversal); + final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(clone); + return traversal.addStep(new AddVertexStartStep(traversal, vertexLabelTraversal)); + } + public GraphTraversal<Vertex, Vertex> addV() { final GraphTraversalSource clone = this.clone(); clone.bytecode.addStep(GraphTraversal.Symbols.addV); final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(clone); - return traversal.addStep(new AddVertexStartStep(traversal, null)); + return traversal.addStep(new AddVertexStartStep(traversal, (String)null)); } public GraphTraversal<Edge, Edge> addE(final String label) { @@ -275,6 +275,13 @@ public class GraphTraversalSource implements TraversalSource { return traversal.addStep(new AddEdgeStartStep(traversal, label)); } + public GraphTraversal<Edge, Edge> addE(final Traversal<?, String> edgeLabelTraversal) { + final GraphTraversalSource clone = this.clone(); + clone.bytecode.addStep(GraphTraversal.Symbols.addE, edgeLabelTraversal); + final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(clone); + return traversal.addStep(new AddEdgeStartStep(traversal, edgeLabelTraversal)); + } + public <S> GraphTraversal<S, S> inject(S... starts) { final GraphTraversalSource clone = this.clone(); clone.bytecode.addStep(GraphTraversal.Symbols.inject, starts); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/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 e629453..e5c023b 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 @@ -66,6 +66,11 @@ 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) { + super(traversal); + this.parameters.set(this, T.label, edgeLabelTraversal); + } + @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { return this.parameters.getTraversals(); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java index 7de8839..bf95fe5 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java @@ -57,6 +57,11 @@ public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> this.parameters.set(this, T.label, label); } + public AddVertexStartStep(final Traversal.Admin traversal, final Traversal<?, String> vertexLabelTraversal) { + super(traversal); + this.parameters.set(this, T.label, vertexLabelTraversal); + } + @Override public Parameters getParameters() { return this.parameters; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0dc7ff5/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java index 584ead4..ad54dae 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.Map; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.V; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; @@ -72,6 +73,10 @@ public abstract class AddVertexTest extends AbstractGremlinTest { public abstract Traversal<Vertex, String> get_g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name(); + public abstract Traversal<Vertex, String> get_g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label(); + + public abstract Traversal<Vertex, Map<Object, Object>> get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMapXtrueX(); + @Test @LoadGraphWith(MODERN) @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES) @@ -273,6 +278,30 @@ public abstract class AddVertexTest extends AbstractGremlinTest { assertFalse(traversal.hasNext()); } + @Test + @LoadGraphWith(MODERN) + @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES) + public void g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label() { + final Traversal<Vertex, String> traversal = get_g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label(); + printTraversalForm(traversal); + assertEquals("name", traversal.next()); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES) + @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY) + public void g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMapXtrueX() { + final Traversal<Vertex, Map<Object,Object>> traversal = get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMapXtrueX(); + printTraversalForm(traversal); + final Map<Object,Object> map = traversal.next(); + assertFalse(traversal.hasNext()); + assertEquals("person",map.get(T.label)); + assertEquals("software",((List)map.get("test")).get(0)); + assertEquals(1, ((List)map.get("test")).size()); + assertEquals(3, map.size()); + } public static class Traversals extends AddVertexTest { @@ -330,5 +359,15 @@ public abstract class AddVertexTest extends AbstractGremlinTest { public Traversal<Vertex, String> get_g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name() { return g.withSideEffect("a", "marko").addV().property("name", select("a")).values("name"); } + + @Override + public Traversal<Vertex, String> get_g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label() { + return g.addV(V().has("name", "marko").properties("name").key()).label(); + } + + @Override + public Traversal<Vertex, Map<Object, Object>> get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMapXtrueX() { + return g.V().as("a").has("name", "marko").out("created").as("b").addV(select("a").label()).property("test", select("b").label()).valueMap(true); + } } } \ No newline at end of file
