blob: c8b3c66e61480fddc29c6e2252ccd2a24b1f7817 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tinkerpop.gremlin.structure;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.ExceptionCoverage;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@ExceptionCoverage(exceptionClass = Vertex.Exceptions.class, methods = {
"multiplePropertiesExistForProvidedKey",
})
@RunWith(Enclosed.class)
public class VertexPropertyTest extends AbstractGremlinTest {
public static class BasicVertexProperty 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)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
public void shouldValidateEquality() {
final Vertex v = graph.addVertex();
final VertexProperty vp1 = v.property(VertexProperty.Cardinality.single, "x", 0);
final VertexProperty vp2 = v.property(VertexProperty.Cardinality.single, "y", 1);
assertEquals(vp1, vp1);
assertEquals(vp2, vp2);
assertNotEquals(vp1, vp2);
}
@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)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
public void shouldValidateIdEquality() {
final Vertex v = graph.addVertex();
final VertexProperty vp1 = v.property(VertexProperty.Cardinality.single, "x", 0);
final VertexProperty vp2 = v.property(VertexProperty.Cardinality.single, "y", 1);
assertEquals(vp1.id(), vp1.id());
assertEquals(vp2.id(), vp2.id());
assertEquals(vp1.id().toString(), vp1.id().toString());
assertEquals(vp2.id().toString(), vp2.id().toString());
assertNotEquals(vp1.id(), vp2.id());
assertNotEquals(vp1.id().toString(), vp2.id().toString());
}
}
public static class VertexPropertyAddition extends AbstractGremlinTest {
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_USER_SUPPLIED_IDS)
public void shouldAllowIdAssignment() {
final Vertex v = graph.addVertex();
final Object id = graphProvider.convertId(123131231l, VertexProperty.class);
v.property(VertexProperty.Cardinality.single, "name", "stephen", T.id, id);
tryCommit(graph, g -> assertEquals(id, v.property("name").id()));
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
public void shouldSetLabelOfVertexPropertyToKeyOfOwningProperty() {
final Vertex v = graph.addVertex("name", "stephen");
tryCommit(graph, g -> assertEquals("name", v.property("name").label()));
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_NULL_PROPERTY_VALUES, supported = false)
public void shouldHandleListVertexPropertiesWithoutNullPropertyValues() {
final Vertex v = graph.addVertex("name", "marko", "age", 34);
tryCommit(graph, g -> {
assertEquals("marko", v.property("name").value());
assertEquals("marko", v.value("name"));
assertEquals(34, v.property("age").value());
assertEquals(34, v.<Integer>value("age").intValue());
assertEquals(1, IteratorUtils.count(v.properties("name")));
assertEquals(2, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
final VertexProperty<String> property = v.property(VertexProperty.Cardinality.list, "name", "marko a. rodriguez");
tryCommit(graph, g -> assertEquals(v, property.element()));
try {
v.property("name");
fail("This should throw a: " + Vertex.Exceptions.multiplePropertiesExistForProvidedKey("name"));
} catch (final Exception e) {
validateException(Vertex.Exceptions.multiplePropertiesExistForProvidedKey("name"), e);
}
assertTrue(IteratorUtils.list(v.values("name")).contains("marko"));
assertTrue(IteratorUtils.list(v.values("name")).contains("marko a. rodriguez"));
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(2, IteratorUtils.count(v.properties("name")));
assertVertexEdgeCounts(graph, 1, 0);
assertEquals(v, v.property(VertexProperty.Cardinality.list, "name", "mrodriguez").element());
tryCommit(graph, g -> {
assertEquals(3, IteratorUtils.count(v.properties("name")));
assertEquals(4, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
v.<String>properties("name").forEachRemaining(meta -> {
meta.property("counter", meta.value().length());
});
tryCommit(graph, g -> {
v.properties().forEachRemaining(meta -> {
assertEquals(meta.key(), meta.label());
assertTrue(meta.isPresent());
assertEquals(v, meta.element());
if (meta.key().equals("age")) {
assertEquals(meta.value(), 34);
assertEquals(0, IteratorUtils.count(meta.properties()));
}
if (meta.key().equals("name")) {
assertEquals(((String) meta.value()).length(), meta.<Integer>value("counter").intValue());
assertEquals(1, IteratorUtils.count(meta.properties()));
assertEquals(1, meta.keys().size());
assertTrue(meta.keys().contains("counter"));
}
});
assertVertexEdgeCounts(graph, 1, 0);
});
// null property values are not supported so the value should not be added as set or list cardinality,
// but single will remove it
assertEquals(VertexProperty.empty(), v.property(VertexProperty.Cardinality.list, "name", null));
tryCommit(graph, g -> {
assertEquals(3, IteratorUtils.count(v.properties("name")));
assertEquals(4, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
assertEquals(VertexProperty.empty(), v.property(VertexProperty.Cardinality.single, "name", null));
tryCommit(graph, g -> {
assertEquals(0, IteratorUtils.count(v.properties("name")));
assertEquals(1, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_NULL_PROPERTY_VALUES)
public void shouldHandleListVertexPropertiesWithNullPropertyValues() {
final Vertex v = graph.addVertex("name", "marko", "age", 34);
tryCommit(graph, g -> {
assertEquals("marko", v.property("name").value());
assertEquals("marko", v.value("name"));
assertEquals(34, v.property("age").value());
assertEquals(34, v.<Integer>value("age").intValue());
assertEquals(1, IteratorUtils.count(v.properties("name")));
assertEquals(2, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
final VertexProperty<String> property = v.property(VertexProperty.Cardinality.list, "name", "marko a. rodriguez");
tryCommit(graph, g -> assertEquals(v, property.element()));
try {
v.property("name");
fail("This should throw a: " + Vertex.Exceptions.multiplePropertiesExistForProvidedKey("name"));
} catch (final Exception e) {
validateException(Vertex.Exceptions.multiplePropertiesExistForProvidedKey("name"), e);
}
assertTrue(IteratorUtils.list(v.values("name")).contains("marko"));
assertTrue(IteratorUtils.list(v.values("name")).contains("marko a. rodriguez"));
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(2, IteratorUtils.count(v.properties("name")));
assertVertexEdgeCounts(graph, 1, 0);
assertEquals(v, v.property(VertexProperty.Cardinality.list, "name", "mrodriguez").element());
tryCommit(graph, g -> {
assertEquals(3, IteratorUtils.count(v.properties("name")));
assertEquals(4, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
v.<String>properties("name").forEachRemaining(meta -> {
meta.property("counter", meta.value().length());
});
tryCommit(graph, g -> {
v.properties().forEachRemaining(meta -> {
assertEquals(meta.key(), meta.label());
assertTrue(meta.isPresent());
assertEquals(v, meta.element());
if (meta.key().equals("age")) {
assertEquals(meta.value(), 34);
assertEquals(0, IteratorUtils.count(meta.properties()));
}
if (meta.key().equals("name")) {
assertEquals(((String) meta.value()).length(), meta.<Integer>value("counter").intValue());
assertEquals(1, IteratorUtils.count(meta.properties()));
assertEquals(1, meta.keys().size());
assertTrue(meta.keys().contains("counter"));
}
});
assertVertexEdgeCounts(graph, 1, 0);
});
// null property values are supported so the value should be added
assertEquals(v, v.property(VertexProperty.Cardinality.list, "name", null).element());
tryCommit(graph, g -> {
assertEquals(4, IteratorUtils.count(v.properties("name")));
assertEquals(5, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
});
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_VERTICES)
public void shouldHandleSingleVertexProperties() {
final Vertex v = graph.addVertex("name", "marko", "name", "marko a. rodriguez", "name", "marko rodriguez");
tryCommit(graph, g -> {
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(3, IteratorUtils.count(v.properties("name")));
final List<String> values = IteratorUtils.list(v.values("name"));
assertTrue(values.contains("marko"));
assertTrue(values.contains("marko a. rodriguez"));
assertTrue(values.contains("marko rodriguez"));
});
v.properties("name").forEachRemaining(Property::remove);
tryCommit(graph, g -> {
assertEquals(0, IteratorUtils.count(v.properties()));
assertEquals(0, IteratorUtils.count(v.properties("name")));
});
v.property(VertexProperty.Cardinality.list, "name", "marko");
v.property(VertexProperty.Cardinality.list, "name", "marko a. rodriguez");
v.property(VertexProperty.Cardinality.list, "name", "marko rodriguez");
tryCommit(graph, g -> {
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(3, IteratorUtils.count(v.properties("name")));
final List<String> values = IteratorUtils.list(v.values("name"));
assertTrue(values.contains("marko"));
assertTrue(values.contains("marko a. rodriguez"));
assertTrue(values.contains("marko rodriguez"));
});
v.property(VertexProperty.Cardinality.single, "name", "okram", "acl", "private", "date", 2014);
tryCommit(graph, g -> {
assertEquals(1, IteratorUtils.count(v.properties("name")));
assertEquals(1, IteratorUtils.count(v.properties()));
assertEquals(2, IteratorUtils.count(v.properties("name").next().properties()));
final Map<String, Object> valueMap = IteratorUtils.collectMap(v.property("name").properties(), Property::key, Property::value);
assertEquals("private", valueMap.get("acl"));
assertEquals(2014, valueMap.get("date"));
});
v.remove();
tryCommit(graph, getAssertVertexEdgeCounts(0, 0));
final Vertex u = graph.addVertex("name", "marko", "name", "marko a. rodriguez", "name", "marko rodriguez");
tryCommit(graph);
u.properties().forEachRemaining(Property::remove);
u.property(VertexProperty.Cardinality.single, "name", "okram", "acl", "private", "date", 2014);
tryCommit(graph, g -> {
assertEquals(1, IteratorUtils.count(u.properties("name")));
assertEquals(1, IteratorUtils.count(u.properties()));
assertEquals(2, IteratorUtils.count(u.properties("name").next().properties()));
final Map<String, Object> valueMap = IteratorUtils.collectMap(u.property("name").properties(), Property::key, Property::value);
assertEquals("private", valueMap.get("acl"));
assertEquals(2014, valueMap.get("date"));
});
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_VERTICES)
public void shouldHandleSetVertexProperties() {
final Vertex v = graph.addVertex("name", "marko", "name", "marko a. rodriguez");
tryCommit(graph, graph -> {
assertEquals(2, IteratorUtils.count(v.properties()));
assertEquals(2, IteratorUtils.count(v.properties("name")));
final List<String> values = IteratorUtils.list(v.values("name"));
assertTrue(values.contains("marko"));
assertTrue(values.contains("marko a. rodriguez"));
});
v.property(VertexProperty.Cardinality.set, "name", "marko rodriguez", "acl", "private");
tryCommit(graph, graph -> {
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(3, IteratorUtils.count(v.properties("name")));
final List<String> values = IteratorUtils.list(v.values("name"));
assertTrue(values.contains("marko"));
assertTrue(values.contains("marko a. rodriguez"));
assertTrue(values.contains("marko rodriguez"));
final Iterator<VertexProperty<String>> iterator = v.properties("name");
while (iterator.hasNext()) {
final VertexProperty<String> property = iterator.next();
if (property.value().equals("marko rodriguez")) {
assertEquals(1, IteratorUtils.count(property.properties()));
assertEquals("acl", property.properties().next().key());
assertEquals("private", property.properties().next().value());
} else {
assertEquals(0, IteratorUtils.count(property.properties()));
}
}
});
///
v.property(VertexProperty.Cardinality.set, "name", "marko rodriguez", "acl", "public", "creator", "stephen");
tryCommit(graph, graph -> {
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(3, IteratorUtils.count(v.properties("name")));
final List<String> values = IteratorUtils.list(v.values("name"));
assertTrue(values.contains("marko"));
assertTrue(values.contains("marko a. rodriguez"));
assertTrue(values.contains("marko rodriguez"));
final Iterator<VertexProperty<String>> iterator = v.properties("name");
while (iterator.hasNext()) {
final VertexProperty<String> property = iterator.next();
if (property.value().equals("marko rodriguez")) {
assertEquals(2, IteratorUtils.count(property.properties()));
assertEquals("acl", property.properties("acl").next().key());
assertEquals("public", property.properties("acl").next().value());
assertEquals("creator", property.properties("creator").next().key());
assertEquals("stephen", property.properties("creator").next().value());
} else {
assertEquals(0, IteratorUtils.count(property.properties()));
}
}
});
}
@Test
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_STRING_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_BOOLEAN_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
@FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
public void shouldRespectWhatAreEdgesAndWhatArePropertiesInMultiProperties() {
final Vertex marko = graph.addVertex("name", "marko");
final Vertex stephen = graph.addVertex("name", "stephen");
marko.addEdge("knows", stephen);
final VertexProperty santaFe = marko.property(VertexProperty.Cardinality.list, "location", "santa fe", "visible", false);
final VertexProperty newMexico = marko.property(VertexProperty.Cardinality.list, "location", "new mexico", "visible", true);
assertEquals(1, IteratorUtils.count(marko.edges(Direction.OUT)));
assertEquals(1, IteratorUtils.count(marko.edges(Direction.OUT, "knows")));
assertEquals(3, IteratorUtils.count(marko.properties()));
assertEquals(2, IteratorUtils.count(marko.properties("location")));
assertEquals(1, IteratorUtils.count(marko.properties("name")));
assertEquals(1, IteratorUtils.count(stephen.edges(Direction.IN)));
assertEquals(1, IteratorUtils.count(stephen.edges(Direction.IN, "knows")));
assertEquals(1, IteratorUtils.count(stephen.properties()));
assertEquals(1, IteratorUtils.count(stephen.properties("name")));
assertEquals(1, IteratorUtils.count(santaFe.properties()));
assertEquals(1, IteratorUtils.count(santaFe.properties("visible")));
assertEquals(0, IteratorUtils.count(santaFe.properties(T.key.getAccessor())));
assertEquals(0, IteratorUtils.count(santaFe.properties(T.value.getAccessor())));
assertEquals(1, IteratorUtils.count(newMexico.properties()));
assertEquals(1, IteratorUtils.count(newMexico.properties("visible")));
assertEquals(0, IteratorUtils.count(newMexico.properties(T.key.getAccessor())));
assertEquals(0, IteratorUtils.count(newMexico.properties(T.value.getAccessor())));
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_DUPLICATE_MULTI_PROPERTIES)
public void shouldAllowIdenticalValuedMultiProperties() {
final Vertex v = graph.addVertex();
v.property(VertexProperty.Cardinality.list, "name", "stephen");
v.property(VertexProperty.Cardinality.list, "name", "stephen");
v.property(VertexProperty.Cardinality.list, "name", "steve");
v.property(VertexProperty.Cardinality.list, "name", "stephen");
v.property(VertexProperty.Cardinality.list, "color", "red");
tryCommit(graph, g -> {
final Vertex vertex = graph.vertices(v).next();
assertEquals(4, IteratorUtils.count(vertex.properties("name")));
assertEquals(1, IteratorUtils.count(vertex.properties("color")));
assertEquals(5, IteratorUtils.count(vertex.properties()));
assertThat(IteratorUtils.set(vertex.values("name")), contains("stephen", "steve"));
});
}
}
public static class VertexPropertyRemoval extends AbstractGremlinTest {
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_PROPERTY)
public void shouldSupportIdempotentVertexPropertyRemoval() {
final Vertex a = graph.addVertex("name", "marko");
final Vertex b = graph.addVertex("name", "daniel", "name", "kuppitz");
a.property("name").remove();
a.property("name").remove();
a.property("name").remove();
b.properties("name").forEachRemaining(Property::remove);
b.property("name").remove();
b.properties("name").forEachRemaining(Property::remove);
b.property("name").remove();
b.properties("name").forEachRemaining(Property::remove);
b.property("name").remove();
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_PROPERTY)
public void shouldAllowIteratingAndRemovingVertexPropertyProperties() {
final Vertex daniel = graph.addVertex("name", "daniel", "name", "kuppitz", "name", "big d", "name", "the german");
daniel.properties("name").forEachRemaining(vp -> {
vp.<Object>property("aKey", UUID.randomUUID().toString());
vp.<Object>property("bKey", UUID.randomUUID().toString());
vp.<Object>property("cKey", UUID.randomUUID().toString());
});
assertEquals(4, IteratorUtils.count(daniel.properties()));
assertEquals(12, IteratorUtils.list(IteratorUtils.map(daniel.properties(), p -> IteratorUtils.count(p.properties()))).stream().mapToInt(kv -> kv.intValue()).sum());
daniel.properties().forEachRemaining(p -> p.properties().forEachRemaining(Property::remove));
assertEquals(4, IteratorUtils.count(daniel.properties()));
assertEquals(0, IteratorUtils.list(IteratorUtils.map(daniel.properties(), p -> IteratorUtils.count(p.properties()))).stream().mapToInt(kv -> kv.intValue()).sum());
daniel.properties().forEachRemaining(VertexProperty::remove);
assertEquals(0, IteratorUtils.count(daniel.properties()));
assertEquals(0, IteratorUtils.list(IteratorUtils.map(daniel.properties(), p -> IteratorUtils.count(p.properties()))).stream().mapToInt(kv -> kv.intValue()).sum());
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_PROPERTY)
public void shouldRemoveMultiProperties() {
final Vertex v = graph.addVertex("name", "marko", "age", 34);
v.property(VertexProperty.Cardinality.list, "name", "marko a. rodriguez");
tryCommit(graph);
v.property(VertexProperty.Cardinality.list, "name", "marko rodriguez");
v.property(VertexProperty.Cardinality.list, "name", "marko");
tryCommit(graph, graph -> {
assertEquals(5, IteratorUtils.count(v.properties()));
assertEquals(4, IteratorUtils.count(v.properties("name")));
final List<String> values = IteratorUtils.list(v.values("name"));
assertThat(values, hasItem("marko a. rodriguez"));
assertThat(values, hasItem("marko rodriguez"));
assertThat(values, hasItem("marko"));
assertVertexEdgeCounts(graph, 1, 0);
});
IteratorUtils.filter(v.properties(), p -> p.value().equals("marko")).forEachRemaining(VertexProperty::remove);
tryCommit(graph, graph -> {
assertEquals(3, IteratorUtils.count(v.properties()));
assertEquals(2, IteratorUtils.count(v.properties("name")));
assertVertexEdgeCounts(graph, 1, 0);
});
v.property("age").remove();
tryCommit(graph, graph -> {
assertEquals(2, IteratorUtils.count(v.properties()));
assertEquals(2, IteratorUtils.count(v.properties("name")));
assertVertexEdgeCounts(graph, 1, 0);
});
IteratorUtils.filter(v.properties("name"), p -> p.key().equals("name")).forEachRemaining(VertexProperty::remove);
tryCommit(graph, graph -> {
assertEquals(0, IteratorUtils.count(v.properties()));
assertEquals(0, IteratorUtils.count(v.properties("name")));
assertVertexEdgeCounts(graph, 1, 0);
});
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_VERTICES)
public void shouldRemoveMultiPropertiesWhenVerticesAreRemoved() {
final Vertex marko = graph.addVertex("name", "marko", "name", "okram");
final Vertex stephen = graph.addVertex("name", "stephen", "name", "spmallette");
tryCommit(graph, graph -> {
assertVertexEdgeCounts(graph, 2, 0);
assertEquals(2, IteratorUtils.count(marko.properties("name")));
assertEquals(2, IteratorUtils.count(stephen.properties("name")));
assertEquals(2, IteratorUtils.count(marko.properties()));
assertEquals(2, IteratorUtils.count(stephen.properties()));
assertEquals(0, IteratorUtils.count(marko.properties("blah")));
assertEquals(0, IteratorUtils.count(stephen.properties("blah")));
});
stephen.remove();
tryCommit(graph, graph -> {
assertVertexEdgeCounts(graph, 1, 0);
assertEquals(2, IteratorUtils.count(marko.properties("name")));
assertEquals(2, IteratorUtils.count(marko.properties()));
assertEquals(0, IteratorUtils.count(marko.properties("blah")));
});
for (int i = 0; i < 100; i++) {
marko.property(VertexProperty.Cardinality.list, "name", "Remove-" + String.valueOf(i));
}
tryCommit(graph, graph -> {
assertVertexEdgeCounts(graph, 1, 0);
assertEquals(102, IteratorUtils.count(marko.properties("name")));
assertEquals(102, IteratorUtils.count(marko.properties()));
assertEquals(0, IteratorUtils.count(marko.properties("blah")));
});
g.V().properties("name").has(T.value, P.test((a, b) -> ((String) a).startsWith((String) b), "Remove-")).forEachRemaining(Property::remove);
tryCommit(graph, graph -> {
assertVertexEdgeCounts(graph, 1, 0);
assertEquals(2, IteratorUtils.count(marko.properties("name")));
assertEquals(2, IteratorUtils.count(marko.properties()));
assertEquals(0, IteratorUtils.count(marko.properties("blah")));
});
marko.remove();
tryCommit(graph, getAssertVertexEdgeCounts(0, 0));
}
}
public static class VertexPropertyProperties extends AbstractGremlinTest {
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldReturnEmptyIfNoMetaProperties() {
final Vertex v = graph.addVertex();
final VertexProperty<String> vp = v.property(VertexProperty.Cardinality.single, "name", "marko");
assertEquals(Property.empty(), vp.property("name"));
}
@Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
@FeatureRequirement(featureClass = Graph.Features.VertexPropertyFeatures.class, feature = Graph.Features.VertexPropertyFeatures.FEATURE_INTEGER_VALUES)
public void shouldSupportPropertiesOnMultiProperties() {
final Vertex v = graph.addVertex("name", "marko", "age", 34);
tryCommit(graph, g -> {
assertEquals(2, IteratorUtils.count(v.properties()));
assertVertexEdgeCounts(graph, 1, 0);
assertEquals(v.property("name"), v.property("name").property("acl", "public").element());
assertEquals(v.property("age"), v.property("age").property("acl", "private").element());
});
v.property("name").property("acl", "public");
v.property("age").property("acl", "private");
tryCommit(graph, g -> {
assertEquals(2, IteratorUtils.count(v.properties()));
assertEquals(1, IteratorUtils.count(v.properties("age")));
assertEquals(1, IteratorUtils.count(v.properties("name")));
assertEquals(1, IteratorUtils.count(v.property("age").properties()));
assertEquals(1, IteratorUtils.count(v.property("name").properties()));
assertEquals(1, IteratorUtils.count(v.property("age").properties("acl")));
assertEquals(1, IteratorUtils.count(v.property("name").properties("acl")));
assertEquals("private", v.property("age").values("acl").next());
assertEquals("public", v.property("name").values("acl").next());
assertVertexEdgeCounts(graph, 1, 0);
});
v.property("age").property("acl", "public");
v.property("age").property("changeDate", 2014);
tryCommit(graph, g -> {
assertEquals("public", v.property("age").values("acl").next());
assertEquals(2014, v.property("age").values("changeDate").next());
assertEquals(1, IteratorUtils.count(v.properties("age")));
assertEquals(2, IteratorUtils.count(v.properties("age").next().properties()));
});
}
}
}