fix(core): adapt HugeVertex.property() with null values

This commit is contained in:
imbajin 2022-12-30 16:34:03 +08:00
parent e9eb8240d1
commit 423fbb2b38
No known key found for this signature in database
GPG Key ID: B78B058CC255F6DC
4 changed files with 40 additions and 48 deletions

View File

@ -369,7 +369,7 @@ public class HugeEdge extends HugeElement implements Edge, Cloneable {
if (ownerLabel.equals(this.label.sourceLabel())) {
this.vertices(true, owner, other);
} else {
// TODO: why when compare the label but ignore the result?
// TODO: why compare the label but ignore the result?
ownerLabel.equals(this.label.targetLabel());
this.vertices(false, owner, other);
}

View File

@ -22,6 +22,7 @@ package org.apache.hugegraph.structure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@ -61,6 +62,9 @@ import org.apache.hugegraph.type.define.Directions;
import org.apache.hugegraph.type.define.HugeKeys;
import org.apache.hugegraph.type.define.IdStrategy;
import org.apache.hugegraph.util.E;
import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyProperty;
import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyVertexProperty;
import com.google.common.collect.ImmutableList;
public class HugeVertex extends HugeElement implements Vertex, Cloneable {
@ -164,8 +168,7 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
}
break;
default:
throw new AssertionError(String.format(
"Unknown id strategy '%s'", strategy));
throw new AssertionError(String.format("Unknown id strategy '%s'", strategy));
}
this.checkIdLength();
}
@ -252,7 +255,7 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
/**
* Add one edge between this vertex and other vertex
*
* <p>
* *** this method is not thread safe, must clone this vertex first before
* multi thread access e.g. `vertex.copy().resetTx();` ***
*/
@ -297,7 +300,7 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
label, this.label(), vertex.label());
// Check sortKeys
List<Id> keys = this.graph().mapPkName2Id(elemKeys.keys());
E.checkArgument(keys.containsAll(edgeLabel.sortKeys()),
E.checkArgument(new HashSet<>(keys).containsAll(edgeLabel.sortKeys()),
"The sort key(s) must be set for the edge " +
"with label: '%s'", edgeLabel.name());
@ -306,7 +309,7 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
Collection<Id> nonNullKeys = CollectionUtils.subtract(
edgeLabel.properties(),
edgeLabel.nullableKeys());
if (!keys.containsAll(nonNullKeys)) {
if (!new HashSet<>(keys).containsAll(nonNullKeys)) {
@SuppressWarnings("unchecked")
Collection<Id> missed = CollectionUtils.subtract(nonNullKeys, keys);
E.checkArgument(false, "All non-null property keys: %s " +
@ -421,9 +424,8 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
@Watched(prefix = "vertex")
@Override
public <V> VertexProperty<V> property(
VertexProperty.Cardinality cardinality,
String key, V value, Object... objects) {
public <V> VertexProperty<V> property(VertexProperty.Cardinality cardinality,
String key, V value, Object... objects) {
if (objects.length != 0 && objects[0].equals(T.id)) {
throw VertexProperty.Exceptions.userSuppliedIdsNotSupported();
}
@ -439,7 +441,7 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
* .property(list, "key2", val2)
*
* The cardinality single may be user supplied single, it may also be
* that user doesn't supplied cardinality, when it is latter situation,
* that user doesn't supply cardinality, when it is latter situation,
* we shouldn't check it. Because of this reason, we are forced to
* give up the check of user supplied cardinality single.
* The cardinality not single must be user supplied, so should check it
@ -462,10 +464,14 @@ public class HugeVertex extends HugeElement implements Vertex, Cloneable {
E.checkArgument(!this.hasProperty(propertyKey.id()),
"Can't update primary key: '%s'", key);
}
if (value == null) {
this.removeProperty(propertyKey.id());
return EmptyVertexProperty.instance();
}
@SuppressWarnings("unchecked")
VertexProperty<V> prop = (VertexProperty<V>) this.addProperty(
propertyKey, value, !this.fresh());
VertexProperty<V> prop = (VertexProperty<V>) this.addProperty(propertyKey,
value, !this.fresh());
return prop;
}

View File

@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.GraphProviderClass;
import org.junit.runner.RunWith;
@RunWith(ProcessBasicSuite.class)
@GraphProviderClass(provider = ProcessTestGraphProvider.class,
graph = TestGraph.class)
@GraphProviderClass(provider = ProcessTestGraphProvider.class, graph = TestGraph.class)
public class ProcessStandardTest {
}

View File

@ -47,6 +47,7 @@ import org.apache.hugegraph.task.TaskScheduler;
import org.apache.hugegraph.testutil.Whitebox;
import org.apache.hugegraph.type.define.IdStrategy;
import org.apache.hugegraph.type.define.NodeRole;
import com.google.common.collect.ImmutableSet;
@Graph.OptIn("org.apache.hugegraph.tinkerpop.StructureBasicSuite")
@ -57,8 +58,7 @@ public class TestGraph implements Graph {
public static final String DEFAULT_VL = "vertex";
public static final Set<String> TRUNCATE_BACKENDS =
ImmutableSet.of("rocksdb", "mysql");
public static final Set<String> TRUNCATE_BACKENDS = ImmutableSet.of("rocksdb", "mysql");
private static volatile int id = 666;
@ -132,19 +132,19 @@ public class TestGraph implements Graph {
// Clear schema and graph data will be cleared at same time
SchemaManager schema = this.graph.schema();
schema.getIndexLabels().stream().forEach(elem -> {
schema.getIndexLabels().forEach(elem -> {
schema.indexLabel(elem.name()).remove();
});
schema.getEdgeLabels().stream().forEach(elem -> {
schema.getEdgeLabels().forEach(elem -> {
schema.edgeLabel(elem.name()).remove();
});
schema.getVertexLabels().stream().forEach(elem -> {
schema.getVertexLabels().forEach(elem -> {
schema.vertexLabel(elem.name()).remove();
});
schema.getPropertyKeys().stream().forEach(elem -> {
schema.getPropertyKeys().forEach(elem -> {
schema.propertyKey(elem.name()).remove();
});
@ -157,7 +157,7 @@ public class TestGraph implements Graph {
@Watched
protected void clearVariables() {
Variables variables = this.variables();
variables.keys().forEach(key -> variables.remove(key));
variables.keys().forEach(variables::remove);
}
protected boolean closed() {
@ -252,8 +252,7 @@ public class TestGraph implements Graph {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public <I extends Io> I io(final Io.Builder<I> builder) {
Whitebox.setInternalState(HugeGraphSONModule.class,
"OPTIMIZE_SERIALIZE", false);
Whitebox.setInternalState(HugeGraphSONModule.class, "OPTIMIZE_SERIALIZE", false);
return (I) builder.graph(this).onMapper(mapper ->
mapper.addRegistry(HugeGraphIoRegistry.instance())
).create();
@ -317,8 +316,7 @@ public class TestGraph implements Graph {
case "regularLoad":
return false;
default:
throw new AssertionError(String.format(
"Wrong IO type %s", this.loadedGraph));
throw new AssertionError(String.format("Wrong IO type %s", this.loadedGraph));
}
}
@ -346,24 +344,19 @@ public class TestGraph implements Graph {
schema.propertyKey(key).ifNotExist().create();
break;
case "BooleanArray":
schema.propertyKey(key).asBoolean().valueList()
.ifNotExist().create();
schema.propertyKey(key).asBoolean().valueList().ifNotExist().create();
break;
case "IntegerArray":
schema.propertyKey(key).asInt().valueList()
.ifNotExist().create();
schema.propertyKey(key).asInt().valueList().ifNotExist().create();
break;
case "LongArray":
schema.propertyKey(key).asLong().valueList()
.ifNotExist().create();
schema.propertyKey(key).asLong().valueList().ifNotExist().create();
break;
case "FloatArray":
schema.propertyKey(key).asFloat().valueList()
.ifNotExist().create();
schema.propertyKey(key).asFloat().valueList().ifNotExist().create();
break;
case "DoubleArray":
schema.propertyKey(key).asDouble().valueList()
.ifNotExist().create();
schema.propertyKey(key).asDouble().valueList().ifNotExist().create();
break;
case "StringArray":
schema.propertyKey(key).valueList().ifNotExist().create();
@ -376,8 +369,7 @@ public class TestGraph implements Graph {
case "Serializable":
break;
default:
throw new RuntimeException(
String.format("Wrong type %s for %s", type, key));
throw new RuntimeException(String.format("Wrong type %s for %s", type, key));
}
}
@ -413,8 +405,7 @@ public class TestGraph implements Graph {
.useCustomizeStringId().ifNotExist().create();
break;
default:
throw new AssertionError(String.format(
"Id strategy must be customize or automatic"));
throw new AssertionError("Id strategy must be customize or automatic");
}
schema.edgeLabel("followedBy")
@ -509,8 +500,7 @@ public class TestGraph implements Graph {
.useCustomizeStringId().ifNotExist().create();
break;
default:
throw new AssertionError(String.format(
"Id strategy must be customize or automatic"));
throw new AssertionError("Id strategy must be customize or automatic");
}
schema.edgeLabel("knows").link("person", "person")
@ -586,8 +576,7 @@ public class TestGraph implements Graph {
.useCustomizeStringId().ifNotExist().create();
break;
default:
throw new AssertionError(String.format(
"Id strategy must be customize or automatic"));
throw new AssertionError("Id strategy must be customize or automatic");
}
schema.edgeLabel("knows").link("vertex", "vertex")
@ -675,8 +664,7 @@ public class TestGraph implements Graph {
schema.propertyKey("new").ifNotExist().create();
schema.propertyKey("color").ifNotExist().create();
schema.propertyKey("every").ifNotExist().create();
schema.propertyKey("gremlin.partitionGraphStrategy.partition")
.ifNotExist().create();
schema.propertyKey("gremlin.partitionGraphStrategy.partition").ifNotExist().create();
schema.propertyKey("blah").asDouble().ifNotExist().create();
schema.propertyKey("bloop").asInt().ifNotExist().create();
@ -695,8 +683,7 @@ public class TestGraph implements Graph {
}
@Watched
private void initBasicVertexLabelV(IdStrategy idStrategy,
String defaultVL) {
private void initBasicVertexLabelV(IdStrategy idStrategy, String defaultVL) {
SchemaManager schema = this.graph.schema();
switch (idStrategy) {
@ -769,7 +756,7 @@ public class TestGraph implements Graph {
private void initBasicVertexLabelAndEdgeLabelExceptV(String defaultVL) {
SchemaManager schema = this.graph.schema();
if (!defaultVL.equals("person")) {
if (!"person".equals(defaultVL)) {
schema.vertexLabel("person")
.properties("name", "age")
.nullableKeys("name", "age")