Skip to content

Commit 0f80bc0

Browse files
authored
[DE-392] nested search support (#460)
* docker images upd * arangosearch nested links
1 parent 1900820 commit 0f80bc0

File tree

6 files changed

+117
-43
lines changed

6 files changed

+117
-43
lines changed

.github/workflows/maven.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ jobs:
2121
docker-img:
2222
- docker.io/arangodb/arangodb:3.8.7
2323
- docker.io/arangodb/arangodb:3.9.3
24-
- docker.io/arangodb/arangodb-preview:3.10-nightly
24+
- docker.io/arangodb/arangodb-preview:3.10.0-beta.1
2525
- docker.io/arangodb/enterprise:3.8.7
2626
- docker.io/arangodb/enterprise:3.9.3
27-
- docker.io/arangodb/enterprise-preview:3.10-nightly
27+
- docker.io/arangodb/enterprise-preview:3.10.0-beta.1
2828
topology:
2929
- single
3030
- cluster

src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java

+16
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ public class CollectionLink {
3535
private Boolean trackListPositions;
3636
private StoreValuesType storeValues;
3737
private final Collection<FieldLink> fields;
38+
private final Collection<FieldLink> nested;
3839

3940
private CollectionLink(final String name) {
4041
super();
4142
this.name = name;
4243
fields = new ArrayList<>();
44+
nested = new ArrayList<>();
4345
analyzers = new ArrayList<>();
4446
}
4547

@@ -100,6 +102,16 @@ public CollectionLink fields(final FieldLink... fields) {
100102
return this;
101103
}
102104

105+
/**
106+
* @param nested A list of nested fields
107+
* @return link
108+
* @since ArangoDB 3.10
109+
*/
110+
public CollectionLink nested(final FieldLink... nested) {
111+
this.nested.addAll(Arrays.asList(nested));
112+
return this;
113+
}
114+
103115
public String getName() {
104116
return name;
105117
}
@@ -124,4 +136,8 @@ public Collection<FieldLink> getFields() {
124136
return fields;
125137
}
126138

139+
public Collection<FieldLink> getNested() {
140+
return nested;
141+
}
142+
127143
}

src/main/java/com/arangodb/entity/arangosearch/FieldLink.java

+15
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ public class FieldLink {
1212
private Boolean trackListPositions;
1313
private StoreValuesType storeValues;
1414
private final Collection<FieldLink> fields;
15+
private final Collection<FieldLink> nested;
1516

1617
private FieldLink(final String name) {
1718
super();
1819
this.name = name;
1920
fields = new ArrayList<>();
21+
nested = new ArrayList<>();
2022
analyzers = new ArrayList<>();
2123
}
2224

@@ -77,6 +79,16 @@ public FieldLink fields(final FieldLink... fields) {
7779
return this;
7880
}
7981

82+
/**
83+
* @param nested A list of nested fields
84+
* @return link
85+
* @since ArangoDB 3.10
86+
*/
87+
public FieldLink nested(final FieldLink... nested) {
88+
this.nested.addAll(Arrays.asList(nested));
89+
return this;
90+
}
91+
8092
public String getName() {
8193
return name;
8294
}
@@ -101,4 +113,7 @@ public Collection<FieldLink> getFields() {
101113
return fields;
102114
}
103115

116+
public Collection<FieldLink> getNested() {
117+
return nested;
118+
}
104119
}

src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java

+14
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,13 @@ public class VPackDeserializers {
221221
link.fields(deserializeField(fieldsIterator.next()));
222222
}
223223
}
224+
final VPackSlice nested = value.get("nested");
225+
if (nested.isObject()) {
226+
final Iterator<Entry<String, VPackSlice>> fieldsIterator = nested.objectIterator();
227+
while (fieldsIterator.hasNext()) {
228+
link.nested(deserializeField(fieldsIterator.next()));
229+
}
230+
}
224231
properties.addLink(link);
225232
}
226233
}
@@ -284,6 +291,13 @@ protected static FieldLink deserializeField(final Entry<String, VPackSlice> fiel
284291
link.fields(deserializeField(fieldsIterator.next()));
285292
}
286293
}
294+
final VPackSlice nested = value.get("nested");
295+
if (nested.isObject()) {
296+
final Iterator<Entry<String, VPackSlice>> fieldsIterator = nested.objectIterator();
297+
while (fieldsIterator.hasNext()) {
298+
link.nested(deserializeField(fieldsIterator.next()));
299+
}
300+
}
287301
return link;
288302
}
289303

