From 85fc802516075f99bb309efabc9d8b6f456f35df Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Wed, 17 May 2023 00:03:23 +0200 Subject: [PATCH] fixed merge AQL options from @QueryOptions annotation and AqlQueryOptions parameter (#276) --- pom.xml | 2 +- .../repository/query/AbstractArangoQuery.java | 64 +++++++++++-------- .../repository/CustomerRepository.java | 4 ++ .../repository/query/ArangoAqlQueryTest.java | 21 +++++- 4 files changed, 63 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 257242128..09d5b2d32 100644 --- a/pom.xml +++ b/pom.xml @@ -299,7 +299,7 @@ com.arangodb arangodb-java-driver - 6.22.0 + 6.24.0 org.mockito diff --git a/src/main/java/com/arangodb/springframework/repository/query/AbstractArangoQuery.java b/src/main/java/com/arangodb/springframework/repository/query/AbstractArangoQuery.java index d4473b703..bc6d2f5ea 100644 --- a/src/main/java/com/arangodb/springframework/repository/query/AbstractArangoQuery.java +++ b/src/main/java/com/arangodb/springframework/repository/query/AbstractArangoQuery.java @@ -132,39 +132,53 @@ protected AqlQueryOptions mergeQueryOptions(final AqlQueryOptions oldStatic, fin if (newDynamic == null) { return oldStatic; } - final Integer batchSize = newDynamic.getBatchSize(); - if (batchSize != null) { - oldStatic.batchSize(batchSize); + + AqlQueryOptions mergedOptions = newDynamic.clone(); + + if (mergedOptions.getBatchSize() == null) { + mergedOptions.batchSize(oldStatic.getBatchSize()); } - final Integer maxPlans = newDynamic.getMaxPlans(); - if (maxPlans != null) { - oldStatic.maxPlans(maxPlans); + + if (mergedOptions.getCache() == null) { + mergedOptions.cache(oldStatic.getCache()); } - final Integer ttl = newDynamic.getTtl(); - if (ttl != null) { - oldStatic.ttl(ttl); + + if (mergedOptions.getCount() == null) { + mergedOptions.count(oldStatic.getCount()); } - final Boolean cache = newDynamic.getCache(); - if (cache != null) { - oldStatic.cache(cache); + + if (mergedOptions.getFullCount() == null) { + mergedOptions.fullCount(oldStatic.getFullCount()); } - final Boolean count = newDynamic.getCount(); - if (count != null) { - oldStatic.count(count); + + if (mergedOptions.getMaxPlans() == null) { + mergedOptions.maxPlans(oldStatic.getMaxPlans()); } - final Boolean fullCount = newDynamic.getFullCount(); - if (fullCount != null) { - oldStatic.fullCount(fullCount); + + if (mergedOptions.getProfile() == null) { + mergedOptions.profile(oldStatic.getProfile()); } - final Boolean profile = newDynamic.getProfile(); - if (profile != null) { - oldStatic.profile(profile); + if (mergedOptions.getRules() == null) { + mergedOptions.rules(oldStatic.getRules()); } - final Collection rules = newDynamic.getRules(); - if (rules != null) { - oldStatic.rules(rules); + + if (mergedOptions.getTtl() == null) { + mergedOptions.ttl(oldStatic.getTtl()); } - return oldStatic; + + if (mergedOptions.getStream() == null) { + mergedOptions.stream(oldStatic.getStream()); + } + + if (mergedOptions.getMemoryLimit() == null) { + mergedOptions.memoryLimit(oldStatic.getMemoryLimit()); + } + + if (mergedOptions.getAllowDirtyRead() == null) { + mergedOptions.allowDirtyRead(oldStatic.getAllowDirtyRead()); + } + + return mergedOptions; } private Class getTypeToRead(final ResultProcessor processor) { diff --git a/src/test/java/com/arangodb/springframework/repository/CustomerRepository.java b/src/test/java/com/arangodb/springframework/repository/CustomerRepository.java index 08c171141..491dbbc74 100644 --- a/src/test/java/com/arangodb/springframework/repository/CustomerRepository.java +++ b/src/test/java/com/arangodb/springframework/repository/CustomerRepository.java @@ -51,6 +51,10 @@ public interface CustomerRepository extends ArangoRepository, @Query("FOR c IN #collection FILTER c._key == @id AND c.`customer-name` == @name RETURN c") ArangoCursor findOneByBindVarsAql(AqlQueryOptions options, @BindVars Map bindVars); + @QueryOptions(count = true) + @Query("for i in @n..10000 return 1/i") + ArangoCursor sequenceTo10K(@Param("n") Integer n, AqlQueryOptions options); + @Query("FOR c IN #collection FILTER c._key == @id AND c.`customer-name` == @name RETURN c") Customer findOneByNameAndBindVarsAql(@Param("name") String name, @BindVars Map bindVars); diff --git a/src/test/java/com/arangodb/springframework/repository/query/ArangoAqlQueryTest.java b/src/test/java/com/arangodb/springframework/repository/query/ArangoAqlQueryTest.java index a4d0d35ca..341592b59 100644 --- a/src/test/java/com/arangodb/springframework/repository/query/ArangoAqlQueryTest.java +++ b/src/test/java/com/arangodb/springframework/repository/query/ArangoAqlQueryTest.java @@ -4,8 +4,7 @@ import static org.hamcrest.Matchers.*; import static org.hamcrest.collection.IsIn.isOneOf; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.time.Instant; import java.util.*; @@ -92,6 +91,24 @@ public void findOneByBindVarsAqlTest() { assertEquals(john, retrieved.next()); } + @Test + public void overrideQueryOptions() { + Integer countNotOverridden = repository.sequenceTo10K(1, new AqlQueryOptions()).getCount(); + assertThat(countNotOverridden, is(10_000)); + + Integer countOverridden = repository.sequenceTo10K(1, new AqlQueryOptions().count(false)).getCount(); + assertThat(countOverridden, nullValue()); + } + + @Test + public void mergeQueryOptions() { + List cursorNotMerged = repository.sequenceTo10K(0, new AqlQueryOptions()).asListRemaining(); + assertThat(cursorNotMerged, hasSize(10_001)); + assertThat(cursorNotMerged.get(0), nullValue()); + assertThrows(ArangoDBException.class, + ()-> repository.sequenceTo10K(0, new AqlQueryOptions().failOnWarning(true))); + } + @Test public void findOneByComplementingNameAndBindVarsAqlTest() { repository.saveAll(customers);