Skip to content

Commit 813de10

Browse files
samueldlightfootmp911de
authored andcommitted
Use bind markers for BY_INDEX and BY_NAME IN queries.
Closes #1172 Original pull request: #1178.
1 parent 3878c00 commit 813de10

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java

+12
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969

7070
import com.datastax.oss.driver.api.core.CqlIdentifier;
7171
import com.datastax.oss.driver.api.core.metadata.schema.ClusteringOrder;
72+
import com.datastax.oss.driver.api.querybuilder.BindMarker;
7273
import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
7374
import com.datastax.oss.driver.api.querybuilder.condition.Condition;
7475
import com.datastax.oss.driver.api.querybuilder.condition.ConditionBuilder;
@@ -91,6 +92,7 @@
9192
*
9293
* @author Mark Paluch
9394
* @author John Blum
95+
* @author Sam Lightfoot
9496
* @see com.datastax.oss.driver.api.core.cql.Statement
9597
* @see org.springframework.data.cassandra.core.query.Query
9698
* @see org.springframework.data.cassandra.core.query.Update
@@ -966,6 +968,11 @@ private static Relation toClause(CriteriaDefinition criteriaDefinition, TermFact
966968

967969
if (predicate.getValue() instanceof List
968970
|| (predicate.getValue() != null && predicate.getValue().getClass().isArray())) {
971+
Term term = factory.create(predicate.getValue());
972+
if (term instanceof BindMarker) {
973+
return column.in((BindMarker) term);
974+
}
975+
969976
return column.in(toLiterals(predicate.getValue()));
970977
}
971978

@@ -1031,6 +1038,11 @@ private static Condition toCondition(CriteriaDefinition criteriaDefinition, Term
10311038

10321039
if (predicate.getValue() instanceof List
10331040
|| (predicate.getValue() != null && predicate.getValue().getClass().isArray())) {
1041+
Term term = factory.create(predicate.getValue());
1042+
if (term instanceof BindMarker) {
1043+
return column.in((BindMarker) term);
1044+
}
1045+
10341046
return column.in(toLiterals(predicate.getValue()));
10351047
}
10361048

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java

+11
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
* Unit tests for {@link StatementFactory}.
5454
*
5555
* @author Mark Paluch
56+
* @author Sam Lightfoot
5657
*/
5758
class StatementFactoryUnitTests {
5859

@@ -170,6 +171,16 @@ void shouldMapSelectQueryWithLimitAndAllowFiltering() {
170171
.isEqualTo("SELECT * FROM group LIMIT 10 ALLOW FILTERING");
171172
}
172173

174+
@Test
175+
void shouldMapSelectInQuery() {
176+
177+
Query query = Query.query(Criteria.where("foo").in("bar"));
178+
179+
StatementBuilder<Select> select = statementFactory.select(query, groupEntity);
180+
181+
assertThat(select.build(ParameterHandling.INLINE).getQuery()).isEqualTo("SELECT * FROM group WHERE foo IN ('bar')");
182+
}
183+
173184
@Test // DATACASS-343
174185
void shouldMapDeleteQueryWithColumns() {
175186

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/PartTreeCassandraQueryUnitTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ void shouldDeriveFieldInCollectionQuery() {
159159
String query = deriveQueryFromMethod(Repo.class, "findByFirstnameIn", new Class[] { Collection.class },
160160
Arrays.asList("Hank", "Walter")).getQuery();
161161

162-
assertThat(query).isEqualTo("SELECT * FROM person WHERE firstname IN ('Hank','Walter')");
162+
assertThat(query).isEqualTo("SELECT * FROM person WHERE firstname IN ?");
163163
}
164164

165165
@Test // DATACASS-172
@@ -186,7 +186,7 @@ void shouldDeriveUdtInCollectionQuery() {
186186
String query = deriveQueryFromMethod(Repo.class, "findByMainAddressIn", new Class[] { Collection.class },
187187
Collections.singleton(udtValue)).getQuery();
188188

189-
assertThat(query).isEqualTo("SELECT * FROM person WHERE mainaddress IN ({city:NULL,country:NULL})");
189+
assertThat(query).isEqualTo("SELECT * FROM person WHERE mainaddress IN ?");
190190
}
191191

192192
@Test // DATACASS-343

0 commit comments

Comments
 (0)