From 3b058156d4af2233cf9553e7481efd03a8a4921c Mon Sep 17 00:00:00 2001 From: Aldo Bongio Date: Mon, 19 Oct 2020 09:52:12 +0200 Subject: [PATCH] DATACASS-814 - Use CQL in MapPreparedStatementCache.CacheKey instead representation of Object.toString(). We now correctly use the CQL text to cache prepared statements. Previously, we used toString() which was a leftover from the driver migration that now defaults to Object.toString() and so the cache key was not stable. Original pull request: #180. --- .../cql/support/MapPreparedStatementCache.java | 3 ++- .../CachedPreparedStatementCreatorUnitTests.java | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/support/MapPreparedStatementCache.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/support/MapPreparedStatementCache.java index 953e762d4..934574f50 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/support/MapPreparedStatementCache.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/support/MapPreparedStatementCache.java @@ -34,6 +34,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; * {@code cql} text. Statement options (idempotency, timeouts) apply from the statement that was initially prepared. * * @author Mark Paluch + * @author Aldo Bongio * @since 2.0 */ public class MapPreparedStatementCache implements PreparedStatementCache { @@ -84,7 +85,7 @@ public class MapPreparedStatementCache implements PreparedStatementCache { public PreparedStatement getPreparedStatement(CqlSession session, SimpleStatement statement, Supplier preparer) { - CacheKey cacheKey = new CacheKey(session, statement.toString()); + CacheKey cacheKey = new CacheKey(session, statement.getQuery()); return getCache().computeIfAbsent(cacheKey, key -> preparer.get()); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/support/CachedPreparedStatementCreatorUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/support/CachedPreparedStatementCreatorUnitTests.java index 795c0f86f..f5338d7af 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/support/CachedPreparedStatementCreatorUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/support/CachedPreparedStatementCreatorUnitTests.java @@ -39,6 +39,7 @@ import com.datastax.oss.driver.api.querybuilder.update.Assignment; * Unit tests for {@link CachedPreparedStatementCreator}. * * @author Mark Paluch + * @author Aldo Bongio */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -182,4 +183,17 @@ class CachedPreparedStatementCreatorUnitTests { verify(session).prepare(firstStatement); verify(session).prepare(secondStatement); } + + @Test // DATACASS-814 + void shouldUseCqlTextInCacheKey() { + + String cql = "SELECT foo FROM users;"; + + MapPreparedStatementCache cache = MapPreparedStatementCache.create(); + CachedPreparedStatementCreator creator = CachedPreparedStatementCreator.of(cache, cql); + creator.createPreparedStatement(session); + + MapPreparedStatementCache.CacheKey cacheKey = cache.getCache().keySet().iterator().next(); + assertThat(cacheKey.cql).isSameAs(cql); + } }