src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java

+36-22
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public class VPackSerializers {
184184
builder.add("storeValues", storeValues.name().toLowerCase(Locale.ENGLISH));
185185
}
186186
serializeFieldLinks(builder, collectionLink.getFields());
187+
serializeNested(builder, collectionLink.getNested());
187188
builder.close();
188189
}
189190
builder.close();
@@ -229,31 +230,44 @@ public class VPackSerializers {
229230
private static void serializeFieldLinks(final VPackBuilder builder, final Collection<FieldLink> links) {
230231
if (!links.isEmpty()) {
231232
builder.add("fields", ValueType.OBJECT);
232-
for (final FieldLink fieldLink : links) {
233-
builder.add(fieldLink.getName(), ValueType.OBJECT);
234-
final Collection<String> analyzers = fieldLink.getAnalyzers();
235-
if (!analyzers.isEmpty()) {
236-
builder.add("analyzers", ValueType.ARRAY);
237-
for (final String analyzer : analyzers) {
238-
builder.add(analyzer);
239-
}
240-
builder.close();
241-
}
242-
final Boolean includeAllFields = fieldLink.getIncludeAllFields();
243-
if (includeAllFields != null) {
244-
builder.add("includeAllFields", includeAllFields);
245-
}
246-
final Boolean trackListPositions = fieldLink.getTrackListPositions();
247-
if (trackListPositions != null) {
248-
builder.add("trackListPositions", trackListPositions);
249-
}
250-
final StoreValuesType storeValues = fieldLink.getStoreValues();
251-
if (storeValues != null) {
252-
builder.add("storeValues", storeValues.name().toLowerCase(Locale.ENGLISH));
233+
serializeFields(builder, links);
234+
builder.close();
235+
}
236+
}
237+
238+
private static void serializeNested(final VPackBuilder builder, final Collection<FieldLink> nested) {
239+
if (!nested.isEmpty()) {
240+
builder.add("nested", ValueType.OBJECT);
241+
serializeFields(builder, nested);
242+
builder.close();
243+
}
244+
}
245+
246+
private static void serializeFields(final VPackBuilder builder, final Collection<FieldLink> links){
247+
for (final FieldLink fieldLink : links) {
248+
builder.add(fieldLink.getName(), ValueType.OBJECT);
249+
final Collection<String> analyzers = fieldLink.getAnalyzers();
250+
if (!analyzers.isEmpty()) {
251+
builder.add("analyzers", ValueType.ARRAY);
252+
for (final String analyzer : analyzers) {
253+
builder.add(analyzer);
253254
}
254-
serializeFieldLinks(builder, fieldLink.getFields());
255255
builder.close();
256256
}
257+
final Boolean includeAllFields = fieldLink.getIncludeAllFields();
258+
if (includeAllFields != null) {
259+
builder.add("includeAllFields", includeAllFields);
260+
}
261+
final Boolean trackListPositions = fieldLink.getTrackListPositions();
262+
if (trackListPositions != null) {
263+
builder.add("trackListPositions", trackListPositions);
264+
}
265+
final StoreValuesType storeValues = fieldLink.getStoreValues();
266+
if (storeValues != null) {
267+
builder.add("storeValues", storeValues.name().toLowerCase(Locale.ENGLISH));
268+
}
269+
serializeFieldLinks(builder, fieldLink.getFields());
270+
serializeNested(builder, fieldLink.getNested());
257271
builder.close();
258272
}
259273
}

src/test/java/com/arangodb/ArangoSearchTest.java

+34-19
Original file line numberDiff line numberDiff line change
@@ -754,19 +754,20 @@ void enhancedTextAnalyzerTyped(ArangoDatabase db) {
754754
void arangoSearchOptions(ArangoDatabase db) {
755755
assumeTrue(isAtLeastVersion(3, 4));
756756
String viewName = "view-" + rnd();
757-
ArangoSearchCreateOptions options = new ArangoSearchCreateOptions()
758-
.link(
759-
CollectionLink.on(COLL_1)
760-
.analyzers("identity")
761-
.fields(
762-
FieldLink.on("id")
763-
.analyzers("identity")
764-
)
765-
.includeAllFields(true)
766-
.storeValues(StoreValuesType.ID)
767-
.trackListPositions(false)
768-
769-
);
757+
FieldLink field = FieldLink.on("f1");
758+
if (isEnterprise()) {
759+
field.nested(FieldLink.on("f2"));
760+
}
761+
CollectionLink link = CollectionLink.on(COLL_1)
762+
.analyzers("identity")
763+
.fields(field)
764+
.includeAllFields(true)
765+
.storeValues(StoreValuesType.ID)
766+
.trackListPositions(false);
767+
if (isEnterprise()) {
768+
link.nested(FieldLink.on("f3"));
769+
}
770+
ArangoSearchCreateOptions options = new ArangoSearchCreateOptions().link(link);
770771

771772
final ArangoSearch view = db.arangoSearch(viewName);
772773
view.create(options);
@@ -776,13 +777,27 @@ void arangoSearchOptions(ArangoDatabase db) {
776777
assertThat(properties.getId()).isNotNull();
777778
assertThat(properties.getName()).isEqualTo(viewName);
778779
assertThat(properties.getType()).isEqualTo(ViewType.ARANGO_SEARCH);
780+
assertThat(properties.getLinks()).isNotEmpty();
781+
782+
CollectionLink createdLink = properties.getLinks().iterator().next();
783+
assertThat(createdLink.getName()).isEqualTo(COLL_1);
784+
assertThat(createdLink.getAnalyzers()).contains("identity");
785+
assertThat(createdLink.getIncludeAllFields()).isTrue();
786+
assertThat(createdLink.getStoreValues()).isEqualTo(StoreValuesType.ID);
787+
assertThat(createdLink.getTrackListPositions()).isFalse();
788+
if (isEnterprise() && isAtLeastVersion(3, 10)) {
789+
assertThat(createdLink.getNested()).isNotEmpty();
790+
FieldLink nested = createdLink.getNested().iterator().next();
791+
assertThat(nested.getName()).isEqualTo("f3");
792+
}
779793

780-
CollectionLink link = properties.getLinks().iterator().next();
781-
assertThat(link.getAnalyzers()).contains("identity");
782-
assertThat(link.getName()).isEqualTo(COLL_1);
783-
assertThat(link.getIncludeAllFields()).isTrue();
784-
assertThat(link.getStoreValues()).isEqualTo(StoreValuesType.ID);
785-
assertThat(link.getTrackListPositions()).isFalse();
794+
FieldLink fieldLink = createdLink.getFields().iterator().next();
795+
assertThat(fieldLink.getName()).isEqualTo("f1");
796+
if (isEnterprise() && isAtLeastVersion(3, 10)) {
797+
assertThat(fieldLink.getNested()).isNotEmpty();
798+
FieldLink nested = fieldLink.getNested().iterator().next();
799+
assertThat(nested.getName()).isEqualTo("f2");
800+
}
786801
}
787802

788803
@ParameterizedTest(name = "{index}")

0 commit comments

Comments
 (0)