diff --git a/pom.xml b/pom.xml
index ca60693f3..b30421e40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -90,9 +90,11 @@
17001170003.11.5
- 4.3.1
+ 4.4.0spring-data-cassandra1.0
+
+ 0.5.41.01multi2.3.0.BUILD-SNAPSHOT
@@ -169,6 +171,13 @@
+
+ org.assertj
+ assertj-core
+ ${assertj}
+ test
+
+
org.testcontainerstestcontainers-bom
@@ -184,6 +193,13 @@
test
+
+ com.carrotsearch
+ hppc
+ ${hppc.version}
+ test
+
+
edu.umd.cs.mtcmultithreadedtc
@@ -191,12 +207,6 @@
test
-
- org.assertj
- assertj-core
- ${assertj}
- test
-
diff --git a/spring-data-cassandra/pom.xml b/spring-data-cassandra/pom.xml
index 877d1a9ec..399b2ffdf 100644
--- a/spring-data-cassandra/pom.xml
+++ b/spring-data-cassandra/pom.xml
@@ -189,6 +189,11 @@
multithreadedtc
+
+ com.carrotsearch
+ hppc
+
+
org.jetbrains.kotlin
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 5d4cba18e..fda86eb84 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
@@ -699,14 +699,16 @@ public class StatementFactory {
.bind((statement, factory) -> {
List assignments = mappedUpdate.getUpdateOperations().stream()
- .map(assignmentOp -> getAssignment(assignmentOp, factory)).collect(Collectors.toList());
+ .map(assignmentOp -> getAssignment(assignmentOp, factory))
+ .collect(Collectors.toList());
return (com.datastax.oss.driver.api.querybuilder.update.Update) ((OngoingAssignment) statement)
.set(assignments);
}).bind((statement, factory) -> {
- List relations = filter.stream().map(criteriaDefinition -> toClause(criteriaDefinition, factory))
+ List relations = filter.stream()
+ .map(criteriaDefinition -> toClause(criteriaDefinition, factory))
.collect(Collectors.toList());
return statement.where(relations);
@@ -735,10 +737,13 @@ public class StatementFactory {
private static void applyUpdateIfCondition(
StatementBuilder update, Filter criteriaDefinitions) {
+
update.bind((statement, factory) -> {
- List conditions = criteriaDefinitions.stream().map(it -> toCondition(it, factory))
+ List conditions = criteriaDefinitions.stream()
+ .map(it -> toCondition(it, factory))
.collect(Collectors.toList());
+
return statement.if_(conditions);
});
}
@@ -898,8 +903,8 @@ public class StatementFactory {
Assert.notNull(update, "Update must not be null");
- com.datastax.oss.driver.api.querybuilder.update.Update updateToUse = QueryOptionsUtil.addWriteOptions(update,
- writeOptions);
+ com.datastax.oss.driver.api.querybuilder.update.Update updateToUse =
+ QueryOptionsUtil.addWriteOptions(update, writeOptions);
if (writeOptions instanceof UpdateOptions) {
diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/QueryMapper.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/QueryMapper.java
index 36504601c..661274b6f 100644
--- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/QueryMapper.java
+++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/QueryMapper.java
@@ -133,7 +133,8 @@ public class QueryMapper {
Object value = predicate.getValue();
- Object mappedValue = value != null ? getConverter().convertToColumnType(value, getTypeInformation(field, value))
+ Object mappedValue = value != null
+ ? getConverter().convertToColumnType(value, getTypeInformation(field, value))
: null;
Predicate mappedPredicate = new Predicate(predicate.getOperator(), mappedValue);
@@ -330,11 +331,11 @@ public class QueryMapper {
Field createPropertyField(@Nullable CassandraPersistentEntity> entity, ColumnName key) {
- return Optional.ofNullable(entity). map(e -> new MetadataBackedField(key, e, getMappingContext()))
+ return Optional.ofNullable(entity)
+ . map(e -> new MetadataBackedField(key, e, getMappingContext()))
.orElseGet(() -> new Field(key));
}
- @SuppressWarnings("unchecked")
TypeInformation> getTypeInformation(Field field, @Nullable Object value) {
if (field.getProperty().isPresent()) {
diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtil.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtil.java
index bdbfdb997..b45c8bd1f 100644
--- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtil.java
+++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtil.java
@@ -42,9 +42,11 @@ public abstract class QueryOptionsUtil {
* @param queryOptions query options (e.g. consistency level) to add to the CQL statement.
* @return the given {@link Statement}.
*/
+ @SuppressWarnings("unchecked")
public static > T addQueryOptions(T statement, QueryOptions queryOptions) {
Assert.notNull(statement, "Statement must not be null");
+
Statement> statementToUse = statement;
if (queryOptions.getConsistencyLevel() != null) {
@@ -66,11 +68,10 @@ public abstract class QueryOptionsUtil {
}
if (queryOptions.getTracing() != null) {
- if (queryOptions.getTracing()) {
- statementToUse = statementToUse.setTracing(true);
- } else {
- statementToUse = statementToUse.setTracing(false);
- }
+ // While the following statement is null-safe, avoid setting Statement tracing if the tracing query option
+ // is null since Statements are immutable and the call creates a new object. Therefore keep the following
+ // statement wrapped in the conditional null check to avoid additional garbage and added GC pressure.
+ statementToUse = statementToUse.setTracing(Boolean.TRUE.equals(queryOptions.getTracing()));
}
return (T) statementToUse;
diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/util/StatementBuilder.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/util/StatementBuilder.java
index 9a88d616b..276a747cc 100644
--- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/util/StatementBuilder.java
+++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/util/StatementBuilder.java
@@ -15,9 +15,6 @@
*/
package org.springframework.data.cassandra.core.cql.util;
-import edu.umd.cs.findbugs.annotations.NonNull;
-import edu.umd.cs.findbugs.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
@@ -28,6 +25,8 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.UnaryOperator;
+import org.springframework.lang.NonNull;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
@@ -76,17 +75,15 @@ public class StatementBuilder {
private List> onBuild = new ArrayList<>();
private List> onBuilt = new ArrayList<>();
- private StatementBuilder(S statement) {
- this.statement = statement;
- }
-
/**
- * Create a new {@link StatementBuilder} with the given {@link BuildableQuery query stub}. The stub is used as base
- * for the built query so each query inherits properties of this stub.
+ * Factory method used to create a new {@link StatementBuilder} with the given {@link BuildableQuery query stub}.
+ * The stub is used as base for the built query so each query inherits properties of this stub.
*
- * @param stub the query stub to use.
* @param query type.
- * @return the {@link StatementBuilder} for the {@link BuildableQuery query stub}.
+ * @param stub the {@link BuildableQuery query stub} to use.
+ * @return a {@link StatementBuilder} for the given {@link BuildableQuery query stub}.
+ * @throws IllegalArgumentException if the {@link BuildableQuery query stub} is {@literal null}.
+ * @see com.datastax.oss.driver.api.querybuilder.BuildableQuery
*/
public static StatementBuilder of(S stub) {
@@ -95,6 +92,17 @@ public class StatementBuilder {
return new StatementBuilder<>(stub);
}
+ /**
+ * Constructs a new instance of this {@link StatementBuilder} with the given {@link BuildableQuery query stub}.
+ *
+ * @param statement the {@link BuildableQuery query stub} from which to build
+ * the {@link com.datastax.oss.driver.api.core.cql.Statement}.
+ * @see com.datastax.oss.driver.api.querybuilder.BuildableQuery
+ */
+ private StatementBuilder(S statement) {
+ this.statement = statement;
+ }
+
/**
* Apply a {@link BindFunction} to the statement. Bind functions are applied on {@link #build()}.
*
@@ -106,6 +114,7 @@ public class StatementBuilder {
Assert.notNull(action, "BindFunction must not be null");
queryActions.add(action::bind);
+
return this;
}
@@ -115,11 +124,13 @@ public class StatementBuilder {
* @param action the builder function to be applied to the statement.
* @return {@code this} {@link StatementBuilder}.
*/
+ @SuppressWarnings("unchecked")
public StatementBuilder apply(Function action) {
Assert.notNull(action, "BindFunction must not be null");
queryActions.add((source, termFactory) -> (S) action.apply(source));
+
return this;
}
@@ -136,6 +147,7 @@ public class StatementBuilder {
Assert.notNull(action, "Consumer must not be null");
onBuild.add(action);
+
return this;
}
@@ -152,6 +164,7 @@ public class StatementBuilder {
Assert.notNull(mappingFunction, "Mapping function must not be null");
onBuilt.add(mappingFunction);
+
return this;
}
@@ -169,7 +182,7 @@ public class StatementBuilder {
* Build a {@link SimpleStatement statement} by applying builder and bind functions using the given
* {@link ParameterHandling}.
*
- * @param parameterHandling
+ * @param parameterHandling {@link ParameterHandling} used to determine how to render parameters.
* @return the built {@link SimpleStatement}.
*/
public SimpleStatement build(ParameterHandling parameterHandling) {
@@ -180,8 +193,8 @@ public class StatementBuilder {
* Build a {@link SimpleStatement statement} by applying builder and bind functions using the given
* {@link CodecRegistry} and {@link ParameterHandling}.
*
- * @param parameterHandling
- * @param codecRegistry
+ * @param parameterHandling {@link ParameterHandling} used to determine how to render parameters.
+ * @param codecRegistry registry of Apache Cassandra codecs for converting to/from Java types and CQL types.
* @return the built {@link SimpleStatement}.
*/
public SimpleStatement build(ParameterHandling parameterHandling, CodecRegistry codecRegistry) {
@@ -199,12 +212,13 @@ public class StatementBuilder {
statement = runnable.run(statement, termFactory);
}
- return StatementBuilder.this.build(statement.builder());
+ return build(statement.builder());
}
if (parameterHandling == ParameterHandling.BY_INDEX) {
List