From 813de10bb4cc4d3caee6cf22d0197796d1ff8442 Mon Sep 17 00:00:00 2001 From: samueldlightfoot Date: Mon, 11 Oct 2021 17:52:14 +0100 Subject: [PATCH] Use bind markers for `BY_INDEX` and `BY_NAME` IN queries. Closes #1172 Original pull request: #1178. --- .../data/cassandra/core/StatementFactory.java | 12 ++++++++++++ .../cassandra/core/StatementFactoryUnitTests.java | 11 +++++++++++ .../query/PartTreeCassandraQueryUnitTests.java | 4 ++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java index f9d649b35..8972e6711 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java @@ -69,6 +69,7 @@ import org.springframework.util.ClassUtils; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.metadata.schema.ClusteringOrder; +import com.datastax.oss.driver.api.querybuilder.BindMarker; import com.datastax.oss.driver.api.querybuilder.QueryBuilder; import com.datastax.oss.driver.api.querybuilder.condition.Condition; import com.datastax.oss.driver.api.querybuilder.condition.ConditionBuilder; @@ -91,6 +92,7 @@ import com.datastax.oss.driver.api.querybuilder.update.UpdateWithAssignments; * * @author Mark Paluch * @author John Blum + * @author Sam Lightfoot * @see com.datastax.oss.driver.api.core.cql.Statement * @see org.springframework.data.cassandra.core.query.Query * @see org.springframework.data.cassandra.core.query.Update @@ -966,6 +968,11 @@ public class StatementFactory { if (predicate.getValue() instanceof List || (predicate.getValue() != null && predicate.getValue().getClass().isArray())) { + Term term = factory.create(predicate.getValue()); + if (term instanceof BindMarker) { + return column.in((BindMarker) term); + } + return column.in(toLiterals(predicate.getValue())); } @@ -1031,6 +1038,11 @@ public class StatementFactory { if (predicate.getValue() instanceof List || (predicate.getValue() != null && predicate.getValue().getClass().isArray())) { + Term term = factory.create(predicate.getValue()); + if (term instanceof BindMarker) { + return column.in((BindMarker) term); + } + return column.in(toLiterals(predicate.getValue())); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java index de97e671b..80cbf2e5d 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java @@ -53,6 +53,7 @@ import com.datastax.oss.driver.api.querybuilder.select.Select; * Unit tests for {@link StatementFactory}. * * @author Mark Paluch + * @author Sam Lightfoot */ class StatementFactoryUnitTests { @@ -170,6 +171,16 @@ class StatementFactoryUnitTests { .isEqualTo("SELECT * FROM group LIMIT 10 ALLOW FILTERING"); } + @Test + void shouldMapSelectInQuery() { + + Query query = Query.query(Criteria.where("foo").in("bar")); + + StatementBuilder