From 50dfed72b7d472bdd8306008dece15c3389539d7 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 13:13:17 +0200 Subject: [PATCH 01/10] Create a test repository dedicated to default consistency. --- .../AirportDefaultConsistencyRepository.java | 41 +++++++++++++++++++ .../couchbase/domain/AirportRepository.java | 4 -- 2 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java diff --git a/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java b/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java new file mode 100644 index 000000000..82ba16f27 --- /dev/null +++ b/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java @@ -0,0 +1,41 @@ +/* + * Copyright 2017-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.couchbase.domain; + +import com.couchbase.client.java.query.QueryScanConsistency; +import org.springframework.data.couchbase.core.RemoveResult; +import org.springframework.data.couchbase.repository.CouchbaseRepository; +import org.springframework.data.couchbase.repository.Query; +import org.springframework.data.couchbase.repository.ScanConsistency; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * Airport repository for testing default consistency
+ * + * @author Jonathan Massuchetti + */ +@Repository +public interface AirportDefaultConsistencyRepository extends CouchbaseRepository { + + Airport iata(String iata); +} diff --git a/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java b/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java index 0265fe7c8..d849d32e3 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java @@ -43,10 +43,6 @@ @Repository public interface AirportRepository extends CouchbaseRepository { - // NOT_BOUNDED to test ScanConsistency - // @ScanConsistency(query = QueryScanConsistency.NOT_BOUNDED) - Airport iata(String iata); - @Override @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) List findAll(); From 91895a79fa66b4b5098236d3c6e9ec7a92f2efa5 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 13:13:59 +0200 Subject: [PATCH 02/10] Test default consistency being used with CouchbaseRepository findAll. Related tickets #1243 --- ...chbaseRepositoryQueryIntegrationTests.java | 57 ++++++++++++++----- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java index 72ec1bbe8..313579d6e 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -57,20 +57,13 @@ import org.springframework.data.couchbase.core.query.N1QLExpression; import org.springframework.data.couchbase.core.query.Query; import org.springframework.data.couchbase.core.query.QueryCriteria; -import org.springframework.data.couchbase.domain.Address; -import org.springframework.data.couchbase.domain.Airport; -import org.springframework.data.couchbase.domain.AirportRepository; -import org.springframework.data.couchbase.domain.Iata; -import org.springframework.data.couchbase.domain.NaiveAuditorAware; -import org.springframework.data.couchbase.domain.Person; -import org.springframework.data.couchbase.domain.PersonRepository; -import org.springframework.data.couchbase.domain.User; -import org.springframework.data.couchbase.domain.UserRepository; +import org.springframework.data.couchbase.domain.*; import org.springframework.data.couchbase.domain.time.AuditingDateTimeProvider; import org.springframework.data.couchbase.repository.auditing.EnableCouchbaseAuditing; import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; import org.springframework.data.couchbase.repository.query.CouchbaseQueryMethod; import org.springframework.data.couchbase.repository.query.CouchbaseRepositoryQuery; +import org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository; import org.springframework.data.couchbase.util.Capabilities; import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests; import org.springframework.data.couchbase.util.ClusterType; @@ -92,6 +85,7 @@ * @author Michael Nitschinger * @author Michael Reiche * @author Jens Schauder + * @author Jonathan Massuchetti */ @SpringJUnitConfig(CouchbaseRepositoryQueryIntegrationTests.Config.class) @IgnoreWhen(missesCapabilities = Capabilities.QUERY, clusterTypes = ClusterType.MOCKED) @@ -101,6 +95,9 @@ public class CouchbaseRepositoryQueryIntegrationTests extends ClusterAwareIntegr @Autowired AirportRepository airportRepository; + @Autowired + AirportDefaultConsistencyRepository airportDefaultConsistencyRepository; + @Autowired UserRepository userRepository; @Autowired CouchbaseTemplate couchbaseTemplate; @@ -212,9 +209,9 @@ public void saveNotBounded() { Airport airport2 = null; for (int i = 1; i <= 100; i++) { // set version == 0 so save() will be an upsert, not a replace - Airport saved = airportRepository.save(vie.clearVersion()); + Airport saved = airportDefaultConsistencyRepository.save(vie.clearVersion()); try { - airport2 = airportRepository.iata(saved.getIata()); + airport2 = airportDefaultConsistencyRepository.iata(saved.getIata()); if (airport2 == null) { break; } @@ -227,14 +224,14 @@ public void saveNotBounded() { assertEquals(vie.getId(), removeResult.getId()); assertTrue(removeResult.getCas() != 0); assertTrue(removeResult.getMutationToken().isPresent()); - Airport airport3 = airportRepository.iata(vie.getIata()); + Airport airport3 = airportDefaultConsistencyRepository.iata(vie.getIata()); assertNull(airport3, "should have been removed"); } } assertNull(airport2, "airport2 should have likely been null at least once"); - Airport saved = airportRepository.save(vie.clearVersion()); + Airport saved = airportDefaultConsistencyRepository.save(vie.clearVersion()); couchbaseTemplate.findByQuery(Airport.class).withConsistency(REQUEST_PLUS).all(); - airport2 = airportRepository.iata(vie.getIata()); + airport2 = airportDefaultConsistencyRepository.iata(vie.getIata()); RemoveResult removeResult = couchbaseTemplate.removeById().one(saved.getId()); assertNotNull(airport2, "airport2 should have been found"); } @@ -244,7 +241,7 @@ public void saveNotBoundedRequestPlus() { ApplicationContext ac = new AnnotationConfigApplicationContext(ConfigRequestPlus.class); // the Config class has been modified, these need to be loaded again CouchbaseTemplate couchbaseTemplateRP = (CouchbaseTemplate) ac.getBean(COUCHBASE_TEMPLATE); - AirportRepository airportRepositoryRP = (AirportRepository) ac.getBean("airportRepository"); + AirportDefaultConsistencyRepository airportRepositoryRP = (AirportDefaultConsistencyRepository) ac.getBean("airportDefaultConsistencyRepository"); // save() followed by query with NOT_BOUNDED will result in not finding the document Airport vie = new Airport("airports::vie", "vie", "low9"); @@ -277,6 +274,36 @@ public void saveNotBoundedRequestPlus() { assertFalse(!airports.isEmpty(), "airports should have been empty"); } + + @Test + public void saveNotBoundedRequestPlusWithDefaultRepository() { + ApplicationContext ac = new AnnotationConfigApplicationContext(ConfigRequestPlus.class); + // the Config class has been modified, these need to be loaded again + CouchbaseTemplate couchbaseTemplateRP = (CouchbaseTemplate) ac.getBean(COUCHBASE_TEMPLATE); + AirportDefaultConsistencyRepository airportRepositoryRP = (AirportDefaultConsistencyRepository) ac.getBean("airportDefaultConsistencyRepository"); + + List sizeBeforeTest = airportRepositoryRP.findAll(); + assertEquals(0, sizeBeforeTest.size()); + + List idsToRemove = new ArrayList<>(100); + for (int i = 1; i <= 100; i++) { + Airport vie = new Airport("airports::vie" + i, "vie" + i, "low9"); + Airport saved = airportRepositoryRP.save(vie); + idsToRemove.add(saved.getId()); + } + + List allSaved = airportRepositoryRP.findAll(); + + boolean success = allSaved.size() == 100; + + for (String idToRemove : idsToRemove) { + couchbaseTemplateRP.removeById().one(idToRemove); + } + + assertTrue(success); + } + + @Test void findByTypeAlias() { Airport vie = null; From 9ef1cd81fd0e29faa8ea34708d74b8e1ced99619 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 14:28:08 +0200 Subject: [PATCH 03/10] Take template default consistency into account when building the query scan consistency. Closes #1243 --- .../repository/support/SimpleCouchbaseRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java index c91235d4b..af8e83115 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java @@ -44,6 +44,7 @@ * @author Michael Nitschinger * @author Mark Paluch * @author Jens Schauder + * @author Jonathan Massuchetti */ public class SimpleCouchbaseRepository implements CouchbaseRepository { @@ -191,6 +192,11 @@ private List findAll(Query query) { private QueryScanConsistency buildQueryScanConsistency() { QueryScanConsistency scanConsistency = QueryScanConsistency.NOT_BOUNDED; + + if (couchbaseOperations.getConsistency() != null) { + scanConsistency = couchbaseOperations.getConsistency(); + } + if (crudMethodMetadata.getScanConsistency() != null) { scanConsistency = crudMethodMetadata.getScanConsistency().query(); } From bef9f83b59250a4f8fcc22cf44e181d4ad3cd740 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 14:35:24 +0200 Subject: [PATCH 04/10] Clean imports. --- .../domain/AirportDefaultConsistencyRepository.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java b/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java index 82ba16f27..a7aa85302 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/AirportDefaultConsistencyRepository.java @@ -16,19 +16,9 @@ package org.springframework.data.couchbase.domain; -import com.couchbase.client.java.query.QueryScanConsistency; -import org.springframework.data.couchbase.core.RemoveResult; import org.springframework.data.couchbase.repository.CouchbaseRepository; -import org.springframework.data.couchbase.repository.Query; -import org.springframework.data.couchbase.repository.ScanConsistency; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - /** * Airport repository for testing default consistency
* @@ -38,4 +28,5 @@ public interface AirportDefaultConsistencyRepository extends CouchbaseRepository { Airport iata(String iata); + } From 0423d07d106efd62cb753fa1e9993591e404a879 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 21:04:19 +0200 Subject: [PATCH 05/10] Query scan consistency is null unless specified. --- .../couchbase/repository/support/SimpleCouchbaseRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java index af8e83115..d7ae730fa 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java @@ -191,7 +191,7 @@ private List findAll(Query query) { } private QueryScanConsistency buildQueryScanConsistency() { - QueryScanConsistency scanConsistency = QueryScanConsistency.NOT_BOUNDED; + QueryScanConsistency scanConsistency = null; if (couchbaseOperations.getConsistency() != null) { scanConsistency = couchbaseOperations.getConsistency(); From 7fc3206d112aed34cb0cd02b65e98310c7fa5f7a Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 21:04:57 +0200 Subject: [PATCH 06/10] Apply query scan consistency fix to reactive repository. --- .../support/SimpleReactiveCouchbaseRepository.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java index 7cf8320e5..a98734d05 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java @@ -206,7 +206,12 @@ private Flux findAll(Query query) { } private QueryScanConsistency buildQueryScanConsistency() { - QueryScanConsistency scanConsistency = QueryScanConsistency.NOT_BOUNDED; + QueryScanConsistency scanConsistency = null; + + if (operations.getConsistency() != null) { + scanConsistency = operations.getConsistency(); + } + if (crudMethodMetadata.getScanConsistency() != null) { scanConsistency = crudMethodMetadata.getScanConsistency().query(); } From 59f3c926507a36b092475001d3c0b3114e621005 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 21:20:14 +0200 Subject: [PATCH 07/10] Reactive repository for default scan consistency tests. --- ...veAirportDefaultConsistencyRepository.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java diff --git a/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java b/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java new file mode 100644 index 000000000..a8da49d0e --- /dev/null +++ b/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java @@ -0,0 +1,43 @@ +/* + * Copyright 2017-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.couchbase.domain; + +import com.couchbase.client.java.json.JsonArray; +import com.couchbase.client.java.query.QueryScanConsistency; +import org.springframework.data.couchbase.repository.Query; +import org.springframework.data.couchbase.repository.ScanConsistency; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.reactive.ReactiveSortingRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.ArrayList; + +/** + * template class for Reactive Couchbase operations + * + * @author Michael Nitschinger + * @author Michael Reiche + */ +@Repository +public interface ReactiveAirportDefaultConsistencyRepository extends ReactiveSortingRepository { + +} From f3bf2f9e0a9ce049923c3f310ebf8d27d6d75d8b Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Mon, 18 Oct 2021 21:20:46 +0200 Subject: [PATCH 08/10] Test reactive repository default scan consistency. --- .../SimpleReactiveCouchbaseRepository.java | 1 + ...veAirportDefaultConsistencyRepository.java | 3 +- ...chbaseRepositoryQueryIntegrationTests.java | 2 - ...chbaseRepositoryQueryIntegrationTests.java | 83 +++++++++++++++++-- 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java index a98734d05..4abb303a8 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java @@ -46,6 +46,7 @@ * @author David Kelly * @author Douglas Six * @author Jens Schauder + * @author Jonathan Massuchetti * @since 3.0 */ public class SimpleReactiveCouchbaseRepository implements ReactiveCouchbaseRepository { diff --git a/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java b/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java index a8da49d0e..2ffbfab4b 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportDefaultConsistencyRepository.java @@ -34,8 +34,7 @@ /** * template class for Reactive Couchbase operations * - * @author Michael Nitschinger - * @author Michael Reiche + * @author Jonathan Massuchetti */ @Repository public interface ReactiveAirportDefaultConsistencyRepository extends ReactiveSortingRepository { diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java index 313579d6e..d0c182847 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -274,7 +274,6 @@ public void saveNotBoundedRequestPlus() { assertFalse(!airports.isEmpty(), "airports should have been empty"); } - @Test public void saveNotBoundedRequestPlusWithDefaultRepository() { ApplicationContext ac = new AnnotationConfigApplicationContext(ConfigRequestPlus.class); @@ -303,7 +302,6 @@ public void saveNotBoundedRequestPlusWithDefaultRepository() { assertTrue(success); } - @Test void findByTypeAlias() { Airport vie = null; diff --git a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java index ed07c651c..8d106cf47 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java @@ -16,21 +16,32 @@ package org.springframework.data.couchbase.repository; +import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS; import static java.util.Arrays.asList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; - +import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE; +import static org.springframework.data.couchbase.config.BeanNames.REACTIVE_COUCHBASE_TEMPLATE; + +import com.couchbase.client.java.query.QueryScanConsistency; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.data.auditing.DateTimeProvider; +import org.springframework.data.couchbase.core.CouchbaseTemplate; +import org.springframework.data.couchbase.core.ReactiveCouchbaseTemplate; +import org.springframework.data.couchbase.domain.*; +import org.springframework.data.couchbase.domain.time.AuditingDateTimeProvider; +import org.springframework.data.couchbase.repository.auditing.EnableCouchbaseAuditing; +import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import java.time.Instant; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -44,10 +55,6 @@ import org.springframework.dao.DataRetrievalFailureException; import org.springframework.data.couchbase.CouchbaseClientFactory; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; -import org.springframework.data.couchbase.domain.Airport; -import org.springframework.data.couchbase.domain.ReactiveAirportRepository; -import org.springframework.data.couchbase.domain.ReactiveUserRepository; -import org.springframework.data.couchbase.domain.User; import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories; import org.springframework.data.couchbase.util.Capabilities; import org.springframework.data.couchbase.util.ClusterType; @@ -61,6 +68,7 @@ * * @author Michael Nitschinger * @author Michael Reiche + * @author Jonathan Massuchetti */ @SpringJUnitConfig(ReactiveCouchbaseRepositoryQueryIntegrationTests.Config.class) @IgnoreWhen(missesCapabilities = Capabilities.QUERY, clusterTypes = ClusterType.MOCKED) @@ -249,6 +257,34 @@ void deleteAll() { } } + @Test + public void saveNotBoundedRequestPlusWithDefaultRepository() { + ApplicationContext ac = new AnnotationConfigApplicationContext(ConfigRequestPlus.class); + // the Config class has been modified, these need to be loaded again + ReactiveCouchbaseTemplate couchbaseTemplateRP = (ReactiveCouchbaseTemplate) ac.getBean(REACTIVE_COUCHBASE_TEMPLATE); + ReactiveAirportDefaultConsistencyRepository airportRepositoryRP = (ReactiveAirportDefaultConsistencyRepository) ac.getBean("reactiveAirportDefaultConsistencyRepository"); + + List sizeBeforeTest = airportRepositoryRP.findAll().collectList().block(); + assertEquals(0, sizeBeforeTest.size()); + + List idsToRemove = new ArrayList<>(100); + for (int i = 1; i <= 100; i++) { + Airport vie = new Airport("airports::vie" + i, "vie" + i, "low9"); + Airport saved = airportRepositoryRP.save(vie).block(); + idsToRemove.add(saved.getId()); + } + + List allSaved = airportRepositoryRP.findAll().collectList().block(); + + boolean success = allSaved.size() == 100; + + for (String idToRemove : idsToRemove) { + couchbaseTemplateRP.removeById().one(idToRemove); + } + + assertTrue(success); + } + @Configuration @EnableReactiveCouchbaseRepositories("org.springframework.data.couchbase") static class Config extends AbstractCouchbaseConfiguration { @@ -275,4 +311,33 @@ public String getBucketName() { } + @Configuration + @EnableReactiveCouchbaseRepositories("org.springframework.data.couchbase") + static class ConfigRequestPlus extends AbstractCouchbaseConfiguration { + + @Override + public String getConnectionString() { + return connectionString(); + } + + @Override + public String getUserName() { + return config().adminUsername(); + } + + @Override + public String getPassword() { + return config().adminPassword(); + } + + @Override + public String getBucketName() { + return bucketName(); + } + + @Override + public QueryScanConsistency getDefaultConsistency() { + return REQUEST_PLUS; + } + } } From c4415e9582a2e972688f9d15a7ee3b942affc34c Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Tue, 19 Oct 2021 11:34:57 +0200 Subject: [PATCH 09/10] Avoid consistency default behavior duplication. --- .../support/SimpleCouchbaseRepository.java | 21 +++++++----------- .../SimpleReactiveCouchbaseRepository.java | 22 +++++++------------ 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java index d7ae730fa..44d2d39a8 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleCouchbaseRepository.java @@ -16,14 +16,7 @@ package org.springframework.data.couchbase.repository.support; -import static org.springframework.data.couchbase.repository.support.Util.hasNonZeroVersionProperty; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - +import com.couchbase.client.java.query.QueryScanConsistency; import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.core.query.Query; import org.springframework.data.couchbase.repository.CouchbaseRepository; @@ -36,7 +29,13 @@ import org.springframework.data.util.Streamable; import org.springframework.util.Assert; -import com.couchbase.client.java.query.QueryScanConsistency; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.springframework.data.couchbase.repository.support.Util.hasNonZeroVersionProperty; /** * Repository base implementation for Couchbase. @@ -193,10 +192,6 @@ private List findAll(Query query) { private QueryScanConsistency buildQueryScanConsistency() { QueryScanConsistency scanConsistency = null; - if (couchbaseOperations.getConsistency() != null) { - scanConsistency = couchbaseOperations.getConsistency(); - } - if (crudMethodMetadata.getScanConsistency() != null) { scanConsistency = crudMethodMetadata.getScanConsistency().query(); } diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java index 4abb303a8..845d5e1bd 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/SimpleReactiveCouchbaseRepository.java @@ -16,15 +16,7 @@ package org.springframework.data.couchbase.repository.support; -import static org.springframework.data.couchbase.repository.support.Util.hasNonZeroVersionProperty; - -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - +import com.couchbase.client.java.query.QueryScanConsistency; import org.reactivestreams.Publisher; import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.core.ReactiveCouchbaseOperations; @@ -34,8 +26,14 @@ import org.springframework.data.domain.Sort; import org.springframework.data.util.Streamable; import org.springframework.util.Assert; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; -import com.couchbase.client.java.query.QueryScanConsistency; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static org.springframework.data.couchbase.repository.support.Util.hasNonZeroVersionProperty; /** * Reactive repository base implementation for Couchbase. @@ -209,10 +207,6 @@ private Flux findAll(Query query) { private QueryScanConsistency buildQueryScanConsistency() { QueryScanConsistency scanConsistency = null; - if (operations.getConsistency() != null) { - scanConsistency = operations.getConsistency(); - } - if (crudMethodMetadata.getScanConsistency() != null) { scanConsistency = crudMethodMetadata.getScanConsistency().query(); } From 523195cacf0b562a2f5a3fb244d54314571a9577 Mon Sep 17 00:00:00 2001 From: Jonathan Massuchetti Date: Tue, 19 Oct 2021 11:36:20 +0200 Subject: [PATCH 10/10] Tests request plus consistency now use deleteAll with request plus. This is to make sure other tests won't see documents from pending index mutations --- ...chbaseRepositoryQueryIntegrationTests.java | 61 +++++++--------- ...chbaseRepositoryQueryIntegrationTests.java | 70 ++++++++----------- 2 files changed, 54 insertions(+), 77 deletions(-) diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java index d0c182847..c9b1af668 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -16,30 +16,9 @@ package org.springframework.data.couchbase.repository; -import static com.couchbase.client.java.query.QueryScanConsistency.NOT_BOUNDED; -import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.Optional; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.stream.Collectors; - +import com.couchbase.client.core.error.CouchbaseException; +import com.couchbase.client.core.error.IndexExistsException; +import com.couchbase.client.java.query.QueryScanConsistency; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -63,7 +42,6 @@ import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; import org.springframework.data.couchbase.repository.query.CouchbaseQueryMethod; import org.springframework.data.couchbase.repository.query.CouchbaseRepositoryQuery; -import org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository; import org.springframework.data.couchbase.util.Capabilities; import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests; import org.springframework.data.couchbase.util.ClusterType; @@ -75,9 +53,24 @@ import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import com.couchbase.client.core.error.CouchbaseException; -import com.couchbase.client.core.error.IndexExistsException; -import com.couchbase.client.java.query.QueryScanConsistency; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.stream.Collectors; + +import static com.couchbase.client.java.query.QueryScanConsistency.NOT_BOUNDED; +import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS; +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE; /** * Repository tests @@ -284,22 +277,16 @@ public void saveNotBoundedRequestPlusWithDefaultRepository() { List sizeBeforeTest = airportRepositoryRP.findAll(); assertEquals(0, sizeBeforeTest.size()); - List idsToRemove = new ArrayList<>(100); for (int i = 1; i <= 100; i++) { Airport vie = new Airport("airports::vie" + i, "vie" + i, "low9"); - Airport saved = airportRepositoryRP.save(vie); - idsToRemove.add(saved.getId()); + airportRepositoryRP.save(vie); } List allSaved = airportRepositoryRP.findAll(); - boolean success = allSaved.size() == 100; - - for (String idToRemove : idsToRemove) { - couchbaseTemplateRP.removeById().one(idToRemove); - } + airportRepository.deleteAll(); - assertTrue(success); + assertEquals(100, allSaved.size()); } @Test diff --git a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java index 8d106cf47..1823f8ff3 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java @@ -16,45 +16,22 @@ package org.springframework.data.couchbase.repository; -import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS; -import static java.util.Arrays.asList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE; -import static org.springframework.data.couchbase.config.BeanNames.REACTIVE_COUCHBASE_TEMPLATE; - import com.couchbase.client.java.query.QueryScanConsistency; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.data.auditing.DateTimeProvider; -import org.springframework.data.couchbase.core.CouchbaseTemplate; -import org.springframework.data.couchbase.core.ReactiveCouchbaseTemplate; -import org.springframework.data.couchbase.domain.*; -import org.springframework.data.couchbase.domain.time.AuditingDateTimeProvider; -import org.springframework.data.couchbase.repository.auditing.EnableCouchbaseAuditing; -import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -import java.time.Instant; -import java.util.*; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataRetrievalFailureException; import org.springframework.data.couchbase.CouchbaseClientFactory; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; +import org.springframework.data.couchbase.core.ReactiveCouchbaseTemplate; +import org.springframework.data.couchbase.domain.Airport; +import org.springframework.data.couchbase.domain.ReactiveAirportDefaultConsistencyRepository; +import org.springframework.data.couchbase.domain.ReactiveAirportRepository; +import org.springframework.data.couchbase.domain.ReactiveUserRepository; +import org.springframework.data.couchbase.domain.User; import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories; import org.springframework.data.couchbase.util.Capabilities; import org.springframework.data.couchbase.util.ClusterType; @@ -62,6 +39,25 @@ import org.springframework.data.couchbase.util.JavaIntegrationTests; import org.springframework.data.domain.PageRequest; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.time.Instant; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.stream.Collectors; + +import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS; +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.data.couchbase.config.BeanNames.REACTIVE_COUCHBASE_TEMPLATE; /** * template class for Reactive Couchbase operations @@ -267,22 +263,16 @@ public void saveNotBoundedRequestPlusWithDefaultRepository() { List sizeBeforeTest = airportRepositoryRP.findAll().collectList().block(); assertEquals(0, sizeBeforeTest.size()); - List idsToRemove = new ArrayList<>(100); for (int i = 1; i <= 100; i++) { Airport vie = new Airport("airports::vie" + i, "vie" + i, "low9"); - Airport saved = airportRepositoryRP.save(vie).block(); - idsToRemove.add(saved.getId()); + airportRepositoryRP.save(vie).block(); } List allSaved = airportRepositoryRP.findAll().collectList().block(); - boolean success = allSaved.size() == 100; - - for (String idToRemove : idsToRemove) { - couchbaseTemplateRP.removeById().one(idToRemove); - } + airportRepository.deleteAll().block(); - assertTrue(success); + assertEquals(100, allSaved.size()); } @Configuration