This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2611 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 4d83e1573e1c700469824409c1357b03d31cd617 Author: Stephen Mallette <[email protected]> AuthorDate: Fri Nov 5 13:42:56 2021 -0400 TINKERPOP-2611 Prevented null T values to addV() and property() This was allowed in 3.5.x when nulls were added but it could lead to confusing situations. It's a breaking change so users will need to switch to take a bit of care when calling these methods. --- CHANGELOG.asciidoc | 1 + docs/src/upgrade/release-3.6.x.asciidoc | 13 +++++++++++ .../traversal/dsl/graph/GraphTraversal.java | 9 ++++++-- .../traversal/dsl/graph/GraphTraversalSource.java | 11 +++++----- .../dsl/graph/GraphTraversalSourceTest.java | 14 ++++++++++++ .../traversal/dsl/graph/GraphTraversalTest.java | 25 ++++++++++++++++++++++ .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 1 - .../gremlin-javascript/test/cucumber/gremlin.js | 1 - gremlin-python/src/main/python/radish/gremlin.py | 1 - gremlin-test/features/map/AddVertex.feature | 10 --------- .../process/traversal/step/map/AddVertexTest.java | 22 ------------------- 11 files changed, 66 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index d3fc76a..a3ad924 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -24,6 +24,7 @@ limitations under the License. === TinkerPop 3.6.0 (Release Date: NOT OFFICIALLY RELEASED YET) * Changed TinkerGraph to allow identifiers to be heterogeneous when filtering. +* Prevented values of `T` to `property()` from being `null`. * Fixed query indentation for profile metrics where indent levels were not being respected. * `TraversalOpProcessor` no longer accepts a `String` representation of `Bytecode` for the "gremlin" argument which was left to support older versions of the drivers. * Removed requirement that "ids" used to filter vertices and edges need to be all of a single type. diff --git a/docs/src/upgrade/release-3.6.x.asciidoc b/docs/src/upgrade/release-3.6.x.asciidoc index 80626f8..e6fa3ca 100644 --- a/docs/src/upgrade/release-3.6.x.asciidoc +++ b/docs/src/upgrade/release-3.6.x.asciidoc @@ -49,6 +49,19 @@ package is now explicitly associated to `gremlin-groovy` but as an `<optional>` See:link:https://issues.apache.org/jira/browse/TINKERPOP-2411[TINKERPOP-2411] +==== Null for T + +In 3.5.x, calling `property()` with a key that is of type `T` and a value that is `null` or calling `addV()` with a +`null` label is processed as a valid traversal and default values are used. That approach allows opportunities for +unexpected problems should a variable being passed as a parameter end up accidentally shifting to `null` without the +caller's knowledge. Starting in 3.6.0, such traversals will generate an exception during construction of the traversal. + +It is still possible to call `addV()` with no arguments to assume a default `label` and `id` generation remains +implementation specific with some graphs accepting `id` and others ignoring it to generate their own. Both value of +`T` remain immutable. + +See: link:https://issues.apache.org/jira/browse/TINKERPOP-2611[TINKERPOP-2611] + ==== Logging Changes In Gremlin Server and Gremlin Console distributions, the default logging implementation of log4j 1.2.x has been 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 9a45300..9cfe3f9 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 @@ -1036,6 +1036,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @since 3.1.0-incubating */ public default GraphTraversal<S, Vertex> addV(final String vertexLabel) { + if (null == vertexLabel) throw new IllegalArgumentException("vertexLabel cannot be null"); this.asAdmin().getBytecode().addStep(Symbols.addV, vertexLabel); return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), vertexLabel)); } @@ -1048,8 +1049,9 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @since 3.3.1 */ public default GraphTraversal<S, Vertex> addV(final Traversal<?, String> vertexLabelTraversal) { + if (null == vertexLabelTraversal) throw new IllegalArgumentException("vertexLabelTraversal cannot be null"); this.asAdmin().getBytecode().addStep(Symbols.addV, vertexLabelTraversal); - return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), null == vertexLabelTraversal ? null : vertexLabelTraversal.asAdmin())); + return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), vertexLabelTraversal.asAdmin())); } /** @@ -2244,13 +2246,16 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @param cardinality the specified cardinality of the property where {@code null} will allow the {@link Graph} * to use its default settings * @param key the key for the property - * @param value the value for the property + * @param value the value for the property which may not be null if the {@code key} is of type {@link T} * @param keyValues any meta properties to be assigned to this property * @return the traversal with the last step modified to add a property * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#addproperty-step" target="_blank">AddProperty Step</a> * @since 3.0.0-incubating */ public default GraphTraversal<S, E> property(final VertexProperty.Cardinality cardinality, final Object key, final Object value, final Object... keyValues) { + if (key instanceof T && null == value) + throw new IllegalArgumentException("Value of T cannot be null"); + if (null == cardinality) this.asAdmin().getBytecode().addStep(Symbols.property, key, value, keyValues); else 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 b7471b1..402af8a 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 @@ -295,16 +295,16 @@ public class GraphTraversalSource implements TraversalSource { //// SPAWNS - /** * Spawns a {@link GraphTraversal} by adding a vertex with the specified label. If the {@code label} is * {@code null} then it will default to {@link Vertex#DEFAULT_LABEL}. */ - public GraphTraversal<Vertex, Vertex> addV(final String label) { + public GraphTraversal<Vertex, Vertex> addV(final String vertexLabel) { + if (null == vertexLabel) throw new IllegalArgumentException("vertexLabel cannot be null"); final GraphTraversalSource clone = this.clone(); - clone.bytecode.addStep(GraphTraversal.Symbols.addV, label); + clone.bytecode.addStep(GraphTraversal.Symbols.addV, vertexLabel); final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(clone); - return traversal.addStep(new AddVertexStartStep(traversal, label)); + return traversal.addStep(new AddVertexStartStep(traversal, vertexLabel)); } /** @@ -312,6 +312,7 @@ public class GraphTraversalSource implements TraversalSource { * {@code vertexLabelTraversal} is {@code null} then it will default to {@link Vertex#DEFAULT_LABEL}. */ public GraphTraversal<Vertex, Vertex> addV(final Traversal<?, String> vertexLabelTraversal) { + if (null == vertexLabelTraversal) throw new IllegalArgumentException("vertexLabelTraversal cannot be null"); final GraphTraversalSource clone = this.clone(); clone.bytecode.addStep(GraphTraversal.Symbols.addV, vertexLabelTraversal); final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(clone); @@ -325,7 +326,7 @@ public class GraphTraversalSource implements TraversalSource { 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, (String)null)); + return traversal.addStep(new AddVertexStartStep(traversal, (String) null)); } /** diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSourceTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSourceTest.java index fe60d6b..7c4848c 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSourceTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSourceTest.java @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph; import org.apache.commons.configuration2.MapConfiguration; import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection; +import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph; @@ -38,6 +39,9 @@ import static org.mockito.Mockito.verify; * @author Stephen Mallette (http://stephen.genoprime.com) */ public class GraphTraversalSourceTest { + + private static final GraphTraversalSource g = traversal().withEmbedded(EmptyGraph.instance()); + @Test public void shouldCloseRemoteConnectionOnWithRemote() throws Exception { final RemoteConnection mock = mock(RemoteConnection.class); @@ -66,4 +70,14 @@ public class GraphTraversalSourceTest { g = g.withoutStrategies(ReadOnlyStrategy.class); assertFalse(g.getStrategies().getStrategy(ReadOnlyStrategy.class).isPresent()); } + + @Test(expected = IllegalArgumentException.class) + public void shouldFailAddVWithNullVertexLabel() { + g.addV((String) null); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldFailAddVWithNullVertexLabelTraversal() { + g.addV((Traversal<?, String>) null); + } } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java index 166c890..2ffe7bc 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java @@ -22,6 +22,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.VertexProperty; +import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +38,7 @@ import java.util.Random; import java.util.Set; import java.util.function.Consumer; +import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal; import static org.junit.Assert.assertEquals; /** @@ -43,11 +47,32 @@ import static org.junit.Assert.assertEquals; */ public class GraphTraversalTest { private static final Logger logger = LoggerFactory.getLogger(GraphTraversalTest.class); + private static final GraphTraversalSource g = traversal().withEmbedded(EmptyGraph.instance()); private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "read", "write", "with", "option", "iterate", "to", "from", "profile", "pageRank", "connectedComponent", "peerPressure", "shortestPath", "program", "none")); private static Set<String> NO_ANONYMOUS = new HashSet<>(Arrays.asList("start", "__")); private static Set<String> IGNORES_BYTECODE = new HashSet<>(Arrays.asList("asAdmin", "read", "write", "iterate")); + @Test(expected = IllegalArgumentException.class) + public void shouldFailPropertyWithNullVertexId() { + g.addV().property(T.id, null); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldFailPropertyWithNullVertexLabel() { + g.addV().property(T.label, null); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldFailPropertyWithCardinalityNullVertexId() { + g.addV().property(VertexProperty.Cardinality.single, T.id, null); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldFailPropertyWithCardinalityNullVertexLabel() { + g.addV().property(VertexProperty.Cardinality.single, T.label, null); + } + @Test public void shouldHaveMethodsOfGraphTraversalOnAnonymousGraphTraversal() { for (Method methodA : GraphTraversal.class.getMethods()) { diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index 2c8d242..0bc0c03 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -355,7 +355,6 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripp [...] {"g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property( [...] {"g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Pro [...] - {"g_addVXnullX_propertyXid_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) null).Property(T.Id,null), (g,p) =>g.V().HasLabel("vertex")}}, {"g_addV_propertyXlabel_personX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property(T.Label,"person"), (g,p) =>g.V().HasLabel("person")}}, {"g_addVXpersonX_propertyXname_joshX_propertyXage_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","josh").Property("age",null), (g,p) =>g.V().Has("person","age",(object) null)}}, {"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("friendWeight",null,"acl",null), (g,p) =>g.V().Has("person","name","marko").Has("friendWeight",(object) null), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Has("acl",(object) null), (g,p) =>g.V().Has("person","name","marko").Prop [...] diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js index 8507405..48eb0cc 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js @@ -344,7 +344,6 @@ const gremlins = { g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","pet [...] g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lan [...] g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").pro [...] - g_addVXnullX_propertyXid_nullX: [function({g}) { return g.addV(null).property(T.id,null) }, function({g}) { return g.V().hasLabel("vertex") }], g_addV_propertyXlabel_personX: [function({g}) { return g.addV().property(T.label,"person") }, function({g}) { return g.V().hasLabel("person") }], g_addVXpersonX_propertyXname_joshX_propertyXage_nullX: [function({g}) { return g.addV("person").property("name","josh").property("age",null) }, function({g}) { return g.V().has("person","age",null) }], g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX: [function({g}) { return g.addV("person").property("name","marko").property("friendWeight",null,"acl",null) }, function({g}) { return g.V().has("person","name","marko").has("friendWeight",null) }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").has("acl",null) }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").count() }], diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py index 5f9535a..19c64b8 100644 --- a/gremlin-python/src/main/python/radish/gremlin.py +++ b/gremlin-python/src/main/python/radish/gremlin.py @@ -329,7 +329,6 @@ world.gremlins = { 'g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').p [...] 'g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','jav [...] 'g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property( [...] - 'g_addVXnullX_propertyXid_nullX': [(lambda g:g.addV(None).property(T.id,None)), (lambda g:g.V().hasLabel('vertex'))], 'g_addV_propertyXlabel_personX': [(lambda g:g.addV().property(T.label,'person')), (lambda g:g.V().hasLabel('person'))], 'g_addVXpersonX_propertyXname_joshX_propertyXage_nullX': [(lambda g:g.addV('person').property('name','josh').property('age',None)), (lambda g:g.V().has('person','age',None))], 'g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX': [(lambda g:g.addV('person').property('name','marko').property('friendWeight',None,'acl',None)), (lambda g:g.V().has('person','name','marko').has('friendWeight',None)), (lambda g:g.V().has('person','name','marko').properties('friendWeight').has('acl',None)), (lambda g:g.V().has('person','name','marko').properties('friendWeight').count())], diff --git a/gremlin-test/features/map/AddVertex.feature b/gremlin-test/features/map/AddVertex.feature index c149d89..a47369e 100644 --- a/gremlin-test/features/map/AddVertex.feature +++ b/gremlin-test/features/map/AddVertex.feature @@ -419,16 +419,6 @@ Feature: Step - addV() | result | | name | - Scenario: g_addVXnullX_propertyXid_nullX - Given the empty graph - And the traversal of - """ - g.addV(null).property(T.id, null) - """ - When iterated to list - Then the result should have a count of 1 - And the graph should return 1 for count of "g.V().hasLabel(\"vertex\")" - Scenario: g_addV_propertyXlabel_personX Given the empty 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 ad0e1dd..a82a3ef 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 @@ -61,8 +61,6 @@ public abstract class AddVertexTest extends AbstractGremlinTest { public abstract Traversal<Vertex, Vertex> get_g_V_hasLabelXpersonX_propertyXname_nullX(); - public abstract Traversal<Vertex, Vertex> get_g_addVXnullX_propertyXid_nullX(); - public abstract Traversal<Vertex, Vertex> get_g_addV_propertyXlabel_personX(); public abstract Traversal<Vertex, Vertex> get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX(); @@ -122,20 +120,6 @@ public abstract class AddVertexTest extends AbstractGremlinTest { @Test @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_addVXnullX_propertyXid_nullX() { - final Traversal<Vertex, Vertex> traversal = get_g_addVXnullX_propertyXid_nullX(); - printTraversalForm(traversal); - - final Vertex vertex = traversal.next(); - assertEquals(Vertex.DEFAULT_LABEL, vertex.label()); - - // should generate an id for the null value - assertNotNull(vertex.id()); - } - - @Test - @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_addV_propertyXlabel_personX() { final Traversal<Vertex, Vertex> traversal = get_g_addV_propertyXlabel_personX(); printTraversalForm(traversal); @@ -412,12 +396,6 @@ public abstract class AddVertexTest extends AbstractGremlinTest { } @Override - public Traversal<Vertex, Vertex> get_g_addVXnullX_propertyXid_nullX() { - // testing Traversal but should work the same for String - return g.addV((Traversal.Admin<?, String>) null).property(T.id, null); - } - - @Override public Traversal<Vertex, Vertex> get_g_addV_propertyXlabel_personX() { return g.addV().property(T.label, "person"); }
