DATACASS-656 - Migrate QueryOptions.fetchSize and readTimeout to pageSize and timeout.

Use renamed Statement options by introducing new pageSize(…) and timeout(…) methods. Deprecated existing methods. Also, deprecate retryPolicy method in preparation for execution profiles.

Original pull request: #167.
This commit is contained in:
Mark Paluch
2019-12-11 10:55:51 +01:00
parent 968eedbcf9
commit 67bc99ff0a
9 changed files with 240 additions and 313 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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.
* <p>
* 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.
* <p>
* 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);
}
}
}

View File

@@ -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 extends Statement> T addQueryOptions(T statement, QueryOptions queryOptions) {
public static <T extends Statement<?>> 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;
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}