diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 242d0727d..aa1bdd7f1 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -22,12 +22,12 @@ jobs: fail-fast: false matrix: 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/enterprise:3.8.7 - - docker.io/arangodb/enterprise:3.9.3 - - docker.io/arangodb/enterprise-preview:3.10-nightly + - docker.io/arangodb/arangodb:3.8.8 + - docker.io/arangodb/arangodb:3.9.5 + - docker.io/arangodb/arangodb:3.10.1 + - docker.io/arangodb/enterprise:3.8.8 + - docker.io/arangodb/enterprise:3.9.5 + - docker.io/arangodb/enterprise:3.10.1 topology: - single - cluster @@ -39,12 +39,12 @@ jobs: user-language: - en include: - - docker-img: docker.io/arangodb/arangodb:3.9.3 + - docker-img: docker.io/arangodb/arangodb:3.10.1 topology: single db-ext-names: true java-version: 11 user-language: tr - - docker-img: docker.io/arangodb/enterprise:3.9.3 + - docker-img: docker.io/arangodb/enterprise:3.10.1 topology: cluster db-ext-names: true java-version: 17 @@ -94,7 +94,7 @@ jobs: fail-fast: false matrix: docker-img: - - docker.io/arangodb/enterprise:3.9.3 + - docker.io/arangodb/enterprise:3.10.1 topology: - single - cluster @@ -141,7 +141,7 @@ jobs: fail-fast: false matrix: docker-img: - - docker.io/arangodb/enterprise:3.9.1 + - docker.io/arangodb/enterprise:3.10.1 topology: - cluster db-ext-names: diff --git a/.github/workflows/native.yml b/.github/workflows/native.yml index 61ee29718..e6e0fb324 100644 --- a/.github/workflows/native.yml +++ b/.github/workflows/native.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: docker-img: - - docker.io/arangodb/enterprise:3.9.3 + - docker.io/arangodb/enterprise:3.10.1 topology: - cluster db-ext-names: diff --git a/docker/start_db.sh b/docker/start_db.sh index f5a946dbf..ee231d427 100755 --- a/docker/start_db.sh +++ b/docker/start_db.sh @@ -70,7 +70,7 @@ docker run -d \ --auth.jwt-secret=/jwtSecret \ --starter.address="${GW}" \ --docker.image="${DOCKER_IMAGE}" \ - --starter.local --starter.mode=${STARTER_MODE} --all.log.level=debug --all.log.output=+ --log.verbose + --starter.local --starter.mode=${STARTER_MODE} --all.log.level=debug --all.log.output=+ --log.verbose --all.server.descriptors-minimum=1024 wait_server() { diff --git a/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java b/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java index ad94f3f40..9336cc739 100644 --- a/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java +++ b/src/main/java/com/arangodb/entity/arangosearch/CollectionLink.java @@ -37,6 +37,7 @@ public class CollectionLink { private final Collection fields; private final Collection nested; private Boolean inBackground; + private Boolean cache; private CollectionLink(final String name) { super(); @@ -125,6 +126,19 @@ public CollectionLink inBackground(final Boolean inBackground) { return this; } + /** + * @param cache If you enable this option, then field normalization values are always cached in memory. This can + * improve the performance of scoring and ranking queries. Otherwise, these values are memory-mapped + * and it is up to the operating system to load them from disk into memory and to evict them from + * memory. + * @return link + * @since ArangoDB 3.9.5, Enterprise Edition only + */ + public CollectionLink cache(final Boolean cache) { + this.cache = cache; + return this; + } + public String getName() { return name; } @@ -156,4 +170,7 @@ public Collection getNested() { public Boolean getInBackground() { return inBackground; } + public Boolean getCache() { + return cache; + } } \ No newline at end of file diff --git a/src/main/java/com/arangodb/entity/arangosearch/StoredValue.java b/src/main/java/com/arangodb/entity/arangosearch/StoredValue.java index 9c620cbae..62dc6456c 100644 --- a/src/main/java/com/arangodb/entity/arangosearch/StoredValue.java +++ b/src/main/java/com/arangodb/entity/arangosearch/StoredValue.java @@ -33,14 +33,21 @@ public class StoredValue { private final List fields; private final ArangoSearchCompression compression; + private final Boolean cache; /** * @param fields A list of attribute paths. The . character denotes sub-attributes. * @param compression Defines how to compress the attribute values. + * @param cache Whether to cache stored values in memory. (Since ArangoDB 3.9.5, Enterprise Edition only) */ - public StoredValue(List fields, ArangoSearchCompression compression) { + public StoredValue(List fields, ArangoSearchCompression compression, Boolean cache) { this.fields = fields; this.compression = compression; + this.cache = cache; + } + + public StoredValue(List fields, ArangoSearchCompression compression) { + this(fields, compression, null); } public StoredValue(List fields) { @@ -55,16 +62,20 @@ public ArangoSearchCompression getCompression() { return compression; } + public Boolean getCache() { + return cache; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StoredValue that = (StoredValue) o; - return Objects.equals(fields, that.fields) && compression == that.compression; + return Objects.equals(fields, that.fields) && compression == that.compression && Objects.equals(cache, that.cache); } @Override public int hashCode() { - return Objects.hash(fields, compression); + return Objects.hash(fields, compression, cache); } } diff --git a/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java b/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java index e8bc847f1..39e1e08c1 100644 --- a/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java +++ b/src/main/java/com/arangodb/internal/velocypack/VPackDeserializers.java @@ -156,12 +156,14 @@ public class VPackDeserializers { public static final VPackDeserializer STORED_VALUE = (parent, vpack, context) -> { VPackSlice fields = vpack.get("fields"); VPackSlice compression = vpack.get("compression"); + VPackSlice cache = vpack.get("cache"); + Boolean cacheValue = cache.isBoolean() ? cache.getAsBoolean() : null; final Iterator fieldsIterator = fields.arrayIterator(); List fieldsList = new ArrayList<>(); while (fieldsIterator.hasNext()) { fieldsList.add(fieldsIterator.next().getAsString()); } - return new StoredValue(fieldsList, ArangoSearchCompression.valueOf(compression.getAsString())); + return new StoredValue(fieldsList, ArangoSearchCompression.valueOf(compression.getAsString()), cacheValue); }; public static final VPackDeserializer ARANGO_SEARCH_PROPERTIES = (parent, vpack, context) -> { @@ -205,6 +207,10 @@ public class VPackDeserializers { if (includeAllFields.isBoolean()) { link.includeAllFields(includeAllFields.getAsBoolean()); } + final VPackSlice cache = value.get("cache"); + if (cache.isBoolean()) { + link.cache(cache.getAsBoolean()); + } final VPackSlice trackListPositions = value.get("trackListPositions"); if (trackListPositions.isBoolean()) { link.trackListPositions(trackListPositions.getAsBoolean()); diff --git a/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java b/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java index 8c487e8e8..c9ce989d4 100644 --- a/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java +++ b/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java @@ -30,7 +30,6 @@ import com.arangodb.model.TraversalOptions.Order; import com.arangodb.model.ZKDIndexOptions; import com.arangodb.model.arangosearch.ArangoSearchPropertiesOptions; -import com.arangodb.model.arangosearch.SearchAliasCreateOptions; import com.arangodb.velocypack.*; import com.arangodb.velocystream.Request; @@ -193,6 +192,10 @@ public class VPackSerializers { if (inBackground != null) { builder.add("inBackground", inBackground); } + Boolean cache = collectionLink.getCache(); + if (cache != null) { + builder.add("cache", cache); + } serializeFieldLinks(builder, collectionLink.getFields()); serializeNested(builder, collectionLink.getNested()); builder.close(); @@ -255,6 +258,9 @@ public class VPackSerializers { if (value.getCompression() != null) { builder.add("compression", value.getCompression().getValue()); } + if (value.getCache() != null) { + builder.add("cache", value.getCache()); + } builder.close(); // close object }; diff --git a/src/test/java/com/arangodb/ArangoSearchTest.java b/src/test/java/com/arangodb/ArangoSearchTest.java index 91eada291..559d5bd7b 100644 --- a/src/test/java/com/arangodb/ArangoSearchTest.java +++ b/src/test/java/com/arangodb/ArangoSearchTest.java @@ -918,11 +918,14 @@ void arangoSearchOptions(ArangoDatabase db) { .includeAllFields(true) .storeValues(StoreValuesType.ID) .trackListPositions(false) - .inBackground(true); + .inBackground(true) + .cache(true); if (isEnterprise()) { link.nested(FieldLink.on("f3")); } ArangoSearchCreateOptions options = new ArangoSearchCreateOptions().link(link); + StoredValue storedValue = new StoredValue(Arrays.asList("a", "b"), ArangoSearchCompression.none, true); + options.storedValues(storedValue); final ArangoSearch view = db.arangoSearch(viewName); view.create(options); @@ -940,6 +943,14 @@ void arangoSearchOptions(ArangoDatabase db) { assertThat(createdLink.getIncludeAllFields()).isTrue(); assertThat(createdLink.getStoreValues()).isEqualTo(StoreValuesType.ID); assertThat(createdLink.getTrackListPositions()).isFalse(); + + if (isEnterprise() && isAtLeastVersion(3, 9, 5) && isLessThanVersion(3, 10)) { + assertThat(createdLink.getCache()).isTrue(); + assertThat(properties.getStoredValues()) + .isNotEmpty() + .allSatisfy(it -> assertThat(it.getCache()).isTrue()); + } + if (isEnterprise() && isAtLeastVersion(3, 10)) { assertThat(createdLink.getNested()).isNotEmpty(); FieldLink nested = createdLink.getNested().iterator().next();