wip: Added new methods to CassandraOperations and implemented them in

Template.  You can call all operations (with options/map) without
specifying the table name.
This commit is contained in:
dwebb
2013-11-15 13:39:06 -05:00
parent 10e5241d0c
commit 5ecb711cb2
5 changed files with 539 additions and 11 deletions

View File

@@ -105,6 +105,22 @@ public interface CassandraOperations {
*/
<T> T insert(T entity, String tableName, QueryOptions options);
/**
* @param entity
* @param tableName
* @param options
* @return
*/
<T> T insert(T entity, QueryOptions options);
/**
* @param entity
* @param tableName
* @param options
* @return
*/
<T> T insert(T entity, Map<String, Object> optionsByName);
/**
* @param entity
* @param tableName
@@ -130,6 +146,22 @@ public interface CassandraOperations {
*/
<T> List<T> insert(List<T> entities, String tableName);
/**
* @param entities
* @param tableName
* @param options
* @return
*/
<T> List<T> insert(List<T> entities, QueryOptions options);
/**
* @param entities
* @param tableName
* @param optionsByName
* @return
*/
<T> List<T> insert(List<T> entities, Map<String, Object> optionsByName);
/**
* @param entities
* @param tableName
@@ -160,6 +192,22 @@ public interface CassandraOperations {
*/
<T> T insertAsynchronously(T entity, String tableName);
/**
* @param entity
* @param tableName
* @param options
* @return
*/
<T> T insertAsynchronously(T entity, QueryOptions options);
/**
* @param entity
* @param tableName
* @param optionsByName
* @return
*/
<T> T insertAsynchronously(T entity, Map<String, Object> optionsByName);
/**
* @param entity
* @param tableName
@@ -190,6 +238,22 @@ public interface CassandraOperations {
*/
<T> List<T> insertAsynchronously(List<T> entities, String tableName);
/**
* @param entities
* @param tableName
* @param options
* @return
*/
<T> List<T> insertAsynchronously(List<T> entities, QueryOptions options);
/**
* @param entities
* @param tableName
* @param optionsByName
* @return
*/
<T> List<T> insertAsynchronously(List<T> entities, Map<String, Object> optionsByName);
/**
* @param entities
* @param tableName
@@ -220,6 +284,22 @@ public interface CassandraOperations {
*/
<T> T update(T entity, String tableName);
/**
* @param entity
* @param tableName
* @param options
* @return
*/
<T> T update(T entity, QueryOptions options);
/**
* @param entity
* @param tableName
* @param optionsByName
* @return
*/
<T> T update(T entity, Map<String, Object> optionsByName);
/**
* @param entity
* @param tableName
@@ -250,6 +330,22 @@ public interface CassandraOperations {
*/
<T> List<T> update(List<T> entities, String tableName);
/**
* @param entities
* @param tableName
* @param options
* @return
*/
<T> List<T> update(List<T> entities, QueryOptions options);
/**
* @param entities
* @param tableName
* @param optionsByName
* @return
*/
<T> List<T> update(List<T> entities, Map<String, Object> optionsByName);
/**
* @param entities
* @param tableName
@@ -280,6 +376,22 @@ public interface CassandraOperations {
*/
<T> T updateAsynchronously(T entity, String tableName);
/**
* @param entity
* @param tableName
* @param options
* @return
*/
<T> T updateAsynchronously(T entity, QueryOptions options);
/**
* @param entity
* @param tableName
* @param optionsByName
* @return
*/
<T> T updateAsynchronously(T entity, Map<String, Object> optionsByName);
/**
* @param entity
* @param tableName
@@ -310,6 +422,22 @@ public interface CassandraOperations {
*/
<T> List<T> updateAsynchronously(List<T> entities, String tableName);
/**
* @param entities
* @param tableName
* @param options
* @return
*/
<T> List<T> updateAsynchronously(List<T> entities, QueryOptions options);
/**
* @param entities
* @param tableName
* @param optionsByName
* @return
*/
<T> List<T> updateAsynchronously(List<T> entities, Map<String, Object> optionsByName);
/**
* @param entities
* @param tableName
@@ -341,6 +469,20 @@ public interface CassandraOperations {
*/
<T> void delete(T entity, String tableName);
/**
* @param entity
* @param tableName
* @param options
*/
<T> void delete(T entity, QueryOptions options);
/**
* @param entity
* @param tableName
* @param optionsByName
*/
<T> void delete(T entity, Map<String, Object> optionsByName);
/**
* @param entity
* @param tableName
@@ -370,6 +512,20 @@ public interface CassandraOperations {
*/
<T> void delete(List<T> entities, String tableName);
/**
* @param entities
* @param tableName
* @param options
*/
<T> void delete(List<T> entities, QueryOptions options);
/**
* @param entities
* @param tableName
* @param optionsByName
*/
<T> void delete(List<T> entities, Map<String, Object> optionsByName);
/**
* @param entities
* @param tableName
@@ -391,6 +547,20 @@ public interface CassandraOperations {
*/
<T> void deleteAsychronously(T entity);
/**
* @param entity
* @param tableName
* @param options
*/
<T> void deleteAsychronously(T entity, QueryOptions options);
/**
* @param entity
* @param tableName
* @param optionsByName
*/
<T> void deleteAsychronously(T entity, Map<String, Object> optionsByName);
/**
* @param entity
* @param tableName
@@ -428,6 +598,20 @@ public interface CassandraOperations {
*/
<T> void deleteAsychronously(List<T> entities, String tableName);
/**
* @param entities
* @param tableName
* @param options
*/
<T> void deleteAsychronously(List<T> entities, QueryOptions options);
/**
* @param entities
* @param tableName
* @param optionsByName
*/
<T> void deleteAsychronously(List<T> entities, Map<String, Object> optionsByName);
/**
* @param entities
* @param tableName

View File

@@ -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 <T> void delete(List<T> entities, Map<String, Object> 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 <T> void delete(List<T> 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 <T> void delete(T entity, Map<String, Object> 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 <T> 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 <T> void deleteAsychronously(List<T> entities, Map<String, Object> 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 <T> void deleteAsychronously(List<T> 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 <T> void deleteAsychronously(T entity, Map<String, Object> 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 <T> 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 <T> List<T> insert(List<T> entities, Map<String, Object> 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 <T> List<T> insert(List<T> 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> T insert(T entity, Map<String, Object> 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> 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 <T> List<T> insertAsynchronously(List<T> entities, Map<String, Object> 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 <T> List<T> insertAsynchronously(List<T> 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> T insertAsynchronously(T entity, Map<String, Object> 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> 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 <T> List<T> update(List<T> entities, Map<String, Object> 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 <T> List<T> update(List<T> 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> T update(T entity, Map<String, Object> 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> 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 <T> List<T> updateAsynchronously(List<T> entities, Map<String, Object> 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 <T> List<T> updateAsynchronously(List<T> 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> T updateAsynchronously(T entity, Map<String, Object> 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> 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<T>() {

View File

@@ -19,6 +19,8 @@ import org.springframework.data.cassandra.mapping.RowId;
import org.springframework.data.cassandra.mapping.Table;
/**
* Test POJO
*
* @author David Webb
*
*/

View File

@@ -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<String, Object> optionsByName = new HashMap<String, Object>();
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<String, Object> optionsByName = new HashMap<String, Object>();
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);
}

View File

@@ -1 +1,2 @@
create table book (isbn text, title text, author text, pages int, PRIMARY KEY (isbn));
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));