Check for _ID and _CAS as well as __id and __cas being projected from query and analytics. (#1390)

Closes #1389.
This commit is contained in:
Michael Reiche
2022-04-14 07:52:25 -07:00
committed by Michael Reiche
parent baf198c868
commit 9fe8472b37
5 changed files with 62 additions and 8 deletions

View File

@@ -33,6 +33,9 @@ public interface AirlineRepository extends PagingAndSortingRepository<Airline, S
QuerydslPredicateExecutor<Airline>, DynamicProxyable<AirlineRepository> {
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (name = $1)")
List<User> getByName(@Param("airline_name") String airlineName);
List<Airline> getByName(@Param("airline_name") String airlineName);
@Query("select meta().id as _ID, meta().cas as _CAS, #{#n1ql.bucket}.* from #{#n1ql.bucket} where #{#n1ql.filter} and (name = $1)")
List<Airline> getByName_3x(@Param("airline_name") String airlineName);
}

View File

@@ -116,6 +116,39 @@ class StringN1qlQueryCreatorTests extends ClusterAwareIntegrationTests {
}
}
@Test
@IgnoreWhen(missesCapabilities = Capabilities.QUERY, clusterTypes = ClusterType.MOCKED)
void findUsingStringNq1l_3x_projection_id_cas() throws Exception {
Airline airline = new Airline(UUID.randomUUID().toString(), "Continental", "USA");
try {
Airline modified = couchbaseTemplate.upsertById(Airline.class).one(airline);
String input = "getByName_3x";
Method method = AirlineRepository.class.getMethod(input, String.class);
CouchbaseQueryMethod queryMethod = new CouchbaseQueryMethod(method,
new DefaultRepositoryMetadata(AirlineRepository.class), new SpelAwareProxyProjectionFactory(),
converter.getMappingContext());
StringN1qlQueryCreator creator = new StringN1qlQueryCreator(getAccessor(getParameters(method), "Continental"),
queryMethod, converter, config().bucketname(), new SpelExpressionParser(),
QueryMethodEvaluationContextProvider.DEFAULT, namedQueries);
Query query = creator.createQuery();
ExecutableFindByQuery q = (ExecutableFindByQuery) couchbaseTemplate.findByQuery(Airline.class)
.withConsistency(QueryScanConsistency.REQUEST_PLUS).matching(query);
Optional<Airline> al = q.one();
assertEquals(airline.toString(), al.get().toString());
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
couchbaseTemplate.removeById().one(airline.getId());
}
}
private ParameterAccessor getAccessor(Parameters<?, ?> params, Object... values) {
return new ParametersParameterAccessor(params, values);
}