From 4b6f512ec169632cf3077cd05fe7c16c1dfcb4da Mon Sep 17 00:00:00 2001 From: mikereiche Date: Wed, 2 Nov 2022 13:37:00 -0700 Subject: [PATCH] Handle arguments that are lists. Closes #1586. --- .../convert/MappingCouchbaseConverter.java | 2 +- .../query/StringBasedN1qlQueryParser.java | 3 ++ .../domain/UserSubmissionRepository.java | 7 ++++ ...chbaseRepositoryQueryIntegrationTests.java | 41 ++++++++++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) 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 42ec20b6a..e9f684d24 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 @@ -772,7 +772,7 @@ public CouchbaseList writeCollectionInternal(final Collection source, final C type, prop, accessor)); } else { CouchbaseDocument embeddedDoc = new CouchbaseDocument(); - writeInternalRoot(element, embeddedDoc, prop.getTypeInformation(), false, prop); + writeInternalRoot(element, embeddedDoc, prop != null ? prop.getTypeInformation() : TypeInformation.of(elementType), false, prop); target.put(embeddedDoc); } diff --git a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java index 656c1d020..7730eacd9 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java +++ b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java @@ -463,6 +463,9 @@ private JsonObject getNamedPlaceholderValues(ParameterAccessor accessor) { if (value instanceof CouchbaseDocument) { value = ((CouchbaseDocument) value).export(); } + if (value instanceof CouchbaseList) { + value = ((CouchbaseList) value).export(); + } if (placeholder != null && placeholder.charAt(0) == ':') { placeholder = placeholder.replaceFirst(":", ""); putNamedValue(namedValues, placeholder, value); diff --git a/src/test/java/org/springframework/data/couchbase/domain/UserSubmissionRepository.java b/src/test/java/org/springframework/data/couchbase/domain/UserSubmissionRepository.java index ab80f82fb..f2e9ba586 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/UserSubmissionRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/UserSubmissionRepository.java @@ -40,4 +40,11 @@ public interface UserSubmissionRepository extends CouchbaseRepository setByIdAddress(String id, Address abc); + @Query("UPDATE #{#n1ql.bucket} set courses=$2 where meta().id=$1") + @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) + void setOrderedCourses(String id, Course[] courses); + + @Query("UPDATE #{#n1ql.bucket} set courses=$courses where meta().id=$id") + @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) + void setNamedCourses(String id, Course[] courses); } 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 a051bed1f..79345c2a5 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -72,6 +72,7 @@ import org.springframework.data.couchbase.domain.AirportMini; import org.springframework.data.couchbase.domain.AirportRepository; import org.springframework.data.couchbase.domain.AirportRepositoryScanConsistencyTest; +import org.springframework.data.couchbase.domain.Course; import org.springframework.data.couchbase.domain.Iata; import org.springframework.data.couchbase.domain.NaiveAuditorAware; import org.springframework.data.couchbase.domain.Person; @@ -855,7 +856,45 @@ void updateObject() throws Exception { Optional fetched = userSubmissionRepository.findById(userSubmission.getId()); assertEquals(address, fetched.get().getAddress()); } finally { - airportRepository.deleteById(userSubmission.getId()); + userSubmissionRepository.deleteById(userSubmission.getId()); + } + } + + @Test + void namedParameterList() throws Exception { + UserSubmission userSubmission = new UserSubmission(); + userSubmission.setId("123"); + try { + userSubmission.setUsername("updateObject"); + userSubmissionRepository.save(userSubmission); + Course[] courses = new Course[]{ new Course("1", "2", "3"), new Course("4","5","6")}; + userSubmissionRepository.setNamedCourses(userSubmission.getId(), courses); + Optional fetched = userSubmissionRepository.findById(userSubmission.getId()); + assertEquals(courses.length, fetched.get().getCourses().size()); + for(int i=0; i< courses.length; i++){ + assertEquals(courses[i], fetched.get().getCourses().get(i)); + } + } finally { + userSubmissionRepository.deleteById(userSubmission.getId()); + } + } + + @Test + void orderedParameterList() throws Exception { + UserSubmission userSubmission = new UserSubmission(); + userSubmission.setId("123"); + try { + userSubmission.setUsername("updateObject"); + userSubmissionRepository.save(userSubmission); + Course[] courses = new Course[]{ new Course("1", "2", "3"), new Course("4","5","6")}; + userSubmissionRepository.setOrderedCourses(userSubmission.getId(), courses); + Optional fetched = userSubmissionRepository.findById(userSubmission.getId()); + assertEquals(courses.length, fetched.get().getCourses().size()); + for(int i=0; i< courses.length; i++){ + assertEquals(courses[i], fetched.get().getCourses().get(i)); + } + } finally { + userSubmissionRepository.deleteById(userSubmission.getId()); } }