From 3787fcc1723331df686991f33be781b7b39e792a Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Tue, 23 Mar 2021 02:25:38 +0800 Subject: [PATCH 1/6] Fix indent (#1094) --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 864533fff..dd04c0ddf 100644 --- a/pom.xml +++ b/pom.xml @@ -216,11 +216,11 @@ sonatype-snapshot https://oss.sonatype.org/content/repositories/snapshots - true - + true + - false - + false + jitpack.io From 2554e6165b46f6862b62fac0056b1300f0132b68 Mon Sep 17 00:00:00 2001 From: Michael Reiche <48999328+mikereiche@users.noreply.github.com> Date: Wed, 24 Mar 2021 07:00:41 -0700 Subject: [PATCH 2/6] Update versions to correct values. Closes #1105. Co-authored-by: mikereiche --- README.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.adoc b/README.adoc index 52e76a285..9774fbccc 100644 --- a/README.adoc +++ b/README.adoc @@ -109,7 +109,7 @@ Add the Maven dependency: org.springframework.data spring-data-couchbase - ${version}.RELEASE + ${version} ---- @@ -120,7 +120,7 @@ If you'd rather like the latest snapshots of the upcoming major version, use our org.springframework.data spring-data-couchbase - ${version}.BUILD-SNAPSHOT + ${version}-SNAPSHOT From ee04012302d881b52097720e18e8e6e64c896aaf Mon Sep 17 00:00:00 2001 From: Michael Reiche <48999328+mikereiche@users.noreply.github.com> Date: Wed, 24 Mar 2021 07:57:11 -0700 Subject: [PATCH 3/6] Use queryScanConsistency on reactive deleteAll(). It was present on non-Reactive, but missing from reactive. Closes #1096. Original pull request: #1108. Co-authored-by: mikereiche --- .../SimpleReactiveCouchbaseRepository.java | 6 +++--- .../domain/ReactiveAirportRepository.java | 4 ++++ ...chbaseRepositoryQueryIntegrationTests.java | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 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 d6c69ef71..edb8ab0f4 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,7 +16,7 @@ package org.springframework.data.couchbase.repository.support; -import static org.springframework.data.couchbase.repository.support.Util.*; +import static org.springframework.data.couchbase.repository.support.Util.hasNonZeroVersionProperty; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -26,7 +26,6 @@ import java.util.stream.Collectors; import org.reactivestreams.Publisher; - import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.core.ReactiveCouchbaseOperations; import org.springframework.data.couchbase.core.query.Query; @@ -189,7 +188,8 @@ public Mono count() { @Override public Mono deleteAll() { - return operations.removeByQuery(entityInformation.getJavaType()).all().then(); + return operations.removeByQuery(entityInformation.getJavaType()).withConsistency(buildQueryScanConsistency()).all() + .then(); } /** diff --git a/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportRepository.java b/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportRepository.java index 63cb3388d..51c4d48cc 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/ReactiveAirportRepository.java @@ -45,6 +45,10 @@ public interface ReactiveAirportRepository extends ReactiveSortingRepository findAll(); + @Override + @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) + Mono deleteAll(); + @Override Mono save(Airport a); 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 d6b582f7a..1c2d0d9bd 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java @@ -195,6 +195,25 @@ void deleteAllById() { } } + @Test + void deleteAll() { + + Airport vienna = new Airport("airports::vie", "vie", "LOWW"); + Airport frankfurt = new Airport("airports::fra", "fra", "EDDF"); + Airport losAngeles = new Airport("airports::lax", "lax", "KLAX"); + + try { + airportRepository.saveAll(asList(vienna, frankfurt, losAngeles)).as(StepVerifier::create) + .expectNext(vienna, frankfurt, losAngeles).verifyComplete(); + + airportRepository.deleteAll().as(StepVerifier::create).verifyComplete(); + + airportRepository.findAll().as(StepVerifier::create).verifyComplete(); + } finally { + airportRepository.deleteAll().block(); + } + } + @Configuration @EnableReactiveCouchbaseRepositories("org.springframework.data.couchbase") static class Config extends AbstractCouchbaseConfiguration { From 322c4f663577a7714b8c2c522ff4c8a65ba451dc Mon Sep 17 00:00:00 2001 From: Michael Reiche <48999328+mikereiche@users.noreply.github.com> Date: Wed, 24 Mar 2021 12:10:28 -0700 Subject: [PATCH 4/6] Add QueryCriteria arrayContaining. Add QueryCriteria arrayContaining which maps to n1ql array_containing. Closes #1073. Original pull request: #1109. Co-authored-by: mikereiche --- .../data/couchbase/core/query/QueryCriteria.java | 7 +++++++ .../data/couchbase/core/query/QueryCriteriaTests.java | 11 +++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/core/query/QueryCriteria.java b/src/main/java/org/springframework/data/couchbase/core/query/QueryCriteria.java index 7f1305812..4b7da2459 100644 --- a/src/main/java/org/springframework/data/couchbase/core/query/QueryCriteria.java +++ b/src/main/java/org/springframework/data/couchbase/core/query/QueryCriteria.java @@ -192,6 +192,13 @@ public QueryCriteria containing(@Nullable Object o) { return this; } + public QueryCriteria arrayContaining(@Nullable Object o) { + operator = "ARRAY_CONTAINING"; + value = new Object[] { o }; + format = "array_containing(%1$s, %3$s)"; + return this; + } + public QueryCriteria notContaining(@Nullable Object o) { value = new QueryCriteria[] { wrap(containing(o)) }; operator = "NOT"; diff --git a/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java b/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java index ca1e06afd..cc563e015 100644 --- a/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java @@ -123,14 +123,11 @@ void testStartingWith() { assertEquals("`name` like (\"Cou\"||\"%\")", c.export()); } - /* cannot do this properly yet because in arg to when() in - * startingWith() cannot be a QueryCriteria @Test void testStartingWithExpr() { QueryCriteria c = where(i("name")).startingWith(where(i("name")).plus("xxx")); - assertEquals("`name` like (((`name` || "xxx") || ""%""))", c.export()); + assertEquals("`name` like (((`name` || \"xxx\"))||\"%\")", c.export()); } - */ @Test void testEndingWith() { @@ -162,6 +159,12 @@ void testNotContaining() { assertEquals("not( (contains(`name`, \"Elvis\")) )", c.export()); } + @Test + void testArrayContaining() { + QueryCriteria c = where(i("name")).arrayContaining("Elvis"); + assertEquals("array_containing(`name`, \"Elvis\")", c.export()); + } + @Test void testLike() { QueryCriteria c = where(i("name")).like("%ouch%"); From ef9c5f48f1d7ad1a20c1678e11678c7fd3624479 Mon Sep 17 00:00:00 2001 From: Michael Reiche <48999328+mikereiche@users.noreply.github.com> Date: Wed, 24 Mar 2021 14:25:28 -0700 Subject: [PATCH 5/6] Support enum arguments on repository queries. Support enum in AbstractCouchbaseConverter.convertForWriteIfNeeded() and also call that from MappingCouchbaseConverter.getPotentiallyConvertedSimpleWrite() Closes #1069. Original pull request: #1112. Co-authored-by: mikereiche --- .../core/convert/AbstractCouchbaseConverter.java | 4 +++- .../core/convert/MappingCouchbaseConverter.java | 11 ++--------- .../data/couchbase/domain/AirportRepository.java | 3 +++ .../springframework/data/couchbase/domain/Iata.java | 6 ++++++ .../CouchbaseRepositoryQueryIntegrationTests.java | 13 +++++++++++++ 5 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 src/test/java/org/springframework/data/couchbase/domain/Iata.java diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java b/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java index cc55d0503..d6cafffaa 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java @@ -17,6 +17,7 @@ package org.springframework.data.couchbase.core.convert; import java.util.Collections; +import java.util.Optional; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.convert.ConversionService; @@ -100,7 +101,8 @@ public Object convertForWriteIfNeeded(Object value) { return this.conversions.getCustomWriteTarget(value.getClass()) // .map(it -> (Object) this.conversionService.convert(value, it)) // - .orElse(value); + .orElseGet(() -> Enum.class.isAssignableFrom(value.getClass()) ? ((Enum) value).name() : value); + } @Override diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java index e84055707..7793be558 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java @@ -774,15 +774,8 @@ private void writeSimpleInternal(final Object source, final CouchbaseDocument ta target.put(key, getPotentiallyConvertedSimpleWrite(source)); } - private Object getPotentiallyConvertedSimpleWrite(final Object value) { - if (value == null) { - return null; - } - - Optional> customTarget = conversions.getCustomWriteTarget(value.getClass()); - - return customTarget.map(it -> (Object) conversionService.convert(value, it)) - .orElseGet(() -> Enum.class.isAssignableFrom(value.getClass()) ? ((Enum) value).name() : value); + public Object getPotentiallyConvertedSimpleWrite(final Object value) { + return convertForWriteIfNeeded(value); } /** 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 911aebd70..1b04222f9 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java @@ -50,6 +50,9 @@ public interface AirportRepository extends PagingAndSortingRepository getAllByIata(String iata); diff --git a/src/test/java/org/springframework/data/couchbase/domain/Iata.java b/src/test/java/org/springframework/data/couchbase/domain/Iata.java new file mode 100644 index 000000000..5e603005c --- /dev/null +++ b/src/test/java/org/springframework/data/couchbase/domain/Iata.java @@ -0,0 +1,6 @@ +package org.springframework.data.couchbase.domain; + +public enum Iata { + vie, + xxx +} 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 db9f53fc9..f0d17add4 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -47,6 +47,7 @@ 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.Person; import org.springframework.data.couchbase.domain.PersonRepository; import org.springframework.data.couchbase.domain.User; @@ -167,6 +168,18 @@ void findBySimpleProperty() { } } + @Test + void findByEnum() { + Airport vie = null; + try { + vie = new Airport("airports::vie", "vie", "loww"); + vie = airportRepository.save(vie); + Airport airport2 = airportRepository.findByIata(Iata.vie); + assertEquals(airport2.getId(), vie.getId()); + } finally { + airportRepository.delete(vie); + } + } @Test public void testCas() { User user = new User("1", "Dave", "Wilson"); From 3860ac389e5dfaef61119c9985647a0c9363cee3 Mon Sep 17 00:00:00 2001 From: mikereiche Date: Tue, 30 Mar 2021 17:17:25 -0400 Subject: [PATCH 6/6] Fix N1QLExpression keys. Closes #1064. --- .../data/couchbase/core/query/N1QLExpression.java | 5 +++-- .../data/couchbase/core/query/QueryCriteriaTests.java | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/core/query/N1QLExpression.java b/src/main/java/org/springframework/data/couchbase/core/query/N1QLExpression.java index 49f8be381..fd690c988 100644 --- a/src/main/java/org/springframework/data/couchbase/core/query/N1QLExpression.java +++ b/src/main/java/org/springframework/data/couchbase/core/query/N1QLExpression.java @@ -262,13 +262,14 @@ public N1QLExpression returning(N1QLExpression right) { public N1QLExpression keys(Iterable ids) { StringBuilder sb = new StringBuilder(); Iterator it = ids.iterator(); - // TODO: really? Lets do better. + sb.append("["); while (it.hasNext()) { - sb.append(i(it.next().toString())); + sb.append(s(it.next().toString())); if (it.hasNext()) { sb.append(","); } } + sb.append("]"); return infix("USE KEYS", toString(), sb.toString()); } diff --git a/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java b/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java index cc563e015..4cb579440 100644 --- a/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/query/QueryCriteriaTests.java @@ -28,6 +28,8 @@ import com.couchbase.client.java.json.JsonArray; +import java.util.Arrays; + /** * @author Mauro Monti */ @@ -251,6 +253,15 @@ void testFalse() { assertEquals("not( (`name`) )", c.export()); } + @Test + void testKeys() { + N1QLExpression expression = N1QLExpression.x(""); + assertEquals(" USE KEYS [\"a\",\"b\"]", expression.keys(Arrays.asList("a", "b")).toString()); + assertEquals(" USE KEYS [\"a\"]", expression.keys(Arrays.asList("a")).toString()); + assertEquals(" USE KEYS []", expression.keys(Arrays.asList()).toString()); + } + + @Test // https://github.com/spring-projects/spring-data-couchbase/issues/1066 void testCriteriaCorrectlyEscapedWhenUsingMetaOnLHS() { final String bucketName = "sample-bucket";