From 5ecb711cb2c051fcd2de1f17ac62b31496454c88 Mon Sep 17 00:00:00 2001 From: dwebb Date: Fri, 15 Nov 2013 13:39:06 -0500 Subject: [PATCH] wip: Added new methods to CassandraOperations and implemented them in Template. You can call all operations (with options/map) without specifying the table name. --- .../cassandra/core/CassandraOperations.java | 184 +++++++++++++ .../cassandra/core/CassandraTemplate.java | 248 +++++++++++++++++- .../data/cassandra/table/Book.java | 2 + .../template/CassandraOperationsTest.java | 113 +++++++- src/test/resources/cql-dataload.cql | 3 +- 5 files changed, 539 insertions(+), 11 deletions(-) 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..2692ccebd 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) */ @@ -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/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/CassandraOperationsTest.java b/src/test/java/org/springframework/data/cassandra/template/CassandraOperationsTest.java index f1de1124b..75f407ef2 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,9 @@ package org.springframework.data.cassandra.template; import static org.junit.Assert.assertNotNull; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.thrift.transport.TTransportException; @@ -39,6 +41,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; @@ -119,19 +124,109 @@ 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 + 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); } 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