DATACOUCH-413 - Use parameterized queries for Query derivation

Changes
-------
- N1ql query creators implement an interface which provides the place
holder values.
- The query creator uses a position index counter to inject place holders in
the statement created and caches the place holder values in an array.
- Repository query constructor passes the generated query statement
and place holder values to query through the SDK.
- Cleanup N1ql integration tests for count validation and also add
couple of more tests

Results
-------
The testing for changes are already covered under the modified existing tests
in N1qlQueryCreator and Repository.
This commit is contained in:
Subhashni Balakrishnan
2018-11-13 19:11:29 -08:00
parent 841803f77c
commit d465e21d79
13 changed files with 492 additions and 218 deletions

View File

@@ -129,7 +129,7 @@ public class N1qlCouchbaseRepositoryTests {
Pageable pageable = new PageRequest(0, 8);
Page<Party> page1 = repository.findAll(pageable);
assertEquals(17, page1.getTotalElements()); //12 generated parties + 5 specifically crafted party
assertTrue("Query for parties should be atleast 12", page1.getTotalElements() >= 12);
assertEquals(8, page1.getNumberOfElements());
}
@@ -138,7 +138,7 @@ public class N1qlCouchbaseRepositoryTests {
Pageable pageable = new PageRequest(0, 8, Sort.Direction.DESC, "attendees");
Page<Party> page1 = repository.findAll(pageable);
assertEquals(17, page1.getTotalElements()); //12 generated parties + 5 specifically crafted party
assertTrue("Query for parties should be atleast 12", page1.getTotalElements() >= 12);
assertEquals(8, page1.getNumberOfElements());
List<Party> parties = page1.getContent();
@@ -161,7 +161,7 @@ public class N1qlCouchbaseRepositoryTests {
public void shouldPageWithStringBasedQuery() {
Pageable pageable = new PageRequest(0, 8, Sort.Direction.DESC, "attendees");
Page<Party> page1 = partyRepository.findPartiesWithAttendee(1, pageable);
assertEquals(16, page1.getTotalElements()); //12 generated parties + 4 specifically crafted party
assertTrue("Query for parties with attendees should be atleast 12", page1.getTotalElements() >= 12);
assertEquals(8, page1.getNumberOfElements());
List<Party> parties = page1.getContent();
@@ -187,7 +187,7 @@ public class N1qlCouchbaseRepositoryTests {
@Test(expected = MappingInstantiationException.class)
public void shouldFailWithMissingFilterStringBasedQuery() {
Sort sort = new Sort(Sort.Direction.DESC, "attendees");
List<Party> parties = partyRepository.findParties(sort);
partyRepository.findParties(sort);
}
@Test
@@ -209,4 +209,12 @@ public class N1qlCouchbaseRepositoryTests {
assertTrue(partyList.size() == 1);
assertEquals("Key mismatch", partyList.get(0).getKey(), key);
}
@Test
public void testN1qlQueryWithInvalidValue() {
partyRepository.save(new Party("testN1qlQueryWithInvalidValue", "", "testN1qlQueryWithInvalidValue", null, 0, null));
final String description = "testN1qlQueryWithInvalidValue* OR `description` LIKE \"\"";
List<Party> partyList = partyRepository.findByDescriptionStartingWith(description);
assertTrue(partyList.size() == 0);
}
}

View File

@@ -92,4 +92,6 @@ public interface PartyRepository extends CouchbaseRepository<Party, String> {
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and eventDate = $1")
List<Party> getByEventDate(Date eventDate);
List<Party> findByDescriptionStartingWith(String description);
}

View File

@@ -119,13 +119,13 @@ public class ReactiveN1qlCouchbaseRepositoryTests {
@Test
public void testCustomSpelCountQuery() {
long count = partyRepository.countCustom().block();
assertEquals("Test N1QL Spel based query", 17, count);
assertTrue("Count query for parties should be atleast 12", count >= 12);
}
@Test
public void testPartTreeQuery() {
long count = partyRepository.countAllByDescriptionNotNull().block();
assertEquals("Test N1QL part tree based query", 17, count);
assertTrue("Count query for parties with description not null should be atleast 12", count >= 12);
}
@Test
@@ -140,4 +140,12 @@ public class ReactiveN1qlCouchbaseRepositoryTests {
assertTrue(partyList.size() == 1);
assertEquals("Key mismatch", partyList.get(0).getKey(), key);
}
@Test
public void testN1qlQueryWithInvalidValue() {
partyRepository.save(new Party("testReactiveN1qlQueryWithInvalidValue", "", "testReactiveN1qlQueryWithInvalidValue", null, 0, null));
final String description = "testReactiveN1qlQueryWithInvalidValue* OR `description` LIKE \"\"";
List<Party> partyList = partyRepository.findByDescriptionStartingWith(description).collectList().block();
assertTrue(partyList.size() == 0);
}
}

View File

@@ -59,4 +59,6 @@ public interface ReactivePartyRepository extends ReactiveCouchbaseRepository<Par
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and eventDate = $1")
Flux<Party> getByEventDate(Date eventDate);
Flux<Party> findByDescriptionStartingWith(String description);
}