Support derived queries from methods named findDistinctF1AndF2ByF3() (#1202)

Support derived queries from methods named findDistinctF1AndF2ByF3().

Closes #1200.
This commit is contained in:
Michael Reiche
2021-08-23 13:51:55 -07:00
committed by GitHub
parent f0880daf7a
commit bcf11ce856
7 changed files with 164 additions and 7 deletions

View File

@@ -130,6 +130,18 @@ public interface AirportRepository extends CouchbaseRepository<Airport, String>,
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
Optional<Airport> findByIdAndIata(String id, String iata);
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
List<Airport> findDistinctIcaoBy();
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
List<Airport> findDistinctIcaoAndIataBy();
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
Long countDistinctIcaoAndIataBy();
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
Long countDistinctIcaoBy();
@Query("SELECT 1 FROM `#{#n1ql.bucket}` WHERE #{#n1ql.filter} " + " #{#projectIds != null ? 'AND blah IN $1' : ''} "
+ " #{#planIds != null ? 'AND blahblah IN $2' : ''} " + " #{#active != null ? 'AND false = $3' : ''} ")
Long countOne();

View File

@@ -533,6 +533,38 @@ public class CouchbaseRepositoryQueryIntegrationTests extends ClusterAwareIntegr
}
}
@Test
void distinct() {
String[] iatas = { "JFK", "IAD", "SFO", "SJC", "SEA", "LAX", "PHX" };
String[] icaos = { "ic0", "ic1", "ic0", "ic1", "ic0", "ic1", "ic0" };
try {
for (int i = 0; i < iatas.length; i++) {
Airport airport = new Airport("airports::" + iatas[i], iatas[i] /*iata*/, icaos[i] /* icao */);
couchbaseTemplate.insertById(Airport.class).one(airport);
}
// distinct icao - parser requires 'By' on the end or it does not match pattern.
List<Airport> airports1 = airportRepository.findDistinctIcaoBy();
assertEquals(2, airports1.size());
List<Airport> airports2 = airportRepository.findDistinctIcaoAndIataBy();
assertEquals(7, airports2.size());
// count( distinct { iata, icao } )
long count1 = airportRepository.countDistinctIcaoAndIataBy();
assertEquals(7, count1);
// count( distinct { icao } )
long count2 = airportRepository.countDistinctIcaoBy();
assertEquals(2, count2);
} finally {
couchbaseTemplate.removeById()
.all(Arrays.stream(iatas).map((iata) -> "airports::" + iata).collect(Collectors.toSet()));
}
}
@Test
void stringQueryTest() throws Exception {
Airport airport = new Airport("airports::vie", "vie", "lowx");