DATACOUCH-156 - Make generated N1QL queries filter on the type field.

The generated N1QL queries currently don't filter on the type at all.

Add a criteria to the WHERE clause that checks the field holding type information is matching the entity fully qualified class name.

Add a placeholder for inline N1QL queries that can be replaced by the same type information criteria.
This commit is contained in:
Simon Baslé
2015-07-31 18:24:40 +02:00
parent 60196095a6
commit f57a03ad21
11 changed files with 144 additions and 17 deletions

View File

@@ -1,9 +1,7 @@
package org.springframework.data.couchbase.repository.query;
import static org.junit.Assert.*;
import static org.springframework.data.couchbase.repository.query.StringN1qlBasedQuery.PLACEHOLDER_BUCKET;
import static org.springframework.data.couchbase.repository.query.StringN1qlBasedQuery.PLACEHOLDER_ENTITY;
import static org.springframework.data.couchbase.repository.query.StringN1qlBasedQuery.PLACEHOLDER_SELECT_FROM;
import static org.springframework.data.couchbase.repository.query.StringN1qlBasedQuery.*;
import com.couchbase.client.java.query.Statement;
import org.junit.Test;
@@ -13,7 +11,7 @@ public class StringN1QlBasedQueryTest {
@Test
public void testReplaceFullSelectPlaceholderOnce() throws Exception {
String statement = PLACEHOLDER_SELECT_FROM + " where " + PLACEHOLDER_SELECT_FROM;
Statement parsed = StringN1qlBasedQuery.prepare(statement, "B");
Statement parsed = StringN1qlBasedQuery.prepare(statement, "B", "_class", String.class);
assertEquals("SELECT META(`B`).id AS _ID, META(`B`).cas AS _CAS, `B`.* FROM `B` where "
+ PLACEHOLDER_SELECT_FROM, parsed.toString());
@@ -22,7 +20,7 @@ public class StringN1QlBasedQueryTest {
@Test
public void testReplaceAllBucketPlaceholder() throws Exception {
String statement = "SELECT * FROM " + PLACEHOLDER_BUCKET + " WHERE " + PLACEHOLDER_BUCKET + ".test = 1";
Statement parsed = StringN1qlBasedQuery.prepare(statement, "B");
Statement parsed = StringN1qlBasedQuery.prepare(statement, "B", "_class", String.class);
assertEquals("SELECT * FROM `B` WHERE `B`.test = 1", parsed.toString());
}
@@ -30,9 +28,18 @@ public class StringN1QlBasedQueryTest {
@Test
public void testReplaceFirstEntityPlaceholder() throws Exception {
String statement = "SELECT " + PLACEHOLDER_ENTITY + " FROM b where b.test = 1 and " + PLACEHOLDER_ENTITY;
Statement parsed = StringN1qlBasedQuery.prepare(statement, "A");
Statement parsed = StringN1qlBasedQuery.prepare(statement, "A", "_class", String.class);
assertEquals("SELECT META(`A`).id AS _ID, META(`A`).cas AS _CAS FROM b where b.test = 1 and "
+ PLACEHOLDER_ENTITY, parsed.toString());
}
@Test
public void testReplaceTypePlaceholder() throws Exception {
String statement = "SELECT " + PLACEHOLDER_ENTITY + " FROM b WHERE b.test = 1 AND " + PLACEHOLDER_FILTER_TYPE;
Statement parsed = StringN1qlBasedQuery.prepare(statement, "A", "@class", String.class);
assertEquals("SELECT META(`A`).id AS _ID, META(`A`).cas AS _CAS FROM b WHERE b.test = 1 AND `@class` = "
+ "\"java.lang.String\"", parsed.toString());
}
}