From 24164f3e9eecabd7c0595a6f0b6c3f91fcd70f38 Mon Sep 17 00:00:00 2001 From: mikereiche Date: Wed, 9 Oct 2024 17:20:08 -0700 Subject: [PATCH] Fix number of parameters in string based @Query queries. Closed #1977. --- .../query/StringBasedN1qlQueryParser.java | 7 ++++-- .../couchbase/domain/AirportRepository.java | 6 +++++ ...chbaseRepositoryQueryIntegrationTests.java | 25 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) 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 eb079c5dc..b509f83c3 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 @@ -711,8 +711,11 @@ private static Object[] getParameters(ParameterAccessor accessor) { for (Object o : accessor) { params.add(o); } - params.add(accessor.getPageable()); - params.add(accessor.getSort()); + if( accessor.getPageable().isPaged()) { + params.add(accessor.getPageable()); + } else if (accessor.getSort().isSorted()) { + params.add(accessor.getSort()); + } return params.toArray(); } } 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 a5502a541..f5bd0acd3 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/AirportRepository.java @@ -40,6 +40,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -154,6 +155,11 @@ Long countFancyExpression(@Param("projectIds") List projectIds, @Param(" @Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND iata != $1") Page getAllByIataNot(String iata, Pageable pageable); + @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) + @Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND iata != $1") + List getAllByIataNotSort(String iata, Sort sort); + + @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) @Query("SELECT iata, \"\" as __id, 0 as __cas from #{#n1ql.bucket} WHERE #{#n1ql.filter} order by meta().id") List getStrings(); 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 c4d3c812c..422450b91 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -884,6 +884,31 @@ void sortedRepository() { } } + @Test + void countSlicePageTest() { + airportRepository.withOptions(QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS)).deleteAll(); + String[] iatas = { "JFK", "IAD", "SFO", "SJC", "SEA", "LAX", "PHX" }; + + airportRepository.countOne(); + try { + airportRepository.saveAll( + Arrays.stream(iatas).map((iata) -> new Airport("airports::" + iata, iata, iata.toLowerCase(Locale.ROOT))) + .collect(Collectors.toSet())); + + Pageable sPageable = PageRequest.of(0, 2).withSort(Sort.by("iata")); + Page sPage = airportRepository.getAllByIataNot("JFK", sPageable); + System.out.println(sPage); + + Sort sort = Sort.by("iata"); + List sList = airportRepository.getAllByIataNotSort("JFK", sort); + System.out.println(sList); + + } finally { + airportRepository + .deleteAllById(Arrays.stream(iatas).map((iata) -> "airports::" + iata).collect(Collectors.toSet())); + } + } + @Test void countSlicePage() { airportRepository.withOptions(QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS)).deleteAll();