This is an automated email from the ASF dual-hosted git repository. dkuppitz pushed a commit to branch TINKERPOP-2059 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/TINKERPOP-2059 by this push: new e3c2e29 Added changes suggested by @spmallette. e3c2e29 is described below commit e3c2e295cdbb7e4713f5a764f26eaedd6be12e06 Author: Daniel Kuppitz <daniel_kupp...@hotmail.com> AuthorDate: Mon Nov 5 16:23:49 2018 -0700 Added changes suggested by @spmallette. --- docs/src/upgrade/release-3.4.x.asciidoc | 6 +++ .../traversal/dsl/graph/GraphTraversal.java | 2 + .../gremlin/process/traversal/dsl/graph/__.java | 2 + .../traversal/step/map/PropertyMapStepTest.java | 4 ++ gremlin-test/features/map/AddVertex.feature | 25 ++++++++++++ gremlin-test/features/map/ValueMap.feature | 45 ++++++++++++++++++++++ .../process/traversal/step/map/AddVertexTest.java | 22 +++++++++++ 7 files changed, 106 insertions(+) diff --git a/docs/src/upgrade/release-3.4.x.asciidoc b/docs/src/upgrade/release-3.4.x.asciidoc index 3d38ae3..618a96b 100644 --- a/docs/src/upgrade/release-3.4.x.asciidoc +++ b/docs/src/upgrade/release-3.4.x.asciidoc @@ -93,6 +93,12 @@ gremlin> g.V().has("person","name","marko").properties("location").valueMap().wi ==>[value:santa fe,startTime:2005] ``` +As shown above, the support of the `with()` modulator for `valueMap()` makes the `valueMap(boolean)` overload superfluous, hence this overload is now deprecated. This is a breaking API change, since +`valueMap()` will now always yield instances of type `Map<Object, Object>`. Prior this change only the `valueMap(boolean)` overload yielded `Map<Object, Object>` objects, `valueMap()` without the +boolean parameter used to yield instances of type `Map<String, Object>`. + +See: link:https://issues.apache.org/jira/browse/TINKERPOP-2059[TINKERPOP-2059] + ==== Changed number comparison behavior of within()/without() predicates In previous versions `within()` and `without()` performed strict number comparisons; that means these predicates did not only compare number values, but also the time. This was inconsistent with 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 fc24459..1ef0be7 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 @@ -575,6 +575,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertyMapStep}. * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#valuemap-step" target="_blank">Reference Documentation - ValueMap Step</a> * @since 3.0.0-incubating + * @deprecated As of release 3.4.0, deprecated in favor of {@link GraphTraversal#valueMap(String...)} in conjunction with + * {@link GraphTraversal#with(String, Object)}. */ @Deprecated public default <E2> GraphTraversal<S, Map<Object, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) { 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 4361f29..c0f9cad 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 @@ -262,6 +262,8 @@ public class __ { /** * @see GraphTraversal#valueMap(boolean, String...) + * @deprecated As of release 3.4.0, deprecated in favor of {@link __#valueMap(String...)} in conjunction with + * {@link GraphTraversal#with(String, Object)}. */ @Deprecated public static <A extends Element, B> GraphTraversal<A, Map<Object, B>> valueMap(final boolean includeTokens, final String... propertyKeys) { diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStepTest.java index c46950e..bdfeadd 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStepTest.java @@ -38,6 +38,10 @@ public class PropertyMapStepTest extends StepTest { __.valueMap("name"), __.valueMap("age"), __.valueMap("name", "age"), + __.valueMap(true), + __.valueMap(true, "name"), + __.valueMap(true, "age"), + __.valueMap(true, "name", "age"), __.valueMap().with(WithOptions.tokens), __.valueMap("name").with(WithOptions.tokens), __.valueMap("age").with(WithOptions.tokens), diff --git a/gremlin-test/features/map/AddVertex.feature b/gremlin-test/features/map/AddVertex.feature index a60fefb..1bb3ce1 100644 --- a/gremlin-test/features/map/AddVertex.feature +++ b/gremlin-test/features/map/AddVertex.feature @@ -336,6 +336,31 @@ Feature: Step - addV() | marko | And the graph should return 2 for count of "g.V().has(\"name\",\"marko\")" + Scenario: g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMapXtrueX + Given the empty graph + And the graph initializer of + """ + g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko"). + addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas"). + addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop"). + addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh"). + addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple"). + addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter'). + addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5). + addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0). + addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4). + addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0). + addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4). + addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2) + """ + And the traversal of + """ + g.V().as("a").has("name", "marko").out("created").as("b").addV(__.select("a").label()).property("test", __.select("b").label()).valueMap(true) + """ + When iterated to list + Then the result should have a count of 1 + And the graph should return 1 for count of "g.V().has(\"person\",\"test\",\"software\")" + Scenario: g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX Given the empty graph And the graph initializer of diff --git a/gremlin-test/features/map/ValueMap.feature b/gremlin-test/features/map/ValueMap.feature index e8880f8..82aaffd 100644 --- a/gremlin-test/features/map/ValueMap.feature +++ b/gremlin-test/features/map/ValueMap.feature @@ -33,6 +33,22 @@ Feature: Step - valueMap() | m[{"name": ["lop"], "lang": ["java"]}] | | m[{"name": ["ripple"], "lang": ["java"]}] | + Scenario: g_V_valueMapXtrueX + Given the modern graph + And the traversal of + """ + g.V().valueMap(true) + """ + When iterated to list + Then the result should be unordered + | result | + | m[{"t[id]": "v[marko].id", "t[label]": "person", "name": ["marko"], "age": [29]}] | + | m[{"t[id]": "v[josh].id", "t[label]": "person", "name": ["josh"], "age": [32]}] | + | m[{"t[id]": "v[peter].id", "t[label]": "person", "name": ["peter"], "age": [35]}] | + | m[{"t[id]": "v[vadas].id", "t[label]": "person", "name": ["vadas"], "age": [27]}] | + | m[{"t[id]": "v[lop].id", "t[label]": "software", "name": ["lop"], "lang": ["java"]}] | + | m[{"t[id]": "v[ripple].id", "t[label]": "software", "name": ["ripple"], "lang": ["java"]}] | + Scenario: g_V_valueMap_withXtokensX Given the modern graph And the traversal of @@ -65,6 +81,22 @@ Feature: Step - valueMap() | m[{"name": ["lop"]}] | | m[{"name": ["ripple"]}] | + Scenario: g_V_valueMapXtrue_name_ageX + Given the modern graph + And the traversal of + """ + g.V().valueMap(true, "name", "age") + """ + When iterated to list + Then the result should be unordered + | result | + | m[{"t[id]": "v[marko].id", "t[label]": "person", "name": ["marko"], "age": [29]}] | + | m[{"t[id]": "v[josh].id", "t[label]": "person", "name": ["josh"], "age": [32]}] | + | m[{"t[id]": "v[peter].id", "t[label]": "person", "name": ["peter"], "age": [35]}] | + | m[{"t[id]": "v[vadas].id", "t[label]": "person", "name": ["vadas"], "age": [27]}] | + | m[{"t[id]": "v[lop].id", "t[label]": "software", "name": ["lop"]}] | + | m[{"t[id]": "v[ripple].id", "t[label]": "software", "name": ["ripple"]}] | + Scenario: g_V_valueMapXname_ageX_withXtokensX Given the modern graph And the traversal of @@ -109,6 +141,19 @@ Feature: Step - valueMap() | result | | m[{"name": ["lop"], "lang": ["java"]}] | + Scenario: g_V_hasLabelXpersonX_filterXoutEXcreatedXX_valueMapXtrueX + Given the modern graph + And the traversal of + """ + g.V().hasLabel("person").filter(__.outE("created")).valueMap(true) + """ + When iterated to list + Then the result should be unordered + | result | + | m[{"name": ["marko"], "age": [29], "t[label]":"person", "t[id]":"v[marko].id"}] | + | m[{"name": ["josh"], "age": [32], "t[label]":"person", "t[id]":"v[josh].id"}] | + | m[{"name": ["peter"], "age": [35], "t[label]":"person", "t[id]":"v[peter].id"}] | + Scenario: g_V_hasLabelXpersonX_filterXoutEXcreatedXX_valueMap_withXtokensX Given the modern graph And the traversal of 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 21fbb8c..858f979 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 @@ -74,6 +74,8 @@ public abstract class AddVertexTest extends AbstractGremlinTest { public abstract Traversal<Vertex, String> get_g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name(); + public abstract Traversal<Vertex, Map<Object, Object>> get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMapXtrueX(); + public abstract Traversal<Vertex, Map<Object, Object>> get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX(); @Test @@ -286,6 +288,21 @@ public abstract class AddVertexTest extends AbstractGremlinTest { @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()); + } + + @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_valueMap_withXtokensX() { final Traversal<Vertex, Map<Object,Object>> traversal = get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX(); printTraversalForm(traversal); @@ -360,6 +377,11 @@ public abstract class AddVertexTest extends AbstractGremlinTest { } @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); + } + + @Override public Traversal<Vertex, Map<Object, Object>> get_g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX() { return g.V().as("a").has("name", "marko").out("created").as("b").addV(select("a").label()).property("test", select("b").label()).valueMap().with(WithOptions.tokens); }