Skip to content

Commit 3aa0932

Browse files
authored
ignore _label for complex graph type (#15)
1 parent a8a7030 commit 3aa0932

File tree

12 files changed

+170
-26
lines changed

12 files changed

+170
-26
lines changed

src/main/java/com/arangodb/tinkerpop/gremlin/client/ArangoDBGraphClient.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public ArangoDBGraphClient(ArangoDBGraphConfig config, ElementIdFactory idFactor
5454
.orElse(ArangoDefaults.DEFAULT_PROTOCOL);
5555
ObjectMapper mapper = JacksonMapperProvider
5656
.of(ContentTypeFactory.of(protocol))
57-
.registerModule(new SerdeModule(idFactory));
57+
.registerModule(new SerdeModule(idFactory, config.graphType));
5858
aqlDeserializer = new AqlDeserializer(graph, mapper);
5959
db = new ArangoDB.Builder()
6060
.loadProperties(config.driverConfig)
@@ -305,23 +305,23 @@ public void updateVertex(ArangoDBVertex vertex) {
305305

306306
public Iterator<VertexData> getVertexNeighbors(ElementId vertexId, Set<String> edgeCollections, Direction direction, String[] labels) {
307307
logger.debug("Get vertex {}:{} Neighbors, in {}, from collections {}", vertexId, direction, config.graphName, edgeCollections);
308-
String query = ArangoDBQueryBuilder.readVertexNeighbors(config.graphName, direction, labels);
308+
String query = ArangoDBQueryBuilder.readVertexNeighbors(config.graphName, direction, config.graphType, labels);
309309
Map<String, Object> params = new HashMap<>();
310310
params.put("vertexId", vertexId);
311311
params.put("edgeCollections", edgeCollections);
312-
if (labels.length > 0) {
312+
if (labels.length > 0 && config.graphType == ArangoDBGraphConfig.GraphType.SIMPLE) {
313313
params.put("labels", labels);
314314
}
315315
return query(query, VertexData.class, params);
316316
}
317317

318318
public Iterator<EdgeData> getVertexEdges(ElementId vertexId, Set<String> edgeCollections, Direction direction, String[] labels) {
319319
logger.debug("Get vertex {}:{} Edges, in {}, from collections {}", vertexId, direction, config.graphName, edgeCollections);
320-
String query = ArangoDBQueryBuilder.readVertexEdges(config.graphName, direction, labels);
320+
String query = ArangoDBQueryBuilder.readVertexEdges(config.graphName, direction, config.graphType, labels);
321321
Map<String, Object> params = new HashMap<>();
322322
params.put("vertexId", vertexId);
323323
params.put("edgeCollections", edgeCollections);
324-
if (labels.length > 0) {
324+
if (labels.length > 0 && config.graphType == ArangoDBGraphConfig.GraphType.SIMPLE) {
325325
params.put("labels", labels);
326326
}
327327
return query(query, EdgeData.class, params);

src/main/java/com/arangodb/tinkerpop/gremlin/client/ArangoDBQueryBuilder.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Set;
2020
import java.util.stream.Collectors;
2121

22+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig;
2223
import org.apache.tinkerpop.gremlin.structure.Direction;
2324

2425
import static com.arangodb.tinkerpop.gremlin.utils.Fields.LABEL;
@@ -29,27 +30,31 @@ public class ArangoDBQueryBuilder {
2930
private ArangoDBQueryBuilder() {
3031
}
3132

32-
public static String readVertexNeighbors(String graphName, Direction direction, String[] labels) {
33-
return oneStepTraversal(graphName, direction, labels)
33+
public static String readVertexNeighbors(String graphName, Direction direction, ArangoDBGraphConfig.GraphType type, String[] labels) {
34+
return oneStepTraversal(graphName, direction, type, labels)
3435
.append(" RETURN v")
3536
.toString();
3637
}
3738

38-
public static String readVertexEdges(String graphName, Direction direction, String[] labels) {
39-
return oneStepTraversal(graphName, direction, labels)
39+
public static String readVertexEdges(String graphName, Direction direction, ArangoDBGraphConfig.GraphType type, String[] labels) {
40+
return oneStepTraversal(graphName, direction, type, labels)
4041
.append(" RETURN e")
4142
.toString();
4243
}
4344

44-
private static StringBuilder oneStepTraversal(String graphName, Direction direction, String[] labels) {
45+
private static StringBuilder oneStepTraversal(String graphName, Direction direction, ArangoDBGraphConfig.GraphType type, String[] labels) {
4546
StringBuilder query = new StringBuilder()
4647
.append("FOR v, e IN 1..1 ")
4748
.append(toArangoDirection(direction))
4849
.append(" @vertexId GRAPH ")
4950
.append(escape(graphName))
5051
.append(" OPTIONS {edgeCollections: @edgeCollections}");
5152
if (labels.length > 0) {
52-
query.append(" FILTER e." + LABEL + " IN @labels");
53+
if (type == ArangoDBGraphConfig.GraphType.SIMPLE) {
54+
query.append(" FILTER e." + LABEL + " IN @labels");
55+
} else {
56+
query.append(" FILTER PARSE_COLLECTION(e) IN @edgeCollections");
57+
}
5358
}
5459
return query;
5560
}

src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/EdgeDataDeserializer.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.arangodb.tinkerpop.gremlin.persistence.EdgeData;
2020
import com.arangodb.tinkerpop.gremlin.persistence.ElementId;
21+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig;
2122
import com.arangodb.tinkerpop.gremlin.utils.Fields;
2223
import com.fasterxml.jackson.core.JsonParser;
2324
import com.fasterxml.jackson.core.ObjectCodec;
@@ -32,12 +33,24 @@
3233
import static com.arangodb.tinkerpop.gremlin.utils.Fields.*;
3334

3435
public class EdgeDataDeserializer extends JsonDeserializer<EdgeData> {
36+
37+
private final ArangoDBGraphConfig.GraphType type;
38+
39+
public EdgeDataDeserializer(ArangoDBGraphConfig.GraphType type) {
40+
this.type = type;
41+
}
42+
3543
@Override
3644
public EdgeData deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
3745
ObjectCodec c = p.getCodec();
3846
ObjectNode root = c.readTree(p);
3947
ElementId id = c.treeToValue(root.get(ID), ElementId.class);
40-
String label = root.get(LABEL).asText();
48+
String label;
49+
if (type == ArangoDBGraphConfig.GraphType.SIMPLE) {
50+
label = root.get(LABEL).asText();
51+
} else {
52+
label = id.getLabel();
53+
}
4154
ElementId from = c.treeToValue(root.get(FROM), ElementId.class);
4255
ElementId to = c.treeToValue(root.get(TO), ElementId.class);
4356
EdgeData data = new EdgeData(label, id, from, to);

src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/EdgeDataSerializer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.arangodb.tinkerpop.gremlin.persistence.serde;
1818

1919
import com.arangodb.tinkerpop.gremlin.persistence.EdgeData;
20+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig;
2021
import com.arangodb.tinkerpop.gremlin.utils.Fields;
2122
import com.fasterxml.jackson.core.JsonGenerator;
2223
import com.fasterxml.jackson.databind.JsonSerializer;
@@ -28,13 +29,22 @@
2829
import static com.arangodb.tinkerpop.gremlin.utils.Fields.*;
2930

3031
public class EdgeDataSerializer extends JsonSerializer<EdgeData> {
32+
33+
private final ArangoDBGraphConfig.GraphType type;
34+
35+
public EdgeDataSerializer(ArangoDBGraphConfig.GraphType type) {
36+
this.type = type;
37+
}
38+
3139
@Override
3240
public void serialize(EdgeData data, JsonGenerator gen, SerializerProvider serializers) throws IOException {
3341
gen.writeStartObject();
3442
if (data.getKey() != null) {
3543
gen.writeStringField(Fields.KEY, data.getKey());
3644
}
37-
gen.writeStringField(LABEL, data.getLabel());
45+
if (type == ArangoDBGraphConfig.GraphType.SIMPLE) {
46+
gen.writeStringField(LABEL, data.getLabel());
47+
}
3848
gen.writeObjectField(FROM, data.getFrom());
3949
gen.writeObjectField(TO, data.getTo());
4050

src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/SerdeModule.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,33 @@
1717
package com.arangodb.tinkerpop.gremlin.persistence.serde;
1818

1919
import com.arangodb.tinkerpop.gremlin.persistence.*;
20+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig;
2021
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
2122
import com.fasterxml.jackson.databind.module.SimpleModule;
2223
import com.fasterxml.jackson.databind.module.SimpleSerializers;
2324

2425
public class SerdeModule extends SimpleModule {
2526
private final ElementIdFactory idFactory;
27+
private final ArangoDBGraphConfig.GraphType graphType;
2628

27-
public SerdeModule(ElementIdFactory idFactory) {
29+
public SerdeModule(ElementIdFactory idFactory, ArangoDBGraphConfig.GraphType graphType) {
2830
this.idFactory = idFactory;
31+
this.graphType = graphType;
2932
}
3033

3134
@Override
3235
public void setupModule(SetupContext context) {
3336
SimpleSerializers serializers = new SimpleSerializers();
3437
serializers.addSerializer(ElementId.class, new ElementIdSerializer());
35-
serializers.addSerializer(VertexData.class, new VertexDataSerializer());
36-
serializers.addSerializer(EdgeData.class, new EdgeDataSerializer());
38+
serializers.addSerializer(VertexData.class, new VertexDataSerializer(graphType));
39+
serializers.addSerializer(EdgeData.class, new EdgeDataSerializer(graphType));
3740
serializers.addSerializer(VariablesData.class, new VariablesDataSerializer());
3841
context.addSerializers(serializers);
3942

4043
SimpleDeserializers deserializers = new SimpleDeserializers();
4144
deserializers.addDeserializer(ElementId.class, new ElementIdDeserializer(idFactory));
42-
deserializers.addDeserializer(VertexData.class, new VertexDataDeserializer());
43-
deserializers.addDeserializer(EdgeData.class, new EdgeDataDeserializer());
45+
deserializers.addDeserializer(VertexData.class, new VertexDataDeserializer(graphType));
46+
deserializers.addDeserializer(EdgeData.class, new EdgeDataDeserializer(graphType));
4447
deserializers.addDeserializer(VariablesData.class, new VariablesDataDeserializer());
4548
context.addDeserializers(deserializers);
4649
}

src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/VertexDataDeserializer.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.arangodb.tinkerpop.gremlin.persistence.ElementId;
2020
import com.arangodb.tinkerpop.gremlin.persistence.VertexData;
2121
import com.arangodb.tinkerpop.gremlin.persistence.VertexPropertyData;
22+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig;
2223
import com.arangodb.tinkerpop.gremlin.utils.Fields;
2324
import com.fasterxml.jackson.core.JsonParser;
2425
import com.fasterxml.jackson.core.ObjectCodec;
@@ -34,12 +35,24 @@
3435
import static com.arangodb.tinkerpop.gremlin.utils.Fields.*;
3536

3637
class VertexDataDeserializer extends JsonDeserializer<VertexData> {
38+
39+
private final ArangoDBGraphConfig.GraphType type;
40+
41+
VertexDataDeserializer(ArangoDBGraphConfig.GraphType type) {
42+
this.type = type;
43+
}
44+
3745
@Override
3846
public VertexData deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
3947
ObjectCodec c = p.getCodec();
4048
ObjectNode root = c.readTree(p);
4149
ElementId id = c.treeToValue(root.get(ID), ElementId.class);
42-
String label = root.get(LABEL).asText();
50+
String label;
51+
if (type == ArangoDBGraphConfig.GraphType.SIMPLE) {
52+
label = root.get(LABEL).asText();
53+
} else {
54+
label = id.getLabel();
55+
}
4356
VertexData data = new VertexData(label, id);
4457
@SuppressWarnings("unchecked")
4558
Map<String, Map<String, Object>> meta = root.has(META)

src/main/java/com/arangodb/tinkerpop/gremlin/persistence/serde/VertexDataSerializer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.arangodb.tinkerpop.gremlin.persistence.VertexData;
2020
import com.arangodb.tinkerpop.gremlin.persistence.VertexPropertyData;
21+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraphConfig;
2122
import com.arangodb.tinkerpop.gremlin.utils.Fields;
2223
import com.fasterxml.jackson.core.JsonGenerator;
2324
import com.fasterxml.jackson.databind.JsonSerializer;
@@ -30,13 +31,22 @@
3031
import static com.arangodb.tinkerpop.gremlin.utils.Fields.LABEL;
3132

3233
class VertexDataSerializer extends JsonSerializer<VertexData> {
34+
35+
private final ArangoDBGraphConfig.GraphType type;
36+
37+
VertexDataSerializer(ArangoDBGraphConfig.GraphType type) {
38+
this.type = type;
39+
}
40+
3341
@Override
3442
public void serialize(VertexData data, JsonGenerator gen, SerializerProvider serializers) throws IOException {
3543
gen.writeStartObject();
3644
if (data.getKey() != null) {
3745
gen.writeStringField(Fields.KEY, data.getKey());
3846
}
39-
gen.writeStringField(LABEL, data.getLabel());
47+
if (type == ArangoDBGraphConfig.GraphType.SIMPLE) {
48+
gen.writeStringField(LABEL, data.getLabel());
49+
}
4050

4151
Map<String, Map<String, Object>> meta = new HashMap<>();
4252

src/main/java/com/arangodb/tinkerpop/gremlin/utils/AqlDeserializer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import java.util.HashMap;
3131
import java.util.Map;
3232

33-
import static com.arangodb.tinkerpop.gremlin.utils.Fields.LABEL;
34-
3533
public class AqlDeserializer {
3634
private final ArangoDBGraph graph;
3735
private final ObjectMapper mapper;
@@ -78,8 +76,7 @@ private Object doDeserialize(JsonNode node) throws IOException {
7876
private boolean isVertex(JsonNode node) {
7977
return node.has(Fields.KEY)
8078
&& node.has(Fields.ID)
81-
&& node.has(Fields.REV)
82-
&& node.has(LABEL);
79+
&& node.has(Fields.REV);
8380
}
8481

8582
private boolean isEdge(JsonNode node) {

src/test/java/com/arangodb/tinkerpop/gremlin/arangodb/complex/ComplexArangoDBSuite.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class ComplexArangoDBSuite extends AbstractGremlinSuite {
2525

2626
private static final Class<?>[] allTests = new Class<?>[]{
2727
ComplexElementIdTest.class,
28+
ComplexPersistenceTest.class
2829
};
2930

3031
public ComplexArangoDBSuite(final Class<?> klass, final RunnerBuilder builder) throws InitializationError {
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Copyright 2025 ArangoDB GmbH and The University of York
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.arangodb.tinkerpop.gremlin.arangodb.complex;
18+
19+
import com.arangodb.ArangoCollection;
20+
import com.arangodb.tinkerpop.gremlin.TestGraphClient;
21+
import com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph;
22+
import com.arangodb.tinkerpop.gremlin.utils.Fields;
23+
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
24+
import org.apache.tinkerpop.gremlin.structure.Edge;
25+
import org.apache.tinkerpop.gremlin.structure.T;
26+
import org.apache.tinkerpop.gremlin.structure.Vertex;
27+
import org.junit.Test;
28+
29+
import java.util.Map;
30+
31+
import static org.assertj.core.api.Assertions.assertThat;
32+
33+
public class ComplexPersistenceTest extends AbstractGremlinTest {
34+
35+
private TestGraphClient client() {
36+
return new TestGraphClient(graph.configuration());
37+
}
38+
39+
private String graphName() {
40+
return ((ArangoDBGraph) graph).name();
41+
}
42+
43+
@Test
44+
@SuppressWarnings("unchecked")
45+
public void vertices() {
46+
Vertex v = graph.addVertex(T.id, "foo");
47+
v
48+
.property("key", "value")
49+
.property("meta", "metaValue");
50+
String colName = graphName() + "_" + Vertex.DEFAULT_LABEL;
51+
ArangoCollection col = client().database().collection(colName);
52+
Map<String, Object> doc = (Map<String, Object>) col.getDocument(((ArangoDBGraph) graph).elementId(v).getKey(), Map.class);
53+
assertThat(doc)
54+
.hasSize(5)
55+
.containsEntry(Fields.KEY, "foo")
56+
.containsEntry(Fields.ID, colName + "/foo")
57+
.containsKey(Fields.REV)
58+
.doesNotContainKey(Fields.LABEL)
59+
.containsEntry("key", "value");
60+
61+
Map<String, Map<String, Object>> meta = (Map<String, Map<String, Object>>) doc.get(Fields.META);
62+
assertThat(meta)
63+
.hasSize(1)
64+
.containsKey("key");
65+
66+
Map<String, Object> fooMeta = meta.get("key");
67+
assertThat(fooMeta)
68+
.containsEntry("meta", "metaValue");
69+
}
70+
71+
@Test
72+
@SuppressWarnings("unchecked")
73+
public void edges() {
74+
Vertex a = graph.addVertex(T.id, "a");
75+
Vertex b = graph.addVertex(T.id, "b");
76+
Edge e = a.addEdge(Edge.DEFAULT_LABEL, b, T.id, "e", "key", "value");
77+
78+
String vertexColName = graphName() + "_" + Vertex.DEFAULT_LABEL;
79+
String edgeColName = graphName() + "_" + Edge.DEFAULT_LABEL;
80+
ArangoCollection col = client().database().collection(edgeColName);
81+
Map<String, Object> doc = (Map<String, Object>) col.getDocument(((ArangoDBGraph) graph).elementId(e).getKey(), Map.class);
82+
assertThat(doc)
83+
.hasSize(6)
84+
.containsEntry(Fields.KEY, "e")
85+
.containsEntry(Fields.ID, edgeColName + "/e")
86+
.containsKey(Fields.REV)
87+
.containsEntry(Fields.FROM, vertexColName + "/a")
88+
.containsEntry(Fields.TO, vertexColName + "/b")
89+
.doesNotContainKey(Fields.LABEL)
90+
.containsEntry("key", "value");
91+
}
92+
}

0 commit comments

Comments
 (0)