From bd7b7c8ec5f00f979b6ec5d43e1d164dba6a87e1 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Thu, 15 Sep 2022 11:51:33 +0200 Subject: [PATCH 1/2] docker images upd --- .github/workflows/maven.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8c39e88be..9ec9c06e8 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,10 +21,10 @@ jobs: docker-img: - docker.io/arangodb/arangodb:3.8.7 - docker.io/arangodb/arangodb:3.9.3 - - docker.io/arangodb/arangodb-preview:3.10-nightly + - docker.io/arangodb/arangodb-preview:3.10.0-beta.1 - docker.io/arangodb/enterprise:3.8.7 - docker.io/arangodb/enterprise:3.9.3 - - docker.io/arangodb/enterprise-preview:3.10-nightly + - docker.io/arangodb/enterprise-preview:3.10.0-beta.1 topology: - single - cluster From 36a058a3c98fe229efa6e314571bba4f25a144ce Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Thu, 15 Sep 2022 18:25:50 +0200 Subject: [PATCH 2/2] arangosearch nested links --- .../entity/arangosearch/CollectionLink.java | 16 +++++ .../entity/arangosearch/FieldLink.java | 15 +++++ .../velocypack/VPackDeserializers.java | 14 +++++ .../internal/velocypack/VPackSerializers.java | 58 ++++++++++++------- .../java/com/arangodb/ArangoSearchTest.java | 53 +++++++++++------ 5 files changed, 115 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java b/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java index adf57d9da..246662ec9 100644 --- a/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java +++ b/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java @@ -35,11 +35,13 @@ public class CollectionLink { private Boolean trackListPositions; private StoreValuesType storeValues; private final Collection fields; + private final Collection nested; private CollectionLink(final String name) { super(); this.name = name; fields = new ArrayList<>(); + nested = new ArrayList<>(); analyzers = new ArrayList<>(); } @@ -100,6 +102,16 @@ public CollectionLink fields(final FieldLink... fields) { return this; } + /** + * @param nested A list of nested fields + * @return link + * @since ArangoDB 3.10 + */ + public CollectionLink nested(final FieldLink... nested) { + this.nested.addAll(Arrays.asList(nested)); + return this; + } + public String getName() { return name; } @@ -124,4 +136,8 @@ public Collection getFields() { return fields; } + public Collection getNested() { + return nested; + } + } \ No newline at end of file diff --git a/src/main/java/com/arangodb/entity/arangosearch/FieldLink.java b/src/main/java/com/arangodb/entity/arangosearch/FieldLink.java index d6bf26381..69d37b634 100644 --- a/src/main/java/com/arangodb/entity/arangosearch/FieldLink.java +++ b/src/main/java/com/arangodb/entity/arangosearch/FieldLink.java @@ -12,11 +12,13 @@ public class FieldLink { private Boolean trackListPositions; private StoreValuesType storeValues; private final Collection fields; + private final Collection nested; private FieldLink(final String name) { super(); this.name = name; fields = new ArrayList<>(); + nested = new ArrayList<>(); analyzers = new ArrayList<>(); } @@ -77,6 +79,16 @@ public FieldLink fields(final FieldLink... fields) { return this; } + /** + * @param nested A list of nested fields + * @return link + * @since ArangoDB 3.10 + */ + public FieldLink nested(final FieldLink... nested) { + this.nested.addAll(Arrays.asList(nested)); + return this; + } + public String getName() { return name; } @@ -101,4 +113,7 @@ public Collection getFields() { return fields; } + public Collection getNested() { + return nested; + } } \ No newline at end of file diff --git a/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java b/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java index 5c72b8e0e..3971cac66 100644 --- a/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java +++ b/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java @@ -221,6 +221,13 @@ public class VPackDeserializers { link.fields(deserializeField(fieldsIterator.next())); } } + final VPackSlice nested = value.get("nested"); + if (nested.isObject()) { + final Iterator> fieldsIterator = nested.objectIterator(); + while (fieldsIterator.hasNext()) { + link.nested(deserializeField(fieldsIterator.next())); + } + } properties.addLink(link); } } @@ -284,6 +291,13 @@ protected static FieldLink deserializeField(final Entry fiel link.fields(deserializeField(fieldsIterator.next())); } } + final VPackSlice nested = value.get("nested"); + if (nested.isObject()) { + final Iterator> fieldsIterator = nested.objectIterator(); + while (fieldsIterator.hasNext()) { + link.nested(deserializeField(fieldsIterator.next())); + } + } return link; } diff --git a/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java b/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java index 4d786183d..467b1add6 100644 --- a/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java +++ b/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java @@ -184,6 +184,7 @@ public class VPackSerializers { builder.add("storeValues", storeValues.name().toLowerCase(Locale.ENGLISH)); } serializeFieldLinks(builder, collectionLink.getFields()); + serializeNested(builder, collectionLink.getNested()); builder.close(); } builder.close(); @@ -229,31 +230,44 @@ public class VPackSerializers { private static void serializeFieldLinks(final VPackBuilder builder, final Collection links) { if (!links.isEmpty()) { builder.add("fields", ValueType.OBJECT); - for (final FieldLink fieldLink : links) { - builder.add(fieldLink.getName(), ValueType.OBJECT); - final Collection analyzers = fieldLink.getAnalyzers(); - if (!analyzers.isEmpty()) { - builder.add("analyzers", ValueType.ARRAY); - for (final String analyzer : analyzers) { - builder.add(analyzer); - } - builder.close(); - } - final Boolean includeAllFields = fieldLink.getIncludeAllFields(); - if (includeAllFields != null) { - builder.add("includeAllFields", includeAllFields); - } - final Boolean trackListPositions = fieldLink.getTrackListPositions(); - if (trackListPositions != null) { - builder.add("trackListPositions", trackListPositions); - } - final StoreValuesType storeValues = fieldLink.getStoreValues(); - if (storeValues != null) { - builder.add("storeValues", storeValues.name().toLowerCase(Locale.ENGLISH)); + serializeFields(builder, links); + builder.close(); + } + } + + private static void serializeNested(final VPackBuilder builder, final Collection nested) { + if (!nested.isEmpty()) { + builder.add("nested", ValueType.OBJECT); + serializeFields(builder, nested); + builder.close(); + } + } + + private static void serializeFields(final VPackBuilder builder, final Collection links){ + for (final FieldLink fieldLink : links) { + builder.add(fieldLink.getName(), ValueType.OBJECT); + final Collection analyzers = fieldLink.getAnalyzers(); + if (!analyzers.isEmpty()) { + builder.add("analyzers", ValueType.ARRAY); + for (final String analyzer : analyzers) { + builder.add(analyzer); } - serializeFieldLinks(builder, fieldLink.getFields()); builder.close(); } + final Boolean includeAllFields = fieldLink.getIncludeAllFields(); + if (includeAllFields != null) { + builder.add("includeAllFields", includeAllFields); + } + final Boolean trackListPositions = fieldLink.getTrackListPositions(); + if (trackListPositions != null) { + builder.add("trackListPositions", trackListPositions); + } + final StoreValuesType storeValues = fieldLink.getStoreValues(); + if (storeValues != null) { + builder.add("storeValues", storeValues.name().toLowerCase(Locale.ENGLISH)); + } + serializeFieldLinks(builder, fieldLink.getFields()); + serializeNested(builder, fieldLink.getNested()); builder.close(); } } diff --git a/src/test/java/com/arangodb/ArangoSearchTest.java b/src/test/java/com/arangodb/ArangoSearchTest.java index 3a3d66ce8..cb4489ca8 100644 --- a/src/test/java/com/arangodb/ArangoSearchTest.java +++ b/src/test/java/com/arangodb/ArangoSearchTest.java @@ -754,19 +754,20 @@ void enhancedTextAnalyzerTyped(ArangoDatabase db) { void arangoSearchOptions(ArangoDatabase db) { assumeTrue(isAtLeastVersion(3, 4)); String viewName = "view-" + rnd(); - ArangoSearchCreateOptions options = new ArangoSearchCreateOptions() - .link( - CollectionLink.on(COLL_1) - .analyzers("identity") - .fields( - FieldLink.on("id") - .analyzers("identity") - ) - .includeAllFields(true) - .storeValues(StoreValuesType.ID) - .trackListPositions(false) - - ); + FieldLink field = FieldLink.on("f1"); + if (isEnterprise()) { + field.nested(FieldLink.on("f2")); + } + CollectionLink link = CollectionLink.on(COLL_1) + .analyzers("identity") + .fields(field) + .includeAllFields(true) + .storeValues(StoreValuesType.ID) + .trackListPositions(false); + if (isEnterprise()) { + link.nested(FieldLink.on("f3")); + } + ArangoSearchCreateOptions options = new ArangoSearchCreateOptions().link(link); final ArangoSearch view = db.arangoSearch(viewName); view.create(options); @@ -776,13 +777,27 @@ void arangoSearchOptions(ArangoDatabase db) { assertThat(properties.getId()).isNotNull(); assertThat(properties.getName()).isEqualTo(viewName); assertThat(properties.getType()).isEqualTo(ViewType.ARANGO_SEARCH); + assertThat(properties.getLinks()).isNotEmpty(); + + CollectionLink createdLink = properties.getLinks().iterator().next(); + assertThat(createdLink.getName()).isEqualTo(COLL_1); + assertThat(createdLink.getAnalyzers()).contains("identity"); + assertThat(createdLink.getIncludeAllFields()).isTrue(); + assertThat(createdLink.getStoreValues()).isEqualTo(StoreValuesType.ID); + assertThat(createdLink.getTrackListPositions()).isFalse(); + if (isEnterprise() && isAtLeastVersion(3, 10)) { + assertThat(createdLink.getNested()).isNotEmpty(); + FieldLink nested = createdLink.getNested().iterator().next(); + assertThat(nested.getName()).isEqualTo("f3"); + } - CollectionLink link = properties.getLinks().iterator().next(); - assertThat(link.getAnalyzers()).contains("identity"); - assertThat(link.getName()).isEqualTo(COLL_1); - assertThat(link.getIncludeAllFields()).isTrue(); - assertThat(link.getStoreValues()).isEqualTo(StoreValuesType.ID); - assertThat(link.getTrackListPositions()).isFalse(); + FieldLink fieldLink = createdLink.getFields().iterator().next(); + assertThat(fieldLink.getName()).isEqualTo("f1"); + if (isEnterprise() && isAtLeastVersion(3, 10)) { + assertThat(fieldLink.getNested()).isNotEmpty(); + FieldLink nested = fieldLink.getNested().iterator().next(); + assertThat(nested.getName()).isEqualTo("f2"); + } } @ParameterizedTest(name = "{index}")