Skip to content

Commit 8c5fae6

Browse files
authored
Merge pull request #340 from rashtao/feature/arangodb-graph
jnosql-arangodb: Graph API
2 parents 1edef80 + 7699c01 commit 8c5fae6

File tree

14 files changed

+597
-120
lines changed

14 files changed

+597
-120
lines changed

jnosql-arangodb/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
<groupId>org.eclipse.jnosql.mapping</groupId>
4242
<artifactId>jnosql-mapping-key-value</artifactId>
4343
</dependency>
44+
<dependency>
45+
<groupId>org.eclipse.jnosql.mapping</groupId>
46+
<artifactId>jnosql-mapping-graph</artifactId>
47+
<version>${project.version}</version>
48+
</dependency>
4449
<dependency>
4550
<groupId>${project.groupId}</groupId>
4651
<artifactId>jnosql-database-commons</artifactId>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
*
3+
* Copyright (c) 2025 Contributors to the Eclipse Foundation
4+
* All rights reserved. This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License v1.0
6+
* and Apache License v2.0 which accompanies this distribution.
7+
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
8+
* and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php.
9+
*
10+
* You may elect to redistribute this code under either of these licenses.
11+
*
12+
* Contributors:
13+
*
14+
* Otavio Santana
15+
*
16+
*/
17+
package org.eclipse.jnosql.databases.arangodb.communication;
18+
19+
import org.eclipse.jnosql.communication.graph.CommunicationEdge;
20+
import org.eclipse.jnosql.communication.semistructured.CommunicationEntity;
21+
22+
import java.util.Map;
23+
24+
record ArangoDBCommunicationEdge(String id, CommunicationEntity source, CommunicationEntity target, String label, Map<String, Object> properties) implements CommunicationEdge {
25+
}

jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBDocumentManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
package org.eclipse.jnosql.databases.arangodb.communication;
1616

17+
import org.eclipse.jnosql.communication.graph.GraphDatabaseManager;
1718
import org.eclipse.jnosql.communication.semistructured.CommunicationEntity;
1819
import org.eclipse.jnosql.communication.semistructured.DatabaseManager;
1920

@@ -23,7 +24,7 @@
2324
* The ArangoDB implementation of {@link DatabaseManager}. This implementation does not support TTL methods in the context of
2425
* {@link DatabaseManager#insert(org.eclipse.jnosql.communication.semistructured.CommunicationEntity)}.
2526
*/
26-
public interface ArangoDBDocumentManager extends DatabaseManager, ArangoDBAccessor {
27+
public interface ArangoDBDocumentManager extends DatabaseManager, GraphDatabaseManager, ArangoDBAccessor {
2728

2829
/**
2930
* Executes an ArangoDB query using the ArangoDB Query Language (AQL).

jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBUtil.java

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
package org.eclipse.jnosql.databases.arangodb.communication;
1717

1818

19+
import com.arangodb.ArangoCollection;
1920
import com.arangodb.ArangoDB;
20-
import com.arangodb.entity.CollectionEntity;
21+
import com.arangodb.entity.CollectionType;
22+
import com.arangodb.model.CollectionCreateOptions;
2123
import jakarta.json.Json;
2224
import jakarta.json.JsonArray;
2325
import jakarta.json.JsonArrayBuilder;
@@ -30,13 +32,10 @@
3032
import org.eclipse.jnosql.communication.semistructured.CommunicationEntity;
3133
import org.eclipse.jnosql.communication.semistructured.Element;
3234

33-
import java.util.Collection;
34-
import java.util.Collections;
35-
import java.util.List;
36-
import java.util.Map;
37-
import java.util.Objects;
35+
import java.util.*;
3836
import java.util.logging.Level;
3937
import java.util.logging.Logger;
38+
import java.util.stream.Collectors;
4039

4140
import static java.util.stream.Collectors.toList;
4241
import static java.util.stream.StreamSupport.stream;
@@ -49,12 +48,17 @@ public final class ArangoDBUtil {
4948
public static final String KEY = "_key";
5049
public static final String ID = "_id";
5150
public static final String REV = "_rev";
51+
public static final String FROM = "_from";
52+
public static final String TO = "_to";
53+
private static final Set<String> META_FIELDS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
54+
ID, KEY, REV, FROM, TO
55+
)));
56+
5257
private static final Logger LOGGER = Logger.getLogger(ArangoDBUtil.class.getName());
5358

5459
private ArangoDBUtil() {
5560
}
5661

57-
5862
static void checkDatabase(String database, ArangoDB arangoDB) {
5963
Objects.requireNonNull(database, "database is required");
6064
try {
@@ -67,14 +71,21 @@ static void checkDatabase(String database, ArangoDB arangoDB) {
6771
}
6872
}
6973

70-
public static void checkCollection(String bucketName, ArangoDB arangoDB, String namespace) {
71-
checkDatabase(bucketName, arangoDB);
72-
List<String> collections = arangoDB.db(bucketName)
73-
.getCollections().stream()
74-
.map(CollectionEntity::getName)
75-
.toList();
76-
if (!collections.contains(namespace)) {
77-
arangoDB.db(bucketName).createCollection(namespace);
74+
public static void checkCollection(String dbName, ArangoDB arangoDB, String collectionName) {
75+
checkDatabase(dbName, arangoDB);
76+
ArangoCollection collection = arangoDB.db(dbName).collection(collectionName);
77+
if (!collection.exists()) {
78+
collection.create();
79+
}
80+
}
81+
82+
public static void checkEdgeCollection(String dbName, ArangoDB arangoDB, String collectionName) {
83+
checkDatabase(dbName, arangoDB);
84+
ArangoCollection collection = arangoDB.db(dbName).collection(collectionName);
85+
if (!collection.exists()) {
86+
collection.create(new CollectionCreateOptions().type(CollectionType.EDGES));
87+
} else if (collection.getInfo().getType() != CollectionType.EDGES) {
88+
throw new IllegalStateException(String.format("The collection %s is not an edge collection", collectionName));
7889
}
7990
}
8091

@@ -85,10 +96,27 @@ static CommunicationEntity toEntity(JsonObject jsonObject) {
8596
documents.add(Element.of(KEY, jsonObject.getString(KEY)));
8697
documents.add(Element.of(ID, id));
8798
documents.add(Element.of(REV, jsonObject.getString(REV)));
99+
if (jsonObject.containsKey(FROM)) {
100+
documents.add(Element.of(FROM, jsonObject.getString(FROM)));
101+
}
102+
if (jsonObject.containsKey(TO)) {
103+
documents.add(Element.of(TO, jsonObject.getString(TO)));
104+
}
88105
String collection = id.split("/")[0];
89106
return CommunicationEntity.of(collection, documents);
90107
}
91108

109+
static ArangoDBCommunicationEdge toEdge(JsonObject edge, JsonObject from, JsonObject to) {
110+
String id = edge.getString(ID);
111+
String label = id.split("/")[0];
112+
Map<String, Object> properties = edge.entrySet().stream()
113+
.filter(e -> !META_FIELDS.contains(e.getKey()))
114+
.map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), toDocuments(e.getValue())))
115+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
116+
117+
return new ArangoDBCommunicationEdge(id, toEntity(edge), toEntity(from), label, properties);
118+
}
119+
92120
static JsonObject toJsonObject(CommunicationEntity entity) {
93121
return toJsonObject(entity.elements());
94122
}

0 commit comments

Comments
 (0)