Repository: tinkerpop Updated Branches: refs/heads/master f142174e9 -> bccdb4cb0
first push of working addV(traversal) and addE(traversal). I have only written one test case thus far. However, taking a break and pushing what I have. Need to write about 3 more test cases to be confident. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/bd2c3b27 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/bd2c3b27 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/bd2c3b27 Branch: refs/heads/master Commit: bd2c3b27059a50b87960a5bf270c5b9633bb8edc Parents: fa246a1 Author: Marko A. Rodriguez <[email protected]> Authored: Wed Sep 27 10:05:16 2017 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Wed Sep 27 10:05:16 2017 -0600 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + .../traversal/dsl/graph/GraphTraversal.java | 34 +++++++++++++++++--- .../gremlin/process/traversal/dsl/graph/__.java | 14 ++++++++ .../process/traversal/step/map/AddEdgeStep.java | 5 +++ .../traversal/step/map/AddVertexStep.java | 5 +++ .../process/traversal/step/map/AddEdgeTest.java | 22 +++++++++++++ 6 files changed, 76 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bd2c3b27/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 7f8c445..c9d0509 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -25,6 +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. * `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/bd2c3b27/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 a97c88b..d3de413 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 @@ -961,6 +961,18 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } /** + * Adds a {@link Vertex} with a vertex label determined by a {@link Traversal}. + * + * @return the traversal with the {@link AddVertexStep} added + * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#addvertex-step" target="_blank">Reference Documentation - AddVertex Step</a> + * @since 3.3.1 + */ + public default GraphTraversal<S, Vertex> addV(final Traversal<?, String> vertexLabelTraversal) { + this.asAdmin().getBytecode().addStep(Symbols.addV); + return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), vertexLabelTraversal.asAdmin())); + } + + /** * Adds a {@link Vertex} with a default vertex label. * * @return the traversal with the {@link AddVertexStep} added @@ -969,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(), null)); + return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), Vertex.DEFAULT_LABEL)); } /** @@ -986,6 +998,18 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } /** + * Adds a {@link Edge} with an edge label determined by a {@link Traversal}. + * + * @return the traversal with the {@link AddEdgeStep} added + * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#addedge-step" target="_blank">Reference Documentation - AddEdge Step</a> + * @since 3.3.1 + */ + public default GraphTraversal<S, Edge> addE(final Traversal<?, String> edgeLabelTraversal) { + this.asAdmin().getBytecode().addStep(Symbols.addE); + return this.asAdmin().addStep(new AddEdgeStep<>(this.asAdmin(), edgeLabelTraversal.asAdmin())); + } + + /** * Provide {@code to()}-modulation to respective steps. * * @param toStepLabel the step label to modulate to. @@ -1359,7 +1383,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { */ public default GraphTraversal<S, E> has(final String propertyKey) { this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey); - return this.asAdmin().addStep(new TraversalFilterStep(this.asAdmin(), __.values(propertyKey))); + return this.asAdmin().addStep(new TraversalFilterStep(this.asAdmin(), __.values(propertyKey))); } /** @@ -1708,8 +1732,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * * @param skip the number of objects to skip * @return the traversal with an appended {@link RangeGlobalStep} - * @since 3.3.0 * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#skip-step" target="_blank">Reference Documentation - Skip Step</a> + * @since 3.3.0 */ public default GraphTraversal<S, E> skip(final long skip) { this.asAdmin().getBytecode().addStep(Symbols.skip, skip); @@ -1720,10 +1744,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * Filters out the first {@code n} objects in the traversal. * * @param scope the scope of how to apply the {@code tail} - * @param skip the number of objects to skip + * @param skip the number of objects to skip * @return the traversal with an appended {@link RangeGlobalStep} or {@link RangeLocalStep} depending on {@code scope} - * @since 3.3.0 * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#skip-step" target="_blank">Reference Documentation - Skip Step</a> + * @since 3.3.0 */ public default <E2> GraphTraversal<S, E2> skip(final Scope scope, final long skip) { this.asAdmin().getBytecode().addStep(Symbols.skip, scope, skip); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bd2c3b27/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 a1b40e3..9dc3a93 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 @@ -471,6 +471,13 @@ public class __ { } /** + * @see GraphTraversal#addV(org.apache.tinkerpop.gremlin.process.traversal.Traversal) + */ + public static <A> GraphTraversal<A, Vertex> addV(final Traversal<?, String> vertexLabelTraversal) { + return __.<A>start().addV(vertexLabelTraversal); + } + + /** * @see GraphTraversal#addV() */ public static <A> GraphTraversal<A, Vertex> addV() { @@ -484,6 +491,13 @@ public class __ { return __.<A>start().addE(edgeLabel); } + /** + * @see GraphTraversal#addE(org.apache.tinkerpop.gremlin.process.traversal.Traversal) + */ + public static <A> GraphTraversal<A, Edge> addE(final Traversal<?, String> edgeLabelTraversal) { + return __.<A>start().addE(edgeLabelTraversal); + } + ///////////////////// FILTER STEPS ///////////////////// /** http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/bd2c3b27/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java index efe5906..3455e2c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java @@ -60,6 +60,11 @@ public final class AddEdgeStep<S> extends MapStep<S, Edge> this.parameters.set(this, T.label, edgeLabel); } + public AddEdgeStep(final Traversal.Admin traversal, final Traversal.Admin<S,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/bd2c3b27/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java index c35fa80..6faa3d5 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java @@ -52,6 +52,11 @@ public final class AddVertexStep<S> extends MapStep<S, Vertex> this.parameters.set(this, T.label, label); } + public AddVertexStep(final Traversal.Admin traversal, final Traversal.Admin<S,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/bd2c3b27/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 59ac1e9..0bf2ba6 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 @@ -68,6 +68,8 @@ 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(); + /////// @Test @@ -255,6 +257,21 @@ public abstract class AddEdgeTest extends AbstractGremlinProcessTest { 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_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(); + assertFalse(traversal.hasNext()); + 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()); + } + public static class Traversals extends AddEdgeTest { @Override @@ -301,5 +318,10 @@ public abstract class AddEdgeTest extends AbstractGremlinProcessTest { public Traversal<Edge, Edge> get_g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X(final Vertex a, final Vertex b) { return g.addE("knows").from(a).to(b).property("weight", 0.1d); } + + @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"); + } } }
