Skip to content

Commit e7ef2e9

Browse files
committed
ArangoDB: use jakarta.json.JsonObject instead of com.arangodb.entity.BaseDocument
1 parent d86dc9e commit e7ef2e9

File tree

3 files changed

+107
-103
lines changed

3 files changed

+107
-103
lines changed

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
* Contributors:
1212
*
1313
* Otavio Santana
14+
* Michele Rastelli
1415
*/
1516
package org.eclipse.jnosql.databases.arangodb.communication;
1617

1718

1819
import com.arangodb.ArangoDB;
19-
import com.arangodb.entity.BaseDocument;
20+
import jakarta.json.Json;
21+
import jakarta.json.JsonObject;
2022
import jakarta.json.bind.Jsonb;
2123
import org.eclipse.jnosql.communication.Value;
2224
import org.eclipse.jnosql.communication.driver.JsonbSupplier;
@@ -41,8 +43,9 @@
4143
public class ArangoDBBucketManager implements BucketManager {
4244

4345

46+
private static final String KEY = "_key";
4447
private static final String VALUE = "_value";
45-
private static final Function<BaseDocument, String> TO_JSON = e -> e.getAttribute(VALUE).toString();
48+
private static final Function<JsonObject, String> TO_JSON = e -> e.getString(VALUE);
4649
private static final Jsonb JSONB = JsonbSupplier.getInstance().get();
4750

4851
private final ArangoDB arangoDB;
@@ -66,14 +69,15 @@ public String name() {
6669
public <K, V> void put(K key, V value) throws NullPointerException {
6770
Objects.requireNonNull(key, "Key is required");
6871
Objects.requireNonNull(value, "value is required");
69-
BaseDocument baseDocument = new BaseDocument();
70-
baseDocument.setKey(key.toString());
71-
baseDocument.addAttribute(VALUE, JSONB.toJson(value));
72+
JsonObject jsonObject = Json.createObjectBuilder()
73+
.add(KEY, key.toString())
74+
.add(VALUE, JSONB.toJson(value))
75+
.build();
7276
if (arangoDB.db(bucketName).collection(namespace).documentExists(key.toString())) {
7377
arangoDB.db(bucketName).collection(namespace).deleteDocument(key.toString());
7478
}
7579
arangoDB.db(bucketName).collection(namespace)
76-
.insertDocument(baseDocument);
80+
.insertDocument(jsonObject);
7781
}
7882

7983
@Override
@@ -91,8 +95,8 @@ public void put(Iterable<KeyValueEntity> keyValueEntities) throws NullPointerEx
9195
@Override
9296
public <K> Optional<Value> get(K key) throws NullPointerException {
9397
Objects.requireNonNull(key, "Key is required");
94-
BaseDocument entity = arangoDB.db(bucketName).collection(namespace)
95-
.getDocument(key.toString(), BaseDocument.class);
98+
JsonObject entity = arangoDB.db(bucketName).collection(namespace)
99+
.getDocument(key.toString(), JsonObject.class);
96100

97101
return ofNullable(entity)
98102
.map(TO_JSON)
@@ -105,7 +109,7 @@ public <K> Iterable<Value> get(Iterable<K> keys) throws NullPointerException {
105109
return stream(keys.spliterator(), false)
106110
.map(Object::toString)
107111
.map(k -> arangoDB.db(bucketName).collection(namespace)
108-
.getDocument(k, BaseDocument.class))
112+
.getDocument(k, JsonObject.class))
109113
.filter(Objects::nonNull)
110114
.map(TO_JSON)
111115
.map(ValueJSON::of)

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

Lines changed: 82 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,33 @@
1111
* Contributors:
1212
*
1313
* Otavio Santana
14+
* Michele Rastelli
1415
*/
1516
package org.eclipse.jnosql.databases.arangodb.communication;
1617

1718

1819
import com.arangodb.ArangoDB;
19-
import com.arangodb.entity.BaseDocument;
2020
import com.arangodb.entity.CollectionEntity;
21-
import org.eclipse.jnosql.communication.Value;
21+
import jakarta.json.Json;
22+
import jakarta.json.JsonArray;
23+
import jakarta.json.JsonArrayBuilder;
24+
import jakarta.json.JsonNumber;
25+
import jakarta.json.JsonObject;
26+
import jakarta.json.JsonObjectBuilder;
27+
import jakarta.json.JsonString;
28+
import jakarta.json.JsonValue;
2229
import org.eclipse.jnosql.communication.ValueUtil;
2330
import org.eclipse.jnosql.communication.semistructured.CommunicationEntity;
2431
import org.eclipse.jnosql.communication.semistructured.Element;
2532

26-
import java.util.ArrayList;
2733
import java.util.Collection;
28-
import java.util.HashMap;
34+
import java.util.Collections;
2935
import java.util.List;
3036
import java.util.Map;
3137
import java.util.Objects;
32-
import java.util.function.Function;
3338
import java.util.logging.Level;
3439
import java.util.logging.Logger;
3540

36-
import static java.util.Collections.singletonMap;
3741
import static java.util.stream.Collectors.toList;
3842
import static java.util.stream.StreamSupport.stream;
3943

@@ -47,9 +51,6 @@ public final class ArangoDBUtil {
4751
public static final String REV = "_rev";
4852
private static final Logger LOGGER = Logger.getLogger(ArangoDBUtil.class.getName());
4953

50-
private static final Function<Map.Entry<?, ?>, Element> ENTRY_DOCUMENT = entry ->
51-
Element.of(entry.getKey().toString(), entry.getValue());
52-
5354
private ArangoDBUtil() {
5455
}
5556

@@ -71,101 +72,100 @@ public static void checkCollection(String bucketName, ArangoDB arangoDB, String
7172
List<String> collections = arangoDB.db(bucketName)
7273
.getCollections().stream()
7374
.map(CollectionEntity::getName)
74-
.collect(toList());
75+
.toList();
7576
if (!collections.contains(namespace)) {
7677
arangoDB.db(bucketName).createCollection(namespace);
7778
}
7879
}
7980

81+
static CommunicationEntity toEntity(JsonObject jsonObject) {
82+
List<Element> documents = toDocuments(jsonObject);
8083

81-
static CommunicationEntity toEntity(BaseDocument document) {
82-
Map<String, Object> properties = document.getProperties();
83-
List<Element> documents = properties.keySet().stream()
84-
.map(k -> toDocument(k, properties))
85-
.collect(toList());
86-
87-
documents.add(Element.of(KEY, document.getKey()));
88-
documents.add(Element.of(ID, document.getId()));
89-
documents.add(Element.of(REV, document.getRevision()));
90-
String collection = document.getId().split("/")[0];
84+
String id = jsonObject.getString(ID);
85+
documents.add(Element.of(KEY, jsonObject.getString(KEY)));
86+
documents.add(Element.of(ID, id));
87+
documents.add(Element.of(REV, jsonObject.getString(REV)));
88+
String collection = id.split("/")[0];
9189
return CommunicationEntity.of(collection, documents);
9290
}
9391

94-
static BaseDocument getBaseDocument(CommunicationEntity entity) {
95-
Map<String, Object> map = new HashMap<>();
96-
for (Element document : entity.elements()) {
97-
if(KEY.equals(document.name()) && Objects.isNull(document.get())) {
98-
continue;
99-
}
100-
map.put(document.name(), convert(document.value()));
101-
}
102-
return new BaseDocument(map);
92+
static JsonObject toJsonObject(CommunicationEntity entity) {
93+
return toJsonObject(entity.elements());
10394
}
10495

105-
private static Element toDocument(String key, Map<String, Object> properties) {
106-
Object value = properties.get(key);
107-
if (value instanceof Map map) {
108-
return Element.of(key, map.keySet()
109-
.stream().map(k -> toDocument(k.toString(), map))
110-
.collect(toList()));
111-
}
112-
if (isADocumentIterable(value)) {
113-
List<List<Element>> documents = new ArrayList<>();
114-
for (Object object : Iterable.class.cast(value)) {
115-
Map<?, ?> map = Map.class.cast(object);
116-
documents.add(map.entrySet().stream().map(ENTRY_DOCUMENT).collect(toList()));
117-
}
118-
return Element.of(key, documents);
119-
120-
}
121-
return Element.of(key, value);
96+
private static List<Element> toDocuments(JsonObject object) {
97+
return object.entrySet().stream()
98+
.map(it -> Element.of(it.getKey(), toDocuments(it.getValue())))
99+
.collect(toList());
122100
}
123101

124-
private static boolean isADocumentIterable(Object value) {
125-
return Iterable.class.isInstance(value) &&
126-
stream(Iterable.class.cast(value).spliterator(), false)
127-
.allMatch(Map.class::isInstance);
102+
private static List<?> toDocuments(JsonArray array) {
103+
return array.stream()
104+
.map(ArangoDBUtil::toDocuments)
105+
.toList();
128106
}
129107

130-
private static Object convert(Value value) {
131-
Object val = ValueUtil.convert(value);
132-
133-
if (Element.class.isInstance(val)) {
134-
Element document = Element.class.cast(val);
135-
return singletonMap(document.name(), convert(document.value()));
136-
}
137-
if (isSudDocument(val)) {
138-
return getMap(val);
139-
}
140-
if (isSudDocumentList(val)) {
141-
return stream(Iterable.class.cast(val).spliterator(), false)
142-
.map(ArangoDBUtil::getMap).collect(toList());
143-
}
144-
return val;
108+
private static Object toDocuments(JsonValue value) {
109+
return switch (value.getValueType()) {
110+
case OBJECT -> toDocuments(value.asJsonObject());
111+
case ARRAY -> toDocuments(value.asJsonArray());
112+
case STRING -> ((JsonString) value).getString();
113+
case NUMBER -> ((JsonNumber) value).numberValue();
114+
case TRUE -> true;
115+
case FALSE -> false;
116+
case NULL -> null;
117+
};
145118
}
146119

147-
private static Object getMap(Object val) {
148-
Iterable<?> iterable = Iterable.class.cast(val);
149-
Map<Object, Object> map = new HashMap<>();
150-
for (Object item : iterable) {
151-
var document = cast(item);
152-
map.put(document.name(), document.get());
120+
private static JsonObject toJsonObject(Iterable<Element> elements) {
121+
JsonObjectBuilder builder = Json.createObjectBuilder();
122+
for (Element document : elements) {
123+
if (KEY.equals(document.name()) && Objects.isNull(document.get())) {
124+
continue;
125+
}
126+
Object value = ValueUtil.convert(document.value());
127+
builder.add(document.name(), toJsonValue(value));
153128
}
154-
return map;
129+
return builder.build();
155130
}
156131

157-
private static boolean isSudDocumentList(Object value) {
158-
return value instanceof Iterable && stream(Iterable.class.cast(value).spliterator(), false).
159-
allMatch(d -> d instanceof Iterable && isSudDocument(d));
160-
}
161-
162-
private static boolean isSudDocument(Object value) {
163-
return value instanceof Iterable && stream(Iterable.class.cast(value).spliterator(), false).
164-
allMatch(Element.class::isInstance);
132+
@SuppressWarnings("unchecked")
133+
private static JsonValue toJsonValue(Object value) {
134+
if (value instanceof Element document) {
135+
return toJsonObject(Collections.singletonList(document));
136+
} else if (value instanceof Iterable<?> iterable) {
137+
if (isSubDocument(iterable)) {
138+
return toJsonObject((Iterable<Element>) iterable);
139+
} else {
140+
JsonArrayBuilder builder = Json.createArrayBuilder();
141+
for (Object it : iterable) {
142+
builder.add(toJsonValue(it));
143+
}
144+
return builder.build();
145+
}
146+
} else if (value instanceof Map<?, ?> map) {
147+
JsonObjectBuilder builder = Json.createObjectBuilder();
148+
for (Map.Entry<?, ?> e : map.entrySet()) {
149+
builder.add((String) e.getKey(), toJsonValue(e.getValue()));
150+
}
151+
return builder.build();
152+
} else if (Objects.isNull(value)) {
153+
return JsonValue.NULL;
154+
} else if (value instanceof Number number) {
155+
return Json.createValue(number);
156+
} else if (value instanceof String string) {
157+
return Json.createValue(string);
158+
} else if (Boolean.TRUE.equals(value)) {
159+
return JsonValue.TRUE;
160+
} else if (Boolean.FALSE.equals(value)) {
161+
return JsonValue.FALSE;
162+
} else {
163+
throw new IllegalArgumentException("Unsupported type: " + value.getClass());
164+
}
165165
}
166166

167-
private static Element cast(Object document) {
168-
return Element.class.cast(document);
167+
private static boolean isSubDocument(Iterable<?> iterable) {
168+
return stream(iterable.spliterator(), false).allMatch(Element.class::isInstance);
169169
}
170170

171171
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.arangodb.entity.BaseDocument;
2020
import com.arangodb.entity.DocumentCreateEntity;
2121
import com.arangodb.entity.DocumentUpdateEntity;
22+
import jakarta.json.JsonObject;
2223
import org.eclipse.jnosql.communication.semistructured.CommunicationEntity;
2324
import org.eclipse.jnosql.communication.semistructured.DeleteQuery;
2425
import org.eclipse.jnosql.communication.semistructured.Element;
@@ -63,10 +64,10 @@ public CommunicationEntity insert(CommunicationEntity entity) {
6364
requireNonNull(entity, "entity is required");
6465
String collectionName = entity.name();
6566
checkCollection(collectionName);
66-
BaseDocument baseDocument = ArangoDBUtil.getBaseDocument(entity);
67-
DocumentCreateEntity<Void> arandoDocument = arangoDB.db(database)
68-
.collection(collectionName).insertDocument(baseDocument);
69-
updateEntity(entity, arandoDocument.getKey(), arandoDocument.getId(), arandoDocument.getRev());
67+
JsonObject jsonObject = ArangoDBUtil.toJsonObject(entity);
68+
DocumentCreateEntity<Void> arangoDocument = arangoDB.db(database)
69+
.collection(collectionName).insertDocument(jsonObject);
70+
updateEntity(entity, arangoDocument.getKey(), arangoDocument.getId(), arangoDocument.getRev());
7071
return entity;
7172
}
7273

@@ -79,10 +80,10 @@ public CommunicationEntity update(CommunicationEntity entity) {
7980
.orElseThrow(() -> new IllegalArgumentException("The document does not provide" +
8081
" the _id column"));
8182
feedKey(entity, id);
82-
BaseDocument baseDocument = ArangoDBUtil.getBaseDocument(entity);
83-
DocumentUpdateEntity<Void> arandoDocument = arangoDB.db(database)
84-
.collection(collectionName).updateDocument(baseDocument.getKey(), baseDocument);
85-
updateEntity(entity, arandoDocument.getKey(), arandoDocument.getId(), arandoDocument.getRev());
83+
JsonObject jsonObject = ArangoDBUtil.toJsonObject(entity);
84+
DocumentUpdateEntity<Void> arangoDocument = arangoDB.db(database)
85+
.collection(collectionName).updateDocument(jsonObject.getString(KEY), jsonObject);
86+
updateEntity(entity, arangoDocument.getKey(), arangoDocument.getId(), arangoDocument.getRev());
8687
return entity;
8788
}
8889

@@ -124,8 +125,8 @@ public Stream<CommunicationEntity> select(SelectQuery query) throws NullPointerE
124125
requireNonNull(query, "query is required");
125126
AQLQueryResult result = QueryAQLConverter.select(query);
126127
LOGGER.finest("Executing AQL: " + result.query());
127-
ArangoCursor<BaseDocument> documents = arangoDB.db(database).query(result.query(),
128-
BaseDocument.class,
128+
ArangoCursor<JsonObject> documents = arangoDB.db(database).query(result.query(),
129+
JsonObject.class,
129130
result.values(), null);
130131

131132
return StreamSupport.stream(documents.spliterator(), false)
@@ -146,10 +147,9 @@ public long count(String documentCollection) {
146147
public Stream<CommunicationEntity> aql(String query, Map<String, Object> params) throws NullPointerException {
147148
requireNonNull(query, "query is required");
148149
requireNonNull(params, "values is required");
149-
ArangoCursor<BaseDocument> result = arangoDB.db(database).query(query,BaseDocument.class, params, null);
150+
ArangoCursor<JsonObject> result = arangoDB.db(database).query(query, JsonObject.class, params, null);
150151
return StreamSupport.stream(result.spliterator(), false)
151152
.map(ArangoDBUtil::toEntity);
152-
153153
}
154154

155155
@Override

0 commit comments

Comments
 (0)