diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/DeleteOptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/DeleteOptions.java index e5b66c879..6f96dea03 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/DeleteOptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/DeleteOptions.java @@ -27,8 +27,8 @@ import org.springframework.data.cassandra.core.query.Filter; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.policies.RetryPolicy; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.retry.RetryPolicy; /** * Extension to {@link WriteOptions} for use with {@code DELETE} operations. @@ -132,6 +132,7 @@ public class DeleteOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#retryPolicy(com.datastax.driver.core.policies.RetryPolicy) */ @Override + @Deprecated public DeleteOptionsBuilder retryPolicy(RetryPolicy driverRetryPolicy) { super.retryPolicy(driverRetryPolicy); @@ -142,16 +143,28 @@ public class DeleteOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#fetchSize(int) */ @Override + @Deprecated public DeleteOptionsBuilder fetchSize(int fetchSize) { super.fetchSize(fetchSize); return this; } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#pageSize(int) + */ + @Override + public DeleteOptionsBuilder pageSize(int pageSize) { + + super.pageSize(pageSize); + return this; + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#readTimeout(long) */ @Override + @Deprecated public DeleteOptionsBuilder readTimeout(long readTimeout) { super.readTimeout(readTimeout); @@ -173,9 +186,9 @@ public class DeleteOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#readTimeout(java.time.Duration) */ @Override - public DeleteOptionsBuilder readTimeout(Duration readTimeout) { + public DeleteOptionsBuilder timeout(Duration timeout) { - super.readTimeout(readTimeout); + super.timeout(timeout); return this; } @@ -299,7 +312,7 @@ public class DeleteOptions extends WriteOptions { */ public DeleteOptions build() { - return new DeleteOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.fetchSize, this.readTimeout, + return new DeleteOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.pageSize, this.timeout, this.ttl, this.timestamp, this.ifExists, this.ifCondition); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/InsertOptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/InsertOptions.java index 05e019da7..27aba15ec 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/InsertOptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/InsertOptions.java @@ -24,8 +24,8 @@ import java.util.concurrent.TimeUnit; import org.springframework.data.cassandra.core.cql.WriteOptions; import org.springframework.lang.Nullable; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.policies.RetryPolicy; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.retry.RetryPolicy; /** * Extension to {@link WriteOptions} for use with {@code INSERT} operations. @@ -124,7 +124,7 @@ public class InsertOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#consistencyLevel(com.datastax.driver.core.ConsistencyLevel) */ @Override - public InsertOptionsBuilder consistencyLevel(com.datastax.driver.core.ConsistencyLevel consistencyLevel) { + public InsertOptionsBuilder consistencyLevel(ConsistencyLevel consistencyLevel) { super.consistencyLevel(consistencyLevel); return this; @@ -134,7 +134,8 @@ public class InsertOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#retryPolicy(com.datastax.driver.core.policies.RetryPolicy) */ @Override - public InsertOptionsBuilder retryPolicy(com.datastax.driver.core.policies.RetryPolicy driverRetryPolicy) { + @Deprecated + public InsertOptionsBuilder retryPolicy(RetryPolicy driverRetryPolicy) { super.retryPolicy(driverRetryPolicy); return this; @@ -144,14 +145,24 @@ public class InsertOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#fetchSize(int) */ @Override + @Deprecated public InsertOptionsBuilder fetchSize(int fetchSize) { return (InsertOptionsBuilder) super.fetchSize(fetchSize); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#pageSize(int) + */ + @Override + public InsertOptionsBuilder pageSize(int pageSize) { + return (InsertOptionsBuilder) super.pageSize(pageSize); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#readTimeout(long) */ @Override + @Deprecated public InsertOptionsBuilder readTimeout(long readTimeout) { super.readTimeout(readTimeout); @@ -173,9 +184,9 @@ public class InsertOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#readTimeout(java.time.Duration) */ @Override - public InsertOptionsBuilder readTimeout(Duration readTimeout) { + public InsertOptionsBuilder timeout(Duration timeout) { - super.readTimeout(readTimeout); + super.timeout(timeout); return this; } @@ -295,7 +306,7 @@ public class InsertOptions extends WriteOptions { * @return a new {@link InsertOptions} with the configured values */ public InsertOptions build() { - return new InsertOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.fetchSize, this.readTimeout, + return new InsertOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.pageSize, this.timeout, this.ttl, this.timestamp, this.ifNotExists, this.insertNulls); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/UpdateOptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/UpdateOptions.java index ae8bd475f..ace6a8fa7 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/UpdateOptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/UpdateOptions.java @@ -27,8 +27,8 @@ import org.springframework.data.cassandra.core.query.Filter; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.policies.RetryPolicy; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.retry.RetryPolicy; /** * Extension to {@link WriteOptions} for use with {@code UPDATE} operations. @@ -128,7 +128,7 @@ public class UpdateOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#consistencyLevel(com.datastax.driver.core.ConsistencyLevel) */ @Override - public UpdateOptionsBuilder consistencyLevel(com.datastax.driver.core.ConsistencyLevel consistencyLevel) { + public UpdateOptionsBuilder consistencyLevel(ConsistencyLevel consistencyLevel) { super.consistencyLevel(consistencyLevel); return this; @@ -138,7 +138,8 @@ public class UpdateOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#retryPolicy(com.datastax.driver.core.policies.RetryPolicy) */ @Override - public UpdateOptionsBuilder retryPolicy(com.datastax.driver.core.policies.RetryPolicy driverRetryPolicy) { + @Deprecated + public UpdateOptionsBuilder retryPolicy(RetryPolicy driverRetryPolicy) { super.retryPolicy(driverRetryPolicy); return this; @@ -148,16 +149,28 @@ public class UpdateOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#fetchSize(int) */ @Override + @Deprecated public UpdateOptionsBuilder fetchSize(int fetchSize) { super.fetchSize(fetchSize); return this; } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#pageSize(int) + */ + @Override + public UpdateOptionsBuilder pageSize(int pageSize) { + + super.pageSize(pageSize); + return this; + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#readTimeout(long) */ @Override + @Deprecated public UpdateOptionsBuilder readTimeout(long readTimeout) { super.readTimeout(readTimeout); @@ -179,9 +192,9 @@ public class UpdateOptions extends WriteOptions { * @see org.springframework.data.cassandra.core.cql.WriteOptions.WriteOptionsBuilder#readTimeout(java.time.Duration) */ @Override - public UpdateOptionsBuilder readTimeout(Duration readTimeout) { + public UpdateOptionsBuilder timeout(Duration timeout) { - super.readTimeout(readTimeout); + super.timeout(timeout); return this; } @@ -307,7 +320,7 @@ public class UpdateOptions extends WriteOptions { */ public UpdateOptions build() { - return new UpdateOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.fetchSize, this.readTimeout, + return new UpdateOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.pageSize, this.timeout, this.ttl, this.timestamp, this.ifExists, this.ifCondition); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptions.java index f8f313032..b21b3ac5e 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/QueryOptions.java @@ -23,9 +23,8 @@ import java.util.concurrent.TimeUnit; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.SocketOptions; -import com.datastax.driver.core.policies.RetryPolicy; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.retry.RetryPolicy; /** * Cassandra Query Options for queries. {@link QueryOptions} allow tuning of various query options on a per-request @@ -45,7 +44,7 @@ public class QueryOptions { private final Duration readTimeout; - private final @Nullable Integer fetchSize; + private final @Nullable Integer pageSize; private final @Nullable RetryPolicy retryPolicy; @@ -55,7 +54,7 @@ public class QueryOptions { this.consistencyLevel = consistencyLevel; this.retryPolicy = retryPolicy; this.tracing = tracing; - this.fetchSize = fetchSize; + this.pageSize = fetchSize; this.readTimeout = readTimeout; } @@ -72,7 +71,7 @@ public class QueryOptions { this.consistencyLevel = consistencyLevel; this.retryPolicy = retryPolicy; this.tracing = false; - this.fetchSize = null; + this.pageSize = null; this.readTimeout = Duration.ofMillis(-1); } @@ -120,8 +119,8 @@ public class QueryOptions { * @since 1.5 */ @Nullable - protected Integer getFetchSize() { - return this.fetchSize; + protected Integer getPageSize() { + return this.pageSize; } /** @@ -161,9 +160,9 @@ public class QueryOptions { protected @Nullable ConsistencyLevel consistencyLevel; - protected Duration readTimeout = Duration.ofMillis(-1); + protected Duration timeout = Duration.ofMillis(-1); - protected @Nullable Integer fetchSize; + protected @Nullable Integer pageSize; protected @Nullable RetryPolicy retryPolicy; @@ -172,8 +171,8 @@ public class QueryOptions { QueryOptionsBuilder(QueryOptions queryOptions) { this.consistencyLevel = queryOptions.consistencyLevel; - this.fetchSize = queryOptions.fetchSize; - this.readTimeout = queryOptions.readTimeout; + this.pageSize = queryOptions.pageSize; + this.timeout = queryOptions.readTimeout; this.retryPolicy = queryOptions.retryPolicy; this.tracing = queryOptions.tracing; } @@ -199,7 +198,9 @@ public class QueryOptions { * * @param retryPolicy must not be {@literal null}. * @return {@code this} {@link QueryOptionsBuilder} + * @deprecated since 3.0, use execution profiles instead. */ + @Deprecated public QueryOptionsBuilder retryPolicy(RetryPolicy retryPolicy) { Assert.notNull(retryPolicy, "RetryPolicy must not be null"); @@ -210,7 +211,7 @@ public class QueryOptions { } /** - * Sets the query fetch size for {@link com.datastax.driver.core.ResultSet} chunks. + * Sets the query fetch size for {@link com.datastax.oss.driver.api.core.cql.ResultSet} chunks. *

* The fetch size controls how much resulting rows will be retrieved simultaneously (the goal being to avoid loading * too much results in memory for queries yielding large results). Please note that while value as low as 1 can be @@ -219,14 +220,29 @@ public class QueryOptions { * @param fetchSize the number of rows to fetch per chunking request. To disable chunking of the result set, use * {@code fetchSize == Integer.MAX_VALUE}. Negative values are not allowed. * @return {@code this} {@link QueryOptionsBuilder} - * @see com.datastax.driver.core.QueryOptions#getFetchSize() - * @see com.datastax.driver.core.Cluster.Builder#withQueryOptions(com.datastax.driver.core.QueryOptions) + * @deprecated since 3.0, use {@link #pageSize(int)}. */ + @Deprecated public QueryOptionsBuilder fetchSize(int fetchSize) { + return pageSize(fetchSize); + } - Assert.isTrue(fetchSize >= 0, "FetchSize must be greater than equal to zero"); + /** + * Sets the query fetch size for {@link com.datastax.oss.driver.api.core.cql.ResultSet} chunks. + *

+ * The fetch size controls how much resulting rows will be retrieved simultaneously (the goal being to avoid loading + * too much results in memory for queries yielding large results). Please note that while value as low as 1 can be + * used, it is *highly* discouraged to use such a low value in practice as it will yield very poor performance. + * + * @param pageSize the number of rows to fetch per chunking request. To disable chunking of the result set, use + * {@code pageSize == Integer.MAX_VALUE}. Negative values are not allowed. + * @return {@code this} {@link QueryOptionsBuilder} + */ + public QueryOptionsBuilder pageSize(int pageSize) { - this.fetchSize = fetchSize; + Assert.isTrue(pageSize >= 0, "Page size must be greater than equal to zero"); + + this.pageSize = pageSize; return this; } @@ -237,11 +253,12 @@ public class QueryOptions { * @param readTimeout the read timeout in milliseconds. Negative values are not allowed. If it is {@code 0}, the * read timeout will be disabled for this statement. * @return {@code this} {@link QueryOptionsBuilder} - * @see SocketOptions#getReadTimeoutMillis() - * @see com.datastax.driver.core.Cluster.Builder#withSocketOptions(SocketOptions) + * @see com.datastax.oss.driver.api.core.cql.SimpleStatement#setTimeout(Duration) + * @deprecated since 3.0, use {@link #timeout(Duration)} */ + @Deprecated public QueryOptionsBuilder readTimeout(long readTimeout) { - return readTimeout(Duration.ofMillis(readTimeout)); + return timeout(Duration.ofMillis(readTimeout)); } /** @@ -251,9 +268,8 @@ public class QueryOptions { * will be disabled for this statement. * @param timeUnit the {@link TimeUnit} for the supplied timeout; must not be {@literal null}. * @return {@code this} {@link QueryOptionsBuilder} - * @see SocketOptions#getReadTimeoutMillis() - * @see com.datastax.driver.core.Cluster.Builder#withSocketOptions(SocketOptions) - * @deprecated since 2.0, use {@link #readTimeout(Duration)}. + * @see com.datastax.oss.driver.api.core.cql.SimpleStatement#setTimeout(Duration) + * @deprecated since 2.0, use {@link #timeout(Duration)}. */ @Deprecated public QueryOptionsBuilder readTimeout(long readTimeout, TimeUnit timeUnit) { @@ -261,7 +277,7 @@ public class QueryOptions { Assert.isTrue(readTimeout >= 0, "ReadTimeout must be greater than equal to zero"); Assert.notNull(timeUnit, "TimeUnit must not be null"); - return readTimeout(Duration.ofMillis(timeUnit.toMillis(readTimeout))); + return timeout(Duration.ofMillis(timeUnit.toMillis(readTimeout))); } /** @@ -270,16 +286,35 @@ public class QueryOptions { * @param readTimeout the read timeout. Negative values are not allowed. If it is {@code 0}, the read timeout will * be disabled for this statement. * @return {@code this} {@link QueryOptionsBuilder} - * @see SocketOptions#getReadTimeoutMillis() - * @see com.datastax.driver.core.Cluster.Builder#withSocketOptions(SocketOptions) + * @see com.datastax.oss.driver.api.core.cql.SimpleStatement#setTimeout(Duration) * @since 2.0 + * @deprecated since 3.0, use {@link #timeout(Duration)} */ + @Deprecated public QueryOptionsBuilder readTimeout(Duration readTimeout) { Assert.isTrue(!readTimeout.isZero() && !readTimeout.isNegative(), "ReadTimeout must be greater than equal to zero"); - this.readTimeout = readTimeout; + this.timeout = readTimeout; + + return this; + } + + /** + * Sets the request timeout. Overrides the default timeout. + * + * @param timeout the read timeout. Negative values are not allowed. If it is {@code 0}, the read timeout will be + * disabled for this statement. + * @return {@code this} {@link QueryOptionsBuilder} + * @see com.datastax.oss.driver.api.core.cql.SimpleStatement#setTimeout(Duration) + * @since 3.0 + */ + public QueryOptionsBuilder timeout(Duration timeout) { + + Assert.isTrue(!timeout.isZero() && !timeout.isNegative(), "ReadTimeout must be greater than equal to zero"); + + this.timeout = timeout; return this; } @@ -312,7 +347,7 @@ public class QueryOptions { * @return a new {@link QueryOptions} with the configured values */ public QueryOptions build() { - return new QueryOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.fetchSize, this.readTimeout); + return new QueryOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.pageSize, this.timeout); } } } 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 f9e3f9298..2ce4cbebd 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 @@ -17,12 +17,11 @@ package org.springframework.data.cassandra.core.cql; import org.springframework.util.Assert; -import com.datastax.driver.core.PreparedStatement; -import com.datastax.driver.core.Statement; -import com.datastax.driver.core.querybuilder.Delete; -import com.datastax.driver.core.querybuilder.Insert; -import com.datastax.driver.core.querybuilder.QueryBuilder; -import com.datastax.driver.core.querybuilder.Update; +import com.datastax.oss.driver.api.core.cql.SimpleStatementBuilder; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.querybuilder.delete.Delete; +import com.datastax.oss.driver.api.querybuilder.insert.Insert; +import com.datastax.oss.driver.api.querybuilder.update.Update; /** * Utility class to associate {@link QueryOptions} and {@link WriteOptions} with QueryBuilder {@link Statement}s. @@ -33,27 +32,6 @@ import com.datastax.driver.core.querybuilder.Update; */ public abstract class QueryOptionsUtil { - /** - * Add common {@link QueryOptions} to Cassandra {@link PreparedStatement}s. - * - * @param preparedStatement the Cassandra {@link PreparedStatement}, must not be {@literal null}. - * @param queryOptions query options (e.g. consistency level) to add to the Cassandra {@link PreparedStatement}. - */ - public static PreparedStatement addPreparedStatementOptions(PreparedStatement preparedStatement, - QueryOptions queryOptions) { - - Assert.notNull(preparedStatement, "PreparedStatement must not be null"); - - if (queryOptions.getConsistencyLevel() != null) { - preparedStatement.setConsistencyLevel(queryOptions.getConsistencyLevel()); - } - if (queryOptions.getRetryPolicy() != null) { - preparedStatement.setRetryPolicy(queryOptions.getRetryPolicy()); - } - - return preparedStatement; - } - /** * Add common {@link QueryOptions} to all types of queries. * @@ -61,35 +39,68 @@ public abstract class QueryOptionsUtil { * @param queryOptions query options (e.g. consistency level) to add to the CQL statement. * @return the given {@link Statement}. */ - public static T addQueryOptions(T statement, QueryOptions queryOptions) { + public static > T addQueryOptions(T statement, QueryOptions queryOptions) { Assert.notNull(statement, "Statement must not be null"); + Statement statementToUse = statement; if (queryOptions.getConsistencyLevel() != null) { - statement.setConsistencyLevel(queryOptions.getConsistencyLevel()); + statementToUse = statementToUse.setConsistencyLevel(queryOptions.getConsistencyLevel()); } - if (queryOptions.getRetryPolicy() != null) { - statement.setRetryPolicy(queryOptions.getRetryPolicy()); - } - - if (queryOptions.getFetchSize() != null) { - statement.setFetchSize(queryOptions.getFetchSize()); + if (queryOptions.getPageSize() != null) { + statementToUse = statementToUse.setPageSize(queryOptions.getPageSize()); } if (!queryOptions.getReadTimeout().isNegative()) { - statement.setReadTimeoutMillis(Math.toIntExact(queryOptions.getReadTimeout().toMillis())); + statementToUse = statementToUse.setTimeout(queryOptions.getReadTimeout()); } if (queryOptions.getTracing() != null) { if (queryOptions.getTracing()) { - statement.enableTracing(); + statementToUse = statementToUse.setTracing(true); } else { - statement.disableTracing(); + statementToUse = statementToUse.setTracing(false); } } - return statement; + return (T) statementToUse; + } + + /** + * Add common {@link QueryOptions} to all types of queries. + * + * @param statement a {@link SimpleStatementBuilder}, must not be {@literal null}. + * @param queryOptions query options (e.g. consistency level) to add to the CQL statement. + */ + public static void addQueryOptions(SimpleStatementBuilder statementBuilder, QueryOptions queryOptions) { + + Assert.notNull(statementBuilder, "SimpleStatementBuilder must not be null"); + + if (queryOptions.getConsistencyLevel() != null) { + statementBuilder.setConsistencyLevel(queryOptions.getConsistencyLevel()); + } + + // TODO: + /*if (queryOptions.getRetryPolicy() != null) { + statementToUse = statementToUse.setRetryPolicy(queryOptions.getRetryPolicy()); + } */ + + if (queryOptions.getPageSize() != null) { + statementBuilder.setPageSize(queryOptions.getPageSize()); + } + + if (!queryOptions.getReadTimeout().isNegative()) { + statementBuilder.setTimeout(queryOptions.getReadTimeout()); + } + + if (queryOptions.getTracing() != null) { + if (queryOptions.getTracing()) { + statementBuilder.setTracing(true); + } else { + statementBuilder.setTracing(false); + } + } } /** @@ -102,18 +113,19 @@ public abstract class QueryOptionsUtil { public static Insert addWriteOptions(Insert insert, WriteOptions writeOptions) { Assert.notNull(insert, "Insert must not be null"); + Assert.notNull(writeOptions, "WriteOptions must not be null"); - addQueryOptions(insert, writeOptions); + Insert insertToUse = insert; if (!writeOptions.getTtl().isNegative()) { - insert.using(QueryBuilder.ttl(Math.toIntExact(writeOptions.getTtl().getSeconds()))); + insertToUse = insertToUse.usingTtl(Math.toIntExact(writeOptions.getTtl().getSeconds())); } if (writeOptions.getTimestamp() != null) { - insert.using(QueryBuilder.timestamp(writeOptions.getTimestamp())); + insertToUse = insertToUse.usingTimestamp(writeOptions.getTimestamp()); } - return insert; + return insertToUse; } /** @@ -127,12 +139,9 @@ public abstract class QueryOptionsUtil { public static Delete addWriteOptions(Delete delete, WriteOptions writeOptions) { Assert.notNull(delete, "Delete must not be null"); + Assert.notNull(writeOptions, "WriteOptions must not be null"); - addQueryOptions(delete, writeOptions); - - if (writeOptions.getTimestamp() != null) { - delete.using(QueryBuilder.timestamp(writeOptions.getTimestamp())); - } + // TODO: Timestamp? TTL return delete; } @@ -147,15 +156,9 @@ public abstract class QueryOptionsUtil { public static Update addWriteOptions(Update update, WriteOptions writeOptions) { Assert.notNull(update, "Update must not be null"); + Assert.notNull(writeOptions, "WriteOptions must not be null"); - addQueryOptions(update, writeOptions); - - if (!writeOptions.getTtl().isNegative()) { - update.using(QueryBuilder.ttl(Math.toIntExact(writeOptions.getTtl().getSeconds()))); - } - if (writeOptions.getTimestamp() != null) { - update.using(QueryBuilder.timestamp(writeOptions.getTimestamp())); - } + // TODO: Timestamp, TTL? return update; } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java index 29da10655..7c3143fc4 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java @@ -24,8 +24,8 @@ import java.util.concurrent.TimeUnit; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.policies.RetryPolicy; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.retry.RetryPolicy; /** * Cassandra Write Options are an extension to {@link QueryOptions} for write operations. {@link WriteOptions}allow @@ -157,17 +157,18 @@ public class WriteOptions extends QueryOptions { * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#consistencyLevel(com.datastax.driver.core.ConsistencyLevel) */ @Override - public WriteOptionsBuilder consistencyLevel(com.datastax.driver.core.ConsistencyLevel consistencyLevel) { + public WriteOptionsBuilder consistencyLevel(ConsistencyLevel consistencyLevel) { super.consistencyLevel(consistencyLevel); return this; } /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#retryPolicy(org.springframework.data.cassandra.core.cql.RetryPolicy) + * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#retryPolicy(com.datastax.oss.driver.api.core.retry.RetryPolicy) */ @Override - public WriteOptionsBuilder retryPolicy(com.datastax.driver.core.policies.RetryPolicy driverRetryPolicy) { + @Deprecated + public WriteOptionsBuilder retryPolicy(RetryPolicy driverRetryPolicy) { super.retryPolicy(driverRetryPolicy); return this; @@ -177,9 +178,20 @@ public class WriteOptions extends QueryOptions { * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#fetchSize(int) */ @Override - public WriteOptionsBuilder fetchSize(int fetchSize) { + @Deprecated + public WriteOptionsBuilder fetchSize(int pageSize) { - super.fetchSize(fetchSize); + super.fetchSize(pageSize); + return this; + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#pageSize(int) + */ + @Override + public WriteOptionsBuilder pageSize(int pageSize) { + + super.pageSize(pageSize); return this; } @@ -187,6 +199,7 @@ public class WriteOptions extends QueryOptions { * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#readTimeout(long) */ @Override + @Deprecated public WriteOptionsBuilder readTimeout(long readTimeout) { super.readTimeout(readTimeout); @@ -208,9 +221,9 @@ public class WriteOptions extends QueryOptions { * @see org.springframework.data.cassandra.core.cql.QueryOptions.QueryOptionsBuilder#readTimeout(java.time.Duration) */ @Override - public WriteOptionsBuilder readTimeout(Duration readTimeout) { + public WriteOptionsBuilder timeout(Duration timeout) { - super.readTimeout(readTimeout); + super.timeout(timeout); return this; } @@ -305,7 +318,7 @@ public class WriteOptions extends QueryOptions { * @return a new {@link WriteOptions} with the configured values */ public WriteOptions build() { - return new WriteOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.fetchSize, this.readTimeout, + return new WriteOptions(this.consistencyLevel, this.retryPolicy, this.tracing, this.pageSize, this.timeout, this.ttl, this.timestamp); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUnitTests.java index c0fb18d14..7d390e44a 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUnitTests.java @@ -15,17 +15,13 @@ */ package org.springframework.data.cassandra.core.cql; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import java.time.Duration; import org.junit.Test; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.policies.DefaultRetryPolicy; -import com.datastax.driver.core.policies.DowngradingConsistencyRetryPolicy; -import com.datastax.driver.core.policies.FallthroughRetryPolicy; -import com.datastax.driver.core.policies.LoggingRetryPolicy; +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; /** * Unit tests for {@link QueryOptions}. @@ -37,62 +33,30 @@ public class QueryOptionsUnitTests { @Test // DATACASS-202 public void buildQueryOptions() { - QueryOptions queryOptions = QueryOptions.builder() - .consistencyLevel(ConsistencyLevel.ANY) - .retryPolicy(FallthroughRetryPolicy.INSTANCE) - .readTimeout(Duration.ofSeconds(1)) - .fetchSize(10) - .tracing(true) - .build(); + QueryOptions queryOptions = QueryOptions.builder().consistencyLevel(DefaultConsistencyLevel.ANY) + .timeout(Duration.ofSeconds(1)).pageSize(10).tracing(true).build(); assertThat(queryOptions.getClass()).isEqualTo(QueryOptions.class); - assertThat(queryOptions.getRetryPolicy()).isEqualTo(FallthroughRetryPolicy.INSTANCE); - assertThat(queryOptions.getConsistencyLevel()).isEqualTo(ConsistencyLevel.ANY); + assertThat(queryOptions.getConsistencyLevel()).isEqualTo(DefaultConsistencyLevel.ANY); assertThat(queryOptions.getReadTimeout()).isEqualTo(Duration.ofSeconds(1)); - assertThat(queryOptions.getFetchSize()).isEqualTo(10); + assertThat(queryOptions.getPageSize()).isEqualTo(10); assertThat(queryOptions.getTracing()).isTrue(); } - @Test // DATACASS-202 - public void buildQueryOptionsWithDriverRetryPolicy() { - - QueryOptions writeOptions = QueryOptions.builder() - .retryPolicy(new LoggingRetryPolicy(DefaultRetryPolicy.INSTANCE)) - .build(); - - assertThat(writeOptions.getRetryPolicy()).isInstanceOf(LoggingRetryPolicy.class); - } - - @Test // DATACASS-202 - public void buildQueryOptionsWithRetryPolicy() { - - QueryOptions writeOptions = QueryOptions.builder() - .retryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE) - .build(); - - assertThat(writeOptions.getRetryPolicy()).isEqualTo(DowngradingConsistencyRetryPolicy.INSTANCE); - } - @Test // DATACASS-56 public void buildQueryOptionsMutate() { - QueryOptions queryOptions = QueryOptions.builder() - .consistencyLevel(ConsistencyLevel.ANY) - .retryPolicy(FallthroughRetryPolicy.INSTANCE) - .readTimeout(Duration.ofSeconds(1)) - .fetchSize(10) - .tracing(true) - .build(); + QueryOptions queryOptions = QueryOptions.builder().consistencyLevel(DefaultConsistencyLevel.ANY) + .timeout(Duration.ofSeconds(1)).pageSize(10).tracing(true).build(); - QueryOptions mutated = queryOptions.mutate().readTimeout(Duration.ofSeconds(5)).build(); + QueryOptions mutated = queryOptions.mutate().timeout(Duration.ofSeconds(5)).build(); assertThat(mutated).isNotNull(); assertThat(mutated).isNotSameAs(queryOptions); assertThat(mutated.getClass()).isEqualTo(QueryOptions.class); - assertThat(mutated.getRetryPolicy()).isEqualTo(FallthroughRetryPolicy.INSTANCE); - assertThat(mutated.getConsistencyLevel()).isEqualTo(ConsistencyLevel.ANY); + assertThat(mutated.getConsistencyLevel()).isEqualTo(DefaultConsistencyLevel.ANY); assertThat(mutated.getReadTimeout()).isEqualTo(Duration.ofSeconds(5)); - assertThat(mutated.getFetchSize()).isEqualTo(10); + assertThat(mutated.getPageSize()).isEqualTo(10); assertThat(mutated.getTracing()).isTrue(); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtilUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtilUnitTests.java index 91f41226e..46e15ac14 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtilUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/QueryOptionsUtilUnitTests.java @@ -17,23 +17,16 @@ package org.springframework.data.cassandra.core.cql; import static org.mockito.Mockito.*; +import java.time.Duration; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.PreparedStatement; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.Statement; -import com.datastax.driver.core.policies.FallthroughRetryPolicy; -import com.datastax.driver.core.querybuilder.Delete; -import com.datastax.driver.core.querybuilder.Insert; -import com.datastax.driver.core.querybuilder.Update; -import com.datastax.driver.core.querybuilder.Using; +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; /** * Unit tests for {@link QueryOptionsUtil}. @@ -42,65 +35,20 @@ import com.datastax.driver.core.querybuilder.Using; * @author Mark Paluch */ @RunWith(MockitoJUnitRunner.class) -@SuppressWarnings("unchecked") public class QueryOptionsUtilUnitTests { - @Mock Insert mockInsert; - @Mock PreparedStatement mockPreparedStatement; - @Mock Session mockSession; - @Mock Statement mockStatement; - @Mock Update mockUpdate; - @Mock Delete mockDelete; + @Mock(stubOnly = true) SimpleStatement simpleStatement; @Test // DATACASS-202 public void addPreparedStatementOptionsShouldAddDriverQueryOptions() { QueryOptions queryOptions = QueryOptions.builder() // - .consistencyLevel(ConsistencyLevel.EACH_QUORUM) // - .retryPolicy(FallthroughRetryPolicy.INSTANCE) // + .consistencyLevel(DefaultConsistencyLevel.EACH_QUORUM) // .build(); - QueryOptionsUtil.addPreparedStatementOptions(mockPreparedStatement, queryOptions); + QueryOptionsUtil.addQueryOptions(simpleStatement, queryOptions); - verify(mockPreparedStatement).setConsistencyLevel(ConsistencyLevel.EACH_QUORUM); - verify(mockPreparedStatement).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - } - - @Test // DATACASS-202 - public void addPreparedStatementOptionsShouldAddOurQueryOptions() { - - QueryOptions queryOptions = QueryOptions.builder().retryPolicy(FallthroughRetryPolicy.INSTANCE) - .consistencyLevel(ConsistencyLevel.LOCAL_QUORUM).build(); - - QueryOptionsUtil.addPreparedStatementOptions(mockPreparedStatement, queryOptions); - - verify(mockPreparedStatement).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - verify(mockPreparedStatement).setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM); - } - - @Test // DATACASS-202 - public void addStatementQueryOptionsShouldAddDriverQueryOptions() { - - QueryOptions queryOptions = QueryOptions.builder().consistencyLevel(ConsistencyLevel.EACH_QUORUM) // - .retryPolicy(FallthroughRetryPolicy.INSTANCE) // - .build(); - - QueryOptionsUtil.addQueryOptions(mockStatement, queryOptions); - - verify(mockStatement).setConsistencyLevel(ConsistencyLevel.EACH_QUORUM); - verify(mockStatement).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - } - - @Test // DATACASS-202 - public void addStatementQueryOptionsShouldAddOurQueryOptions() { - - QueryOptions queryOptions = QueryOptions.builder().retryPolicy(FallthroughRetryPolicy.INSTANCE) - .consistencyLevel(ConsistencyLevel.LOCAL_QUORUM).build(); - - QueryOptionsUtil.addQueryOptions(mockStatement, queryOptions); - - verify(mockStatement).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - verify(mockStatement).setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM); + verify(simpleStatement).setConsistencyLevel(DefaultConsistencyLevel.EACH_QUORUM); } @Test // DATACASS-202 @@ -108,76 +56,24 @@ public class QueryOptionsUtilUnitTests { QueryOptions queryOptions = QueryOptions.builder().build(); - QueryOptionsUtil.addQueryOptions(mockStatement, queryOptions); + QueryOptionsUtil.addQueryOptions(simpleStatement, queryOptions); - verifyZeroInteractions(mockStatement); + verifyNoInteractions(simpleStatement); } @Test // DATACASS-202 public void addStatementQueryOptionsShouldAddGenericQueryOptions() { QueryOptions queryOptions = QueryOptions.builder() // - .fetchSize(10) // + .pageSize(10) // .readTimeout(1, TimeUnit.MINUTES) // .withTracing() // .build(); - QueryOptionsUtil.addQueryOptions(mockStatement, queryOptions); + QueryOptionsUtil.addQueryOptions(simpleStatement, queryOptions); - verify(mockStatement).setReadTimeoutMillis(60 * 1000); - verify(mockStatement).setFetchSize(10); - verify(mockStatement).enableTracing(); - } - - @Test // DATACASS-202 - public void addInsertWriteOptionsShouldAddDriverQueryOptions() { - - WriteOptions writeOptions = WriteOptions.builder() // - .consistencyLevel(ConsistencyLevel.EACH_QUORUM) // - .retryPolicy(FallthroughRetryPolicy.INSTANCE) // - .readTimeout(10) // - .ttl(10) // - .build(); - - QueryOptionsUtil.addWriteOptions(mockInsert, writeOptions); - - verify(mockInsert).setConsistencyLevel(ConsistencyLevel.EACH_QUORUM); - verify(mockInsert).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - verify(mockInsert).setReadTimeoutMillis(10); - verify(mockInsert).using(Mockito.any(Using.class)); - } - - @Test // DATACASS-202 - public void addUpdateWriteOptionsShouldAddDriverQueryOptions() { - - WriteOptions writeOptions = WriteOptions.builder() // - .consistencyLevel(ConsistencyLevel.EACH_QUORUM) // - .retryPolicy(FallthroughRetryPolicy.INSTANCE) // - .ttl(10) // - .tracing(false).build(); - - QueryOptionsUtil.addWriteOptions(mockUpdate, writeOptions); - - verify(mockUpdate).setConsistencyLevel(ConsistencyLevel.EACH_QUORUM); - verify(mockUpdate).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - verify(mockUpdate).using(Mockito.any(Using.class)); - verify(mockUpdate).disableTracing(); - } - - @Test // DATACASS-155 - public void addDeleteWriteOptionsShouldAddDriverQueryOptions() { - - WriteOptions writeOptions = WriteOptions.builder() // - .consistencyLevel(ConsistencyLevel.EACH_QUORUM) // - .retryPolicy(FallthroughRetryPolicy.INSTANCE) // - .timestamp(42) // - .tracing(false).build(); - - QueryOptionsUtil.addWriteOptions(mockDelete, writeOptions); - - verify(mockDelete).setConsistencyLevel(ConsistencyLevel.EACH_QUORUM); - verify(mockDelete).setRetryPolicy(FallthroughRetryPolicy.INSTANCE); - verify(mockDelete).using(Mockito.any(Using.class)); - verify(mockDelete).disableTracing(); + verify(simpleStatement).setTimeout(Duration.ofMinutes(1)); + verify(simpleStatement).setPageSize(10); + verify(simpleStatement).setTracing(true); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java index 8c8f67403..8e6b08e4a 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java @@ -15,7 +15,7 @@ */ package org.springframework.data.cassandra.core.cql; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import java.time.Duration; import java.time.Instant; @@ -24,9 +24,7 @@ import java.time.ZoneOffset; import org.junit.Test; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.policies.DowngradingConsistencyRetryPolicy; -import com.datastax.driver.core.policies.FallthroughRetryPolicy; +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; /** * Unit tests for {@link WriteOptions}. @@ -39,74 +37,55 @@ public class WriteOptionsUnitTests { public void buildWriteOptions() { WriteOptions writeOptions = WriteOptions.builder() - .consistencyLevel(com.datastax.driver.core.ConsistencyLevel.ANY) + .consistencyLevel(DefaultConsistencyLevel.ANY) .ttl(123) .timestamp(1519000753) - .retryPolicy(FallthroughRetryPolicy.INSTANCE) .readTimeout(1) - .fetchSize(10) + .pageSize(10) .withTracing() .build(); assertThat(writeOptions.getTtl()).isEqualTo(Duration.ofSeconds(123)); assertThat(writeOptions.getTimestamp()).isEqualTo(1519000753); - assertThat(writeOptions.getRetryPolicy()).isEqualTo(FallthroughRetryPolicy.INSTANCE); - assertThat(writeOptions.getConsistencyLevel()).isEqualTo(ConsistencyLevel.ANY); + assertThat(writeOptions.getConsistencyLevel()).isEqualTo(DefaultConsistencyLevel.ANY); assertThat(writeOptions.getReadTimeout()).isEqualTo(Duration.ofMillis(1)); - assertThat(writeOptions.getFetchSize()).isEqualTo(10); + assertThat(writeOptions.getPageSize()).isEqualTo(10); assertThat(writeOptions.getTracing()).isTrue(); } @Test // DATACASS-202 public void buildReadTimeoutOptionsWriteOptions() { - WriteOptions writeOptions = WriteOptions.builder().readTimeout(Duration.ofMinutes(1)).build(); + WriteOptions writeOptions = WriteOptions.builder().timeout(Duration.ofMinutes(1)).build(); assertThat(writeOptions.getReadTimeout()).isEqualTo(Duration.ofSeconds(60)); - assertThat(writeOptions.getFetchSize()).isNull(); + assertThat(writeOptions.getPageSize()).isNull(); assertThat(writeOptions.getTracing()).isNull(); } - @Test // DATACASS-202 - public void buildQueryOptionsWithDriverRetryPolicy() { - - QueryOptions writeOptions = QueryOptions.builder().retryPolicy(FallthroughRetryPolicy.INSTANCE).build(); - - assertThat(writeOptions.getRetryPolicy()).isEqualTo(FallthroughRetryPolicy.INSTANCE); - } - - @Test // DATACASS-202 - public void buildQueryOptionsWithRetryPolicy() { - - QueryOptions writeOptions = QueryOptions.builder().retryPolicy(FallthroughRetryPolicy.INSTANCE).build(); - - assertThat(writeOptions.getRetryPolicy()).isEqualTo(FallthroughRetryPolicy.INSTANCE); - } @Test // DATACASS-56 public void buildWriteOptionsMutate() { Instant now = LocalDateTime.now().toInstant(ZoneOffset.UTC); WriteOptions writeOptions = WriteOptions.builder() - .consistencyLevel(com.datastax.driver.core.ConsistencyLevel.ANY) + .consistencyLevel(DefaultConsistencyLevel.ANY) .ttl(123) .timestamp(now) - .retryPolicy(FallthroughRetryPolicy.INSTANCE) .readTimeout(1) - .fetchSize(10) + .pageSize(10) .withTracing() .build(); - WriteOptions mutated = writeOptions.mutate().retryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE).build(); + WriteOptions mutated = writeOptions.mutate().timeout(Duration.ofMillis(100)).build(); assertThat(mutated).isNotNull(); assertThat(mutated).isNotSameAs(writeOptions); assertThat(mutated.getTtl()).isEqualTo(Duration.ofSeconds(123)); assertThat(mutated.getTimestamp()).isEqualTo(now.toEpochMilli() * 1000); - assertThat(mutated.getRetryPolicy()).isEqualTo(DowngradingConsistencyRetryPolicy.INSTANCE); - assertThat(mutated.getConsistencyLevel()).isEqualTo(ConsistencyLevel.ANY); - assertThat(mutated.getReadTimeout()).isEqualTo(Duration.ofMillis(1)); - assertThat(mutated.getFetchSize()).isEqualTo(10); + assertThat(mutated.getConsistencyLevel()).isEqualTo(DefaultConsistencyLevel.ANY); + assertThat(mutated.getReadTimeout()).isEqualTo(Duration.ofMillis(100)); + assertThat(mutated.getPageSize()).isEqualTo(10); assertThat(mutated.getTracing()).isTrue(); } }