diff --git a/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java b/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java index 2b463fb16..0b0361dfe 100644 --- a/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java +++ b/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java @@ -105,6 +105,22 @@ public interface CassandraOperations { */ T insert(T entity, String tableName, QueryOptions options); + /** + * @param entity + * @param tableName + * @param options + * @return + */ + T insert(T entity, QueryOptions options); + + /** + * @param entity + * @param tableName + * @param options + * @return + */ + T insert(T entity, Map optionsByName); + /** * @param entity * @param tableName @@ -130,6 +146,22 @@ public interface CassandraOperations { */ List insert(List entities, String tableName); + /** + * @param entities + * @param tableName + * @param options + * @return + */ + List insert(List entities, QueryOptions options); + + /** + * @param entities + * @param tableName + * @param optionsByName + * @return + */ + List insert(List entities, Map optionsByName); + /** * @param entities * @param tableName @@ -160,6 +192,22 @@ public interface CassandraOperations { */ T insertAsynchronously(T entity, String tableName); + /** + * @param entity + * @param tableName + * @param options + * @return + */ + T insertAsynchronously(T entity, QueryOptions options); + + /** + * @param entity + * @param tableName + * @param optionsByName + * @return + */ + T insertAsynchronously(T entity, Map optionsByName); + /** * @param entity * @param tableName @@ -190,6 +238,22 @@ public interface CassandraOperations { */ List insertAsynchronously(List entities, String tableName); + /** + * @param entities + * @param tableName + * @param options + * @return + */ + List insertAsynchronously(List entities, QueryOptions options); + + /** + * @param entities + * @param tableName + * @param optionsByName + * @return + */ + List insertAsynchronously(List entities, Map optionsByName); + /** * @param entities * @param tableName @@ -220,6 +284,22 @@ public interface CassandraOperations { */ T update(T entity, String tableName); + /** + * @param entity + * @param tableName + * @param options + * @return + */ + T update(T entity, QueryOptions options); + + /** + * @param entity + * @param tableName + * @param optionsByName + * @return + */ + T update(T entity, Map optionsByName); + /** * @param entity * @param tableName @@ -250,6 +330,22 @@ public interface CassandraOperations { */ List update(List entities, String tableName); + /** + * @param entities + * @param tableName + * @param options + * @return + */ + List update(List entities, QueryOptions options); + + /** + * @param entities + * @param tableName + * @param optionsByName + * @return + */ + List update(List entities, Map optionsByName); + /** * @param entities * @param tableName @@ -280,6 +376,22 @@ public interface CassandraOperations { */ T updateAsynchronously(T entity, String tableName); + /** + * @param entity + * @param tableName + * @param options + * @return + */ + T updateAsynchronously(T entity, QueryOptions options); + + /** + * @param entity + * @param tableName + * @param optionsByName + * @return + */ + T updateAsynchronously(T entity, Map optionsByName); + /** * @param entity * @param tableName @@ -310,6 +422,22 @@ public interface CassandraOperations { */ List updateAsynchronously(List entities, String tableName); + /** + * @param entities + * @param tableName + * @param options + * @return + */ + List updateAsynchronously(List entities, QueryOptions options); + + /** + * @param entities + * @param tableName + * @param optionsByName + * @return + */ + List updateAsynchronously(List entities, Map optionsByName); + /** * @param entities * @param tableName @@ -341,6 +469,20 @@ public interface CassandraOperations { */ void delete(T entity, String tableName); + /** + * @param entity + * @param tableName + * @param options + */ + void delete(T entity, QueryOptions options); + + /** + * @param entity + * @param tableName + * @param optionsByName + */ + void delete(T entity, Map optionsByName); + /** * @param entity * @param tableName @@ -370,6 +512,20 @@ public interface CassandraOperations { */ void delete(List entities, String tableName); + /** + * @param entities + * @param tableName + * @param options + */ + void delete(List entities, QueryOptions options); + + /** + * @param entities + * @param tableName + * @param optionsByName + */ + void delete(List entities, Map optionsByName); + /** * @param entities * @param tableName @@ -391,6 +547,20 @@ public interface CassandraOperations { */ void deleteAsychronously(T entity); + /** + * @param entity + * @param tableName + * @param options + */ + void deleteAsychronously(T entity, QueryOptions options); + + /** + * @param entity + * @param tableName + * @param optionsByName + */ + void deleteAsychronously(T entity, Map optionsByName); + /** * @param entity * @param tableName @@ -428,6 +598,20 @@ public interface CassandraOperations { */ void deleteAsychronously(List entities, String tableName); + /** + * @param entities + * @param tableName + * @param options + */ + void deleteAsychronously(List entities, QueryOptions options); + + /** + * @param entities + * @param tableName + * @param optionsByName + */ + void deleteAsychronously(List entities, Map optionsByName); + /** * @param entities * @param tableName diff --git a/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java b/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java index 2d3ada4c9..c69951073 100644 --- a/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java +++ b/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java @@ -53,7 +53,7 @@ import com.datastax.driver.core.exceptions.NoHostAvailableException; import com.datastax.driver.core.querybuilder.Batch; /** - * The Cassandra Template is a convenience API for all Cassnadta DML Operations. + * The Cassandra Template is a convenience API for all Cassnadra DML Operations. * * @author Alex Shvid * @author David Webb @@ -128,6 +128,26 @@ public class CassandraTemplate implements CassandraOperations { delete(entities, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, java.util.Map) + */ + @Override + public void delete(List entities, Map optionsByName) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + delete(entities, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public void delete(List entities, QueryOptions options) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + delete(entities, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, java.lang.String) */ @@ -166,6 +186,26 @@ public class CassandraTemplate implements CassandraOperations { delete(entity, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, java.util.Map) + */ + @Override + public void delete(T entity, Map optionsByName) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + delete(entity, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public void delete(T entity, QueryOptions options) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + delete(entity, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, java.lang.String) */ @@ -203,6 +243,26 @@ public class CassandraTemplate implements CassandraOperations { deleteAsychronously(entities, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsychronously(java.util.List, java.util.Map) + */ + @Override + public void deleteAsychronously(List entities, Map optionsByName) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + deleteAsychronously(entities, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsychronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public void deleteAsychronously(List entities, QueryOptions options) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + deleteAsychronously(entities, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsychronously(java.util.List, java.lang.String) */ @@ -241,6 +301,26 @@ public class CassandraTemplate implements CassandraOperations { deleteAsychronously(entity, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsychronously(java.lang.Object, java.util.Map) + */ + @Override + public void deleteAsychronously(T entity, Map optionsByName) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + deleteAsychronously(entity, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsychronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public void deleteAsychronously(T entity, QueryOptions options) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + deleteAsychronously(entity, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsychronously(java.lang.Object, java.lang.String) */ @@ -400,6 +480,26 @@ public class CassandraTemplate implements CassandraOperations { return insert(entities, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, java.util.Map) + */ + @Override + public List insert(List entities, Map optionsByName) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return insert(entities, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public List insert(List entities, QueryOptions options) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return insert(entities, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, java.lang.String) */ @@ -438,6 +538,26 @@ public class CassandraTemplate implements CassandraOperations { return insert(entity, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, java.util.Map) + */ + @Override + public T insert(T entity, Map optionsByName) { + String tableName = determineTableName(entity); + Assert.notNull(tableName); + return insert(entity, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public T insert(T entity, QueryOptions options) { + String tableName = determineTableName(entity); + Assert.notNull(tableName); + return insert(entity, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, java.lang.String) */ @@ -475,6 +595,26 @@ public class CassandraTemplate implements CassandraOperations { return insertAsynchronously(entities, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, java.util.Map) + */ + @Override + public List insertAsynchronously(List entities, Map optionsByName) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return insertAsynchronously(entities, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public List insertAsynchronously(List entities, QueryOptions options) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return insertAsynchronously(entities, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, java.lang.String) */ @@ -513,6 +653,26 @@ public class CassandraTemplate implements CassandraOperations { return insertAsynchronously(entity, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, java.util.Map) + */ + @Override + public T insertAsynchronously(T entity, Map optionsByName) { + String tableName = determineTableName(entity); + Assert.notNull(tableName); + return insertAsynchronously(entity, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public T insertAsynchronously(T entity, QueryOptions options) { + String tableName = determineTableName(entity); + Assert.notNull(tableName); + return insertAsynchronously(entity, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, java.lang.String) */ @@ -576,6 +736,26 @@ public class CassandraTemplate implements CassandraOperations { return update(entities, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, java.util.Map) + */ + @Override + public List update(List entities, Map optionsByName) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return update(entities, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public List update(List entities, QueryOptions options) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return update(entities, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, java.lang.String) */ @@ -614,6 +794,26 @@ public class CassandraTemplate implements CassandraOperations { return update(entity, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, java.util.Map) + */ + @Override + public T update(T entity, Map optionsByName) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + return update(entity, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public T update(T entity, QueryOptions options) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + return update(entity, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, java.lang.String) */ @@ -651,6 +851,26 @@ public class CassandraTemplate implements CassandraOperations { return updateAsynchronously(entities, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, java.util.Map) + */ + @Override + public List updateAsynchronously(List entities, Map optionsByName) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return updateAsynchronously(entities, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public List updateAsynchronously(List entities, QueryOptions options) { + String tableName = getTableName(entities.get(0).getClass()); + Assert.notNull(tableName); + return updateAsynchronously(entities, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, java.lang.String) */ @@ -689,6 +909,26 @@ public class CassandraTemplate implements CassandraOperations { return updateAsynchronously(entity, tableName); } + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, java.util.Map) + */ + @Override + public T updateAsynchronously(T entity, Map optionsByName) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + return updateAsynchronously(entity, tableName, optionsByName); + } + + /* (non-Javadoc) + * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) + */ + @Override + public T updateAsynchronously(T entity, QueryOptions options) { + String tableName = getTableName(entity.getClass()); + Assert.notNull(tableName); + return updateAsynchronously(entity, tableName, options); + } + /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, java.lang.String) */ @@ -796,7 +1036,7 @@ public class CassandraTemplate implements CassandraOperations { try { final Batch b = CqlUtils.toInsertBatchQuery(keyspace.getKeyspace(), tableName, entities, CPEntity, optionsByName); - log.info(b.toString()); + log.info(b.getQueryString()); return execute(new SessionCallback>() { @@ -922,6 +1162,12 @@ public class CassandraTemplate implements CassandraOperations { final Query q = CqlUtils.toInsertQuery(keyspace.getKeyspace(), tableName, entity, CPEntity, optionsByName); log.info(q.toString()); + if (q.getConsistencyLevel() != null) { + log.info(q.getConsistencyLevel().name()); + } + if (q.getRetryPolicy() != null) { + log.info(q.getRetryPolicy().toString()); + } return execute(new SessionCallback() { diff --git a/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java b/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java index 86fff443c..90cfe1610 100644 --- a/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java +++ b/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java @@ -21,6 +21,7 @@ import org.springframework.data.mapping.PropertyHandler; import com.datastax.driver.core.ColumnMetadata; import com.datastax.driver.core.DataType; import com.datastax.driver.core.Query; +import com.datastax.driver.core.Statement; import com.datastax.driver.core.TableMetadata; import com.datastax.driver.core.querybuilder.Batch; import com.datastax.driver.core.querybuilder.Delete; @@ -356,11 +357,9 @@ public abstract class CqlUtils { */ final Batch b = QueryBuilder.batch(); - List queries = new ArrayList(); - for (final T objectToSave : objectsToSave) { - queries.add(toUpdateQuery(keyspaceName, tableName, objectToSave, entity, optionsByName)); + b.add((Statement) toUpdateQuery(keyspaceName, tableName, objectToSave, entity, optionsByName)); } @@ -392,11 +391,9 @@ public abstract class CqlUtils { */ final Batch b = QueryBuilder.batch(); - List queries = new ArrayList(); - for (final T objectToSave : objectsToSave) { - queries.add(toInsertQuery(keyspaceName, tableName, objectToSave, entity, optionsByName)); + b.add((Statement) toInsertQuery(keyspaceName, tableName, objectToSave, entity, optionsByName)); } @@ -514,11 +511,9 @@ public abstract class CqlUtils { */ final Batch b = QueryBuilder.batch(); - List queries = new ArrayList(); - for (final T objectToSave : entities) { - queries.add(toDeleteQuery(keyspaceName, tableName, objectToSave, entity, optionsByName)); + b.add((Statement) toDeleteQuery(keyspaceName, tableName, objectToSave, entity, optionsByName)); } diff --git a/src/test/java/org/springframework/data/cassandra/table/Book.java b/src/test/java/org/springframework/data/cassandra/table/Book.java index c2c0bae7b..7e88cff3d 100644 --- a/src/test/java/org/springframework/data/cassandra/table/Book.java +++ b/src/test/java/org/springframework/data/cassandra/table/Book.java @@ -19,6 +19,8 @@ import org.springframework.data.cassandra.mapping.RowId; import org.springframework.data.cassandra.mapping.Table; /** + * Test POJO + * * @author David Webb * */ diff --git a/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTableTest.java b/src/test/java/org/springframework/data/cassandra/template/CassandraAdminTest.java similarity index 88% rename from src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTableTest.java rename to src/test/java/org/springframework/data/cassandra/template/CassandraAdminTest.java index 349aea9c4..475db3fa6 100644 --- a/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTableTest.java +++ b/src/test/java/org/springframework/data/cassandra/template/CassandraAdminTest.java @@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.cassandra.config.TestConfig; -import org.springframework.data.cassandra.core.CassandraTemplate; +import org.springframework.data.cassandra.core.CassandraOperations; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @@ -45,15 +45,15 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class) -public class CassandraOperationsTableTest { +public class CassandraAdminTest { @Autowired - private CassandraTemplate cassandraTemplate; + private CassandraOperations cassandraTemplate; @Mock ApplicationContext context; - private static Logger log = LoggerFactory.getLogger(CassandraOperationsTableTest.class); + private static Logger log = LoggerFactory.getLogger(CassandraAdminTest.class); @BeforeClass public static void startCassandra() throws IOException, TTransportException, ConfigurationException, @@ -77,11 +77,6 @@ public class CassandraOperationsTableTest { DataLoader dataLoader = new DataLoader("Test Cluster", "localhost:9160"); dataLoader.load(new ClassPathYamlDataSet("cassandra-keyspace.yaml")); - log.info("Creating Table..."); - - // cassandraTemplate.createTable(User.class); - // cassandraTemplate.createTable(Comment.class); - } @Test diff --git a/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTest.java b/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTest.java index f1de1124b..da42d9af8 100644 --- a/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTest.java +++ b/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTest.java @@ -18,7 +18,11 @@ package org.springframework.data.cassandra.template; import static org.junit.Assert.assertNotNull; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.thrift.transport.TTransportException; @@ -29,7 +33,6 @@ import org.cassandraunit.dataset.yaml.ClassPathYamlDataSet; import org.cassandraunit.utils.EmbeddedCassandraServerHelper; import org.junit.After; import org.junit.AfterClass; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -39,6 +42,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.cassandra.config.TestConfig; import org.springframework.data.cassandra.core.CassandraOperations; +import org.springframework.data.cassandra.core.ConsistencyLevel; +import org.springframework.data.cassandra.core.QueryOptions; +import org.springframework.data.cassandra.core.RetryPolicy; import org.springframework.data.cassandra.core.RingMember; import org.springframework.data.cassandra.table.Book; import org.springframework.test.context.ContextConfiguration; @@ -46,6 +52,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; /** + * Unit Tests for CassnadraTemplate + * * @author David Webb * */ @@ -58,47 +66,29 @@ public class CassandraOperationsTest { private static Logger log = LoggerFactory.getLogger(CassandraOperationsTest.class); + private final static String CASSANDRA_CONFIG = "cassandra.yaml"; private final static String KEYSPACE_NAME = "test"; + private final static String CASSANDRA_HOST = "localhost"; + private final static int CASSANDRA_NATIVE_PORT = 9042; + private final static int CASSANDRA_THRIFT_PORT = 9160; @Rule - public CassandraCQLUnit cassandraCQLUnit = new CassandraCQLUnit(new ClassPathCQLDataSet("cql-dataload.cql", "test"), - "cassandra.yaml", "localhost", 9042); + public CassandraCQLUnit cassandraCQLUnit = new CassandraCQLUnit(new ClassPathCQLDataSet("cql-dataload.cql", + KEYSPACE_NAME), CASSANDRA_CONFIG, CASSANDRA_HOST, CASSANDRA_NATIVE_PORT); @BeforeClass public static void startCassandra() throws IOException, TTransportException, ConfigurationException, InterruptedException { - EmbeddedCassandraServerHelper.startEmbeddedCassandra("cassandra.yaml"); + EmbeddedCassandraServerHelper.startEmbeddedCassandra(CASSANDRA_CONFIG); /* * Load data file to creat the test keyspace before we init the template */ - DataLoader dataLoader = new DataLoader("Test Cluster", "localhost:9160"); + DataLoader dataLoader = new DataLoader("Test Cluster", CASSANDRA_HOST + ":" + CASSANDRA_THRIFT_PORT); dataLoader.load(new ClassPathYamlDataSet("cassandra-keyspace.yaml")); } - @Before - public void setupKeyspace() { - - /* - * Load data file to creat the test keyspace before we init the template - */ - // DataLoader dataLoader = new DataLoader("Test Cluster", "localhost:9160"); - // dataLoader.load(new ClassPathYamlDataSet("cassandra-keyspace.yaml")); - - log.info("Creating Table..."); - createTables(); - - } - - private void createTables() { - - // cassandraTemplate - // .executeQuery("create table users (username text, firstName text, lastName text, PRIMARY KEY (username));"); - - // cassandraCQLUnit. - } - @Test public void ringTest() { @@ -119,20 +109,254 @@ public class CassandraOperationsTest { public void insertTest() { /* - * Test Single Insert + * Test Single Insert with entity */ - Book b = new Book(); - b.setIsbn("123456"); - b.setTitle("Spring Data Cassandra Guide"); - b.setAuthor("Cassandra Guru"); - b.setPages(521); + Book b1 = new Book(); + b1.setIsbn("123456-1"); + b1.setTitle("Spring Data Cassandra Guide"); + b1.setAuthor("Cassandra Guru"); + b1.setPages(521); - cassandraTemplate.insert(b); + cassandraTemplate.insert(b1); - b.setPages(245); + Book b2 = new Book(); + b2.setIsbn("123456-2"); + b2.setTitle("Spring Data Cassandra Guide"); + b2.setAuthor("Cassandra Guru"); + b2.setPages(521); - cassandraTemplate.update(b); + cassandraTemplate.insert(b2, "book_alt"); + /* + * Test Single Insert with entity + */ + Book b3 = new Book(); + b3.setIsbn("123456-3"); + b3.setTitle("Spring Data Cassandra Guide"); + b3.setAuthor("Cassandra Guru"); + b3.setPages(265); + + QueryOptions options = new QueryOptions(); + options.setConsistencyLevel(ConsistencyLevel.ONE); + options.setRetryPolicy(RetryPolicy.DOWNGRADING_CONSISTENCY); + + cassandraTemplate.insert(b3, "book", options); + + /* + * Test Single Insert with entity + */ + Book b4 = new Book(); + b4.setIsbn("123456-4"); + b4.setTitle("Spring Data Cassandra Guide"); + b4.setAuthor("Cassandra Guru"); + b4.setPages(465); + + Map optionsByName = new HashMap(); + optionsByName.put(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL, ConsistencyLevel.ALL); + optionsByName.put(QueryOptions.QueryOptionMapKeys.RETRY_POLICY, RetryPolicy.FALLTHROUGH); + optionsByName.put(QueryOptions.QueryOptionMapKeys.TTL, 30); + + cassandraTemplate.insert(b4, "book", optionsByName); + + /* + * Test Single Insert with entity + */ + Book b5 = new Book(); + b5.setIsbn("123456-5"); + b5.setTitle("Spring Data Cassandra Guide"); + b5.setAuthor("Cassandra Guru"); + b5.setPages(265); + + cassandraTemplate.insert(b5, options); + + /* + * Test Single Insert with entity + */ + Book b6 = new Book(); + b6.setIsbn("123456-6"); + b6.setTitle("Spring Data Cassandra Guide"); + b6.setAuthor("Cassandra Guru"); + b6.setPages(465); + + cassandraTemplate.insert(b6, optionsByName); + + } + + @Test + public void insertAsynchronouslyTest() { + + /* + * Test Single Insert with entity + */ + Book b1 = new Book(); + b1.setIsbn("123456-1"); + b1.setTitle("Spring Data Cassandra Guide"); + b1.setAuthor("Cassandra Guru"); + b1.setPages(521); + + cassandraTemplate.insertAsynchronously(b1); + + Book b2 = new Book(); + b2.setIsbn("123456-2"); + b2.setTitle("Spring Data Cassandra Guide"); + b2.setAuthor("Cassandra Guru"); + b2.setPages(521); + + cassandraTemplate.insertAsynchronously(b2, "book_alt"); + + /* + * Test Single Insert with entity + */ + Book b3 = new Book(); + b3.setIsbn("123456-3"); + b3.setTitle("Spring Data Cassandra Guide"); + b3.setAuthor("Cassandra Guru"); + b3.setPages(265); + + QueryOptions options = new QueryOptions(); + options.setConsistencyLevel(ConsistencyLevel.ONE); + options.setRetryPolicy(RetryPolicy.DOWNGRADING_CONSISTENCY); + + cassandraTemplate.insertAsynchronously(b3, "book", options); + + /* + * Test Single Insert with entity + */ + Book b4 = new Book(); + b4.setIsbn("123456-4"); + b4.setTitle("Spring Data Cassandra Guide"); + b4.setAuthor("Cassandra Guru"); + b4.setPages(465); + + Map optionsByName = new HashMap(); + optionsByName.put(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL, ConsistencyLevel.ALL); + optionsByName.put(QueryOptions.QueryOptionMapKeys.RETRY_POLICY, RetryPolicy.FALLTHROUGH); + optionsByName.put(QueryOptions.QueryOptionMapKeys.TTL, 30); + + cassandraTemplate.insertAsynchronously(b4, "book", optionsByName); + + /* + * Test Single Insert with entity + */ + Book b5 = new Book(); + b5.setIsbn("123456-5"); + b5.setTitle("Spring Data Cassandra Guide"); + b5.setAuthor("Cassandra Guru"); + b5.setPages(265); + + cassandraTemplate.insertAsynchronously(b5, options); + + /* + * Test Single Insert with entity + */ + Book b6 = new Book(); + b6.setIsbn("123456-6"); + b6.setTitle("Spring Data Cassandra Guide"); + b6.setAuthor("Cassandra Guru"); + b6.setPages(465); + + cassandraTemplate.insertAsynchronously(b6, optionsByName); + + } + + @Test + public void insertBatchTest() { + + QueryOptions options = new QueryOptions(); + options.setConsistencyLevel(ConsistencyLevel.ONE); + options.setRetryPolicy(RetryPolicy.DOWNGRADING_CONSISTENCY); + + Map optionsByName = new HashMap(); + optionsByName.put(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL, ConsistencyLevel.ALL); + optionsByName.put(QueryOptions.QueryOptionMapKeys.RETRY_POLICY, RetryPolicy.FALLTHROUGH); + optionsByName.put(QueryOptions.QueryOptionMapKeys.TTL, 30); + + List books = null; + + books = getBookList(20); + + cassandraTemplate.insert(books); + + books = getBookList(20); + + cassandraTemplate.insert(books, "book_alt"); + + books = getBookList(20); + + cassandraTemplate.insert(books, "book", options); + + books = getBookList(20); + + cassandraTemplate.insert(books, "book", optionsByName); + + books = getBookList(20); + + cassandraTemplate.insert(books, options); + + books = getBookList(20); + + cassandraTemplate.insert(books, optionsByName); + + } + + @Test + public void insertBatchAsynchronouslyTest() { + + QueryOptions options = new QueryOptions(); + options.setConsistencyLevel(ConsistencyLevel.ONE); + options.setRetryPolicy(RetryPolicy.DOWNGRADING_CONSISTENCY); + + Map optionsByName = new HashMap(); + optionsByName.put(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL, ConsistencyLevel.ALL); + optionsByName.put(QueryOptions.QueryOptionMapKeys.RETRY_POLICY, RetryPolicy.FALLTHROUGH); + optionsByName.put(QueryOptions.QueryOptionMapKeys.TTL, 30); + + List books = null; + + books = getBookList(20); + + cassandraTemplate.insertAsynchronously(books); + + books = getBookList(20); + + cassandraTemplate.insertAsynchronously(books, "book_alt"); + + books = getBookList(20); + + cassandraTemplate.insertAsynchronously(books, "book", options); + + books = getBookList(20); + + cassandraTemplate.insertAsynchronously(books, "book", optionsByName); + + books = getBookList(20); + + cassandraTemplate.insertAsynchronously(books, options); + + books = getBookList(20); + + cassandraTemplate.insertAsynchronously(books, optionsByName); + + } + + /** + * @return + */ + private List getBookList(int numBooks) { + + List books = new ArrayList(); + + Book b = null; + for (int i = 0; i < numBooks; i++) { + b = new Book(); + b.setIsbn(UUID.randomUUID().toString()); + b.setTitle("Spring Data Cassandra Guide"); + b.setAuthor("Cassandra Guru"); + b.setPages(i * 10 + 5); + books.add(b); + } + + return books; } @After diff --git a/src/test/resources/cql-dataload.cql b/src/test/resources/cql-dataload.cql index f7a2385f5..4c8a0e324 100644 --- a/src/test/resources/cql-dataload.cql +++ b/src/test/resources/cql-dataload.cql @@ -1 +1,2 @@ -create table book (isbn text, title text, author text, pages int, PRIMARY KEY (isbn)); \ No newline at end of file +create table book (isbn text, title text, author text, pages int, PRIMARY KEY (isbn)); +create table book_alt (isbn text, title text, author text, pages int, PRIMARY KEY (isbn)); \ No newline at end of file diff --git a/src/test/resources/org/springframework/data/cassandra/config/CassandraNamespaceTests-context.xml b/src/test/resources/org/springframework/data/cassandra/config/CassandraNamespaceTests-context.xml index 49f4eb07b..d4ad0544a 100644 --- a/src/test/resources/org/springframework/data/cassandra/config/CassandraNamespaceTests-context.xml +++ b/src/test/resources/org/springframework/data/cassandra/config/CassandraNamespaceTests-context.xml @@ -33,11 +33,11 @@ - - - - - + + + + +