diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchOperations.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchOperations.java index 0e3df8c5f..294cfb280 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchOperations.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchOperations.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ import org.springframework.cassandra.core.WriteOptions; * isolation, they're not much more expensive than normal writes. * * @author Mark Paluch + * @author Anup Sabbi * @since 1.5 */ public interface CassandraBatchOperations { @@ -71,12 +72,13 @@ public interface CassandraBatchOperations { CassandraBatchOperations insert(Iterable entities); /** - * Add a collection of inserts with given {@code options} to the batch. + * Add a collection of inserts with given {@link WriteOptions} to the batch. * * @param entities the entities to insert; must not be {@literal null}. - * @param options the WriteOptions to apply. + * @param options the WriteOptions to apply; must not be {@literal null}. * @return {@code this} {@link CassandraBatchOperations}. * @throws IllegalStateException if the batch was already executed. + * @since 2.0 */ CassandraBatchOperations insert(Iterable entities, WriteOptions options); @@ -99,12 +101,13 @@ public interface CassandraBatchOperations { CassandraBatchOperations update(Iterable entities); /** - * Add a collection of updates with given {@code options} to the batch. + * Add a collection of updates with given {@link WriteOptions} to the batch. * * @param entities the entities to update; must not be {@literal null}. - * @param options the WriteOptions to apply. + * @param options the WriteOptions to apply; must not be {@literal null}. * @return {@code this} {@link CassandraBatchOperations}. * @throws IllegalStateException if the batch was already executed. + * @since 2.0 */ CassandraBatchOperations update(Iterable entities, WriteOptions options); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchTemplate.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchTemplate.java index d0b758c78..1adeae4ff 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchTemplate.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraBatchTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package org.springframework.data.cassandra.core; import java.util.Arrays; -import java.util.Collections; import java.util.concurrent.atomic.AtomicBoolean; import org.springframework.cassandra.core.WriteOptions; @@ -30,27 +29,19 @@ import com.datastax.driver.core.querybuilder.QueryBuilder; * * @author Mark Paluch * @author John Blum + * @author Anup Sabbi * @since 1.5 */ class CassandraBatchTemplate implements CassandraBatchOperations { + private static final WriteOptions EMPTY = new WriteOptions(); + private AtomicBoolean executed = new AtomicBoolean(); private final Batch batch; private final CassandraOperations operations; - /* (non-Javadoc) */ - @SafeVarargs - private static Iterable nullSafeIterable(T... array) { - return (array == null ? Collections.emptyList() : Arrays.asList(array)); - } - - /* (non-Javadoc) */ - private static Iterable nullSafeIterable(Iterable iterable) { - return (iterable != null ? iterable : Collections::emptyIterator); - } - /** * Create a new {@link CassandraBatchTemplate} given {@link CassandraOperations}. * @@ -64,8 +55,7 @@ class CassandraBatchTemplate implements CassandraBatchOperations { this.batch = QueryBuilder.batch(); } - /* - * (non-Javadoc) + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraBatchOperations#execute() */ @Override @@ -79,8 +69,7 @@ class CassandraBatchTemplate implements CassandraBatchOperations { assertNotExecuted(); } - /* - * (non-Javadoc) + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraBatchOperations#withTimestamp(long) */ @Override @@ -93,34 +82,37 @@ class CassandraBatchTemplate implements CassandraBatchOperations { return this; } - /* - * (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraBatchOperations#insert(Object...) + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraBatchOperations#insert(java.lang.Object[]) */ @Override public CassandraBatchOperations insert(Object... entities) { - return insert(nullSafeIterable(entities)); + + Assert.notNull(entities, "Entities must not be null"); + + return insert(Arrays.asList(entities)); } - /* - * (non-Javadoc) + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraBatchOperations#insert(java.lang.Iterable) */ @Override public CassandraBatchOperations insert(Iterable entities) { - return insert(entities, null); + return insert(entities, EMPTY); } - /* - * (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraBatchOperations#insert(java.lang.Iterable, WriteOptions) + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraBatchOperations#insert(java.lang.Iterable, org.springframework.cassandra.core.WriteOptions) */ @Override public CassandraBatchOperations insert(Iterable entities, WriteOptions options) { assertNotExecuted(); + Assert.notNull(entities, "Entities must not be null"); + Assert.notNull(options, "WriteOptions must not be null"); + + for (Object entity : entities) { - for (Object entity : nullSafeIterable(entities)) { Assert.notNull(entity, "Entity must not be null"); batch.add(QueryUtils.createInsertQuery(getTableName(entity), entity, options, operations.getConverter())); } @@ -128,34 +120,37 @@ class CassandraBatchTemplate implements CassandraBatchOperations { return this; } - /* - * (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraBatchOperations#update(Object...) + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraBatchOperations#update(java.lang.Object[]) */ @Override public CassandraBatchOperations update(Object... entities) { - return update(nullSafeIterable(entities)); + + Assert.notNull(entities, "Entities must not be null"); + + return update(Arrays.asList(entities)); } - /* - * (non-Javadoc) + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraBatchOperations#update(java.lang.Iterable) */ @Override public CassandraBatchOperations update(Iterable entities) { - return update(entities, null); + return update(entities, EMPTY); } - /* - * (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraBatchOperations#update(java.lang.Iterable, WriteOptions) + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraBatchOperations#update(java.lang.Iterable, org.springframework.cassandra.core.WriteOptions) */ @Override public CassandraBatchOperations update(Iterable entities, WriteOptions options) { assertNotExecuted(); + Assert.notNull(entities, "Entities must not be null"); + Assert.notNull(options, "WriteOptions must not be null"); + + for (Object entity : entities) { - for (Object entity : nullSafeIterable(entities)) { Assert.notNull(entity, "Entity must not be null"); batch.add(QueryUtils.createUpdateQuery(getTableName(entity), entity, options, operations.getConverter())); } @@ -163,25 +158,27 @@ class CassandraBatchTemplate implements CassandraBatchOperations { return this; } - /* - * (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraBatchOperations#delete(Object...) + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraBatchOperations#delete(java.lang.Object[]) */ @Override public CassandraBatchOperations delete(Object... entities) { - return delete(nullSafeIterable(entities)); + + Assert.notNull(entities, "Entities must not be null"); + + return delete(Arrays.asList(entities)); } - /* - * (non-Javadoc) + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraBatchOperations#delete(java.lang.Iterable) */ @Override public CassandraBatchOperations delete(Iterable entities) { assertNotExecuted(); + Assert.notNull(entities, "Entities must not be null"); - for (Object entity : nullSafeIterable(entities)) { + for (Object entity : entities) { Assert.notNull(entity, "Entity must not be null"); batch.add(QueryUtils.createDeleteQuery(getTableName(entity), entity, null, operations.getConverter())); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraBatchTemplateIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraBatchTemplateIntegrationTests.java index 5e157e908..857814533 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraBatchTemplateIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraBatchTemplateIntegrationTests.java @@ -37,11 +37,15 @@ import com.datastax.driver.core.Row; * Integration tests for {@link CassandraBatchTemplate}. * * @author Mark Paluch + * @author Anup Sabbi */ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCreatingIntegrationTest { CassandraTemplate template; + Group walter = new Group(new GroupKey("users", "0x1", "walter")); + Group mike = new Group(new GroupKey("users", "0x1", "mike")); + @Before public void setUp() throws Exception { @@ -52,14 +56,14 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea SchemaTestUtils.truncate(Group.class, template); SchemaTestUtils.truncate(FlatGroup.class, template); + + template.insert(walter); + template.insert(mike); } @Test // DATACASS-288 public void shouldInsertEntities() { - Group walter = new Group(new GroupKey("users", "0x1", "walter")); - Group mike = new Group(new GroupKey("users", "0x1", "mike")); - CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); batchOperations.insert(walter).insert(mike).execute(); @@ -71,9 +75,6 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-288 public void shouldInsertCollectionOfEntities() { - Group walter = new Group(new GroupKey("users", "0x1", "walter")); - Group mike = new Group(new GroupKey("users", "0x1", "mike")); - CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); batchOperations.insert(Arrays.asList(walter, mike)).execute(); @@ -85,14 +86,11 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-443 public void shouldInsertCollectionOfEntitiesWithTtl() { - Group walter = new Group(new GroupKey("users", "0x1", "walter")); - Group mike = new Group(new GroupKey("users", "0x1", "mike")); - walter.setEmail("walter@white.com"); mike.setEmail("mike@sauls.com"); int ttl = 30; - WriteOptions options = WriteOptions.builder().ttl(ttl).build(); + WriteOptions options = WriteOptions.builder().ttl(30).build(); CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); batchOperations.insert(Arrays.asList(walter, mike), options).execute(); @@ -102,16 +100,13 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea assertThat(resultSet.getAvailableWithoutFetching()).isEqualTo(2); for (Row row : resultSet) { - assertThat(row.getInt(0)).isBetween(1,ttl); + assertThat(row.getInt(0)).isBetween(1, ttl); } } @Test // DATACASS-288 public void shouldUpdateEntities() { - Group walter = template.insert(new Group(new GroupKey("users", "0x1", "walter"))); - Group mike = template.insert(new Group(new GroupKey("users", "0x1", "mike"))); - walter.setEmail("walter@white.com"); mike.setEmail("mike@sauls.com"); @@ -126,9 +121,6 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-288 public void shouldUpdateCollectionOfEntities() { - Group walter = template.insert(new Group(new GroupKey("users", "0x1", "walter"))); - Group mike = template.insert(new Group(new GroupKey("users", "0x1", "mike"))); - walter.setEmail("walter@white.com"); mike.setEmail("mike@sauls.com"); @@ -143,9 +135,6 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-443 public void shouldUpdateCollectionOfEntitiesWithTtl() { - Group walter = template.insert(new Group(new GroupKey("users", "0x1", "walter"))); - Group mike = template.insert(new Group(new GroupKey("users", "0x1", "mike"))); - walter.setEmail("walter@white.com"); mike.setEmail("mike@sauls.com"); @@ -160,7 +149,7 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea assertThat(resultSet.getAvailableWithoutFetching()).isEqualTo(2); for (Row row : resultSet) { - assertThat(row.getInt(0)).isBetween(1,ttl); + assertThat(row.getInt(0)).isBetween(1, ttl); } } @@ -184,9 +173,6 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-288 public void shouldDeleteEntities() { - Group walter = template.insert(new Group(new GroupKey("users", "0x1", "walter"))); - Group mike = template.insert(new Group(new GroupKey("users", "0x1", "mike"))); - CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); batchOperations.delete(walter).delete(mike).execute(); @@ -199,9 +185,6 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-288 public void shouldDeleteCollectionOfEntities() { - Group walter = template.insert(new Group(new GroupKey("users", "0x1", "walter"))); - Group mike = template.insert(new Group(new GroupKey("users", "0x1", "mike"))); - CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); batchOperations.delete(Arrays.asList(walter, mike)).execute(); @@ -214,9 +197,6 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea @Test // DATACASS-288 public void shouldApplyTimestampToAllEntities() { - Group walter = new Group(new GroupKey("users", "0x1", "walter")); - Group mike = new Group(new GroupKey("users", "0x1", "mike")); - walter.setEmail("walter@white.com"); mike.setEmail("mike@sauls.com"); @@ -238,7 +218,7 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea public void shouldNotExecuteTwice() { CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); - batchOperations.insert(new Group(new GroupKey("users", "0x1", "walter"))).execute(); + batchOperations.insert(walter).execute(); batchOperations.execute(); @@ -249,7 +229,7 @@ public class CassandraBatchTemplateIntegrationTests extends AbstractKeyspaceCrea public void shouldNotAllowModificationAfterExecution() { CassandraBatchOperations batchOperations = new CassandraBatchTemplate(template); - batchOperations.insert(new Group(new GroupKey("users", "0x1", "walter"))).execute(); + batchOperations.insert(walter).execute(); batchOperations.update(new Group()); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraTemplateIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraTemplateIntegrationTests.java index 382fa4646..36c314cdf 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraTemplateIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraTemplateIntegrationTests.java @@ -51,7 +51,7 @@ import com.datastax.driver.core.utils.UUIDs; */ public class CassandraTemplateIntegrationTests extends AbstractKeyspaceCreatingIntegrationTest { - final static Version CASSANDRA_3 = Version.parse("3.0"); + static final Version CASSANDRA_3 = Version.parse("3.0"); Version cassandraVersion;