package me.prettyprint.cassandra.service.template;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;
import me.prettyprint.cassandra.serializers.DateSerializer;
import me.prettyprint.cassandra.serializers.LongSerializer;
import me.prettyprint.hector.api.beans.HColumn;
import org.apache.cassandra.thrift.IndexOperator;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
public class ColumnFamilyTemplateTest extends BaseColumnFamilyTemplateTest {
@Test
public void testCreateSelect() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("key1");
updater.setString("column1","value1");
template.update(updater);
template.addColumn("column1", se);
ColumnFamilyResult<String,String> wrapper = template.queryColumns("key1");
assertEquals("value1",wrapper.getString("column1"));
}
@Test
public void testCreateSelectMultiColumn() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("cskey1");
updater.setString("stringval","value1");
Date date = new Date();
updater.setDate("curdate", date);
updater.setLong("longval", 5L);
template.update(updater);
template.addColumn("stringval", se);
template.addColumn("curdate", DateSerializer.get());
template.addColumn("longval", LongSerializer.get());
ColumnFamilyResult<String,String> wrapper = template.queryColumns("cskey1");
assertEquals("value1",wrapper.getString("stringval"));
assertEquals(date,wrapper.getDate("curdate"));
assertEquals(new Long(5),wrapper.getLong("longval"));
assertEquals(3,wrapper.getColumnNames().size());
}
@Test
public void testCreateSelectSpecifiedColumn() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("csskey1");
updater.setString("col1","value1");
updater.setString("col2","value2");
updater.setString("col3","value3");
updater.setString("col4","value4");
updater.setString("col5","value5");
template.update(updater);
template.addColumn("stringval", se);
template.addColumn("curdate", DateSerializer.get());
template.addColumn("longval", LongSerializer.get());
ColumnFamilyResult<String,String> wrapper = template.queryColumns("csskey1", Arrays.asList("col1", "col3", "col5"));
assertEquals("value1",wrapper.getString("col1"));
assertNull(wrapper.getString("col2"));
assertEquals("value3",wrapper.getString("col3"));
assertNull(wrapper.getString("col4"));
assertEquals("value5",wrapper.getString("col5"));
assertEquals(3,wrapper.getColumnNames().size());
}
@Test
public void testCompareClocks() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
long ts1 = 1001;
long ts2 = 1002;
long ts3 = 1003;
ColumnFamilyUpdater<String,String> updater = template.createUpdater("compare_clock_key1");
updater.setClock(ts1);
updater.setString("stringval","value1");
Date date = new Date();
updater.setClock(ts2);
updater.setDate("curdate", date);
updater.setClock(ts3);
updater.setLong("longval", 5L);
template.update(updater);
template.addColumn("stringval", se);
template.addColumn("curdate", DateSerializer.get());
template.addColumn("longval", LongSerializer.get());
ColumnFamilyResult wrapper = template.queryColumns("compare_clock_key1");
assertEquals(ts1,wrapper.getColumn("stringval").getClock());
assertEquals(ts2,wrapper.getColumn("curdate").getClock());
assertEquals(ts3,wrapper.getColumn("longval").getClock());
assertEquals(3,wrapper.getColumnNames().size());
}
@Test
public void testTtl() throws InterruptedException {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace,"Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("test_ttl_key1");
updater.setString("expired_string", "value1",1);
updater.setString("unexpired_string", "value2");
updater.setBoolean("unexpired_bool", true);
updater.setBoolean("expired_bool", true, 1);
template.update(updater);
Thread.sleep(1000);
ColumnFamilyResult<String,String> wrapper = template.queryColumns("test_ttl_key1");
HColumn<String,ByteBuffer> col = wrapper.getColumn("unexpired_string");
assertNotNull(col);
assertNotNull(col.getValue());
HColumn<String,ByteBuffer> expiredStringCol = wrapper.getColumn("expired_string");
assertNull(expiredStringCol);
HColumn<String,ByteBuffer> expiredBooleanCol = wrapper.getColumn("expired_bool");
assertNull(expiredBooleanCol);
}
@Test
public void testCreateSelectTemplate() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("key1");
updater.setString("column1","value1");
template.update(updater);
template.setCount(10);
String value = template.queryColumns("key1", new ColumnFamilyRowMapper<String, String, String>() {
@Override
public String mapRow(ColumnFamilyResult<String, String> results) {
// TODO Auto-generated method stub
return results.getString("column1");
}
});
assertEquals("value1",value);
}
@Test
public void testOverloadedMapRowCallback() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("key1");
updater.setString("column1","value1");
updater.addKey("key2");
updater.setString("column1", "value2");
template.update(updater);
template.setCount(10);
MappedColumnFamilyResult<String,String,String> result = template.queryColumns(Arrays.asList("key1","key2"), new ColumnFamilyRowMapper<String, String, String>() {
@Override
public String mapRow(ColumnFamilyResult<String, String> results) {
return results.getString("column1");
}
});
assertEquals("key1",result.getKey());
assertEquals("value1", result.getRow());
result.next();
assertEquals("key2",result.getKey());
assertEquals("value2", result.getRow());
}
@Test
public void testQueryMultiget() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("mg_key1");
updater.setString("column1","value1");
updater.addKey("mg_key2");
updater.setString("column1","value2");
updater.addKey("mg_key3");
updater.setString("column1","value3");
template.update(updater);
template.addColumn("column1", se);
ColumnFamilyResult<String,String> wrapper = template.queryColumns(Arrays.asList("mg_key1", "mg_key2", "mg_key3"));
assertEquals("value1",wrapper.getString("column1"));
wrapper.next();
assertEquals("value2",wrapper.getString("column1"));
wrapper.next();
assertEquals("value3",wrapper.getString("column1"));
}
@Test
public void testQueryMultigetSpecificColumns() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("mgs_key1");
updater.setString("column1","value1-1");
updater.setString("column2","value2-1");
updater.setString("column3","value3-1");
updater.addKey("mgs_key2");
updater.setString("column1","value1-2");
updater.setString("column2","value2-2");
updater.setString("column3","value3-2");
updater.addKey("mgs_key3");
updater.setString("column1","value1-3");
updater.setString("column2","value2-3");
updater.setString("column3","value3-3");
template.update(updater);
template.addColumn("column1", se);
template.addColumn("column2", se);
template.addColumn("column3", se);
ColumnFamilyResult<String,String> wrapper = template.queryColumns(Arrays.asList("mgs_key1", "mgs_key2", "mgs_key3"), Arrays.asList("column1", "column3"));
assertEquals("value1-1",wrapper.getString("column1"));
assertNull(wrapper.getString("column2"));
assertEquals("value3-1",wrapper.getString("column3"));
wrapper.next();
assertEquals("value1-2",wrapper.getString("column1"));
assertNull(wrapper.getString("column2"));
assertEquals("value3-2",wrapper.getString("column3"));
wrapper.next();
assertEquals("value1-3",wrapper.getString("column1"));
assertNull(wrapper.getString("column2"));
assertEquals("value3-3",wrapper.getString("column3"));
}
@Test
public void testHasNoResults() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
assertFalse(template.queryColumns("noresults").hasResults());
assertFalse(template.queryColumns("noresults").hasNext());
assertEquals("noresults",template.queryColumns("noresults").getKey());
}
@Test
public void testGetKeyTwiceCall() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyResult<String, String> results = template.queryColumns("noresults");
assertEquals("noresults",results.getKey());
assertEquals("noresults",results.getKey());
assertEquals("noresults",results.getKey());
}
@Test
public void testQueryIndexedSlices() {
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Indexed1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("index_key1");
updater.setLong("birthyear", 1974L);
updater.setLong("birthmonth", 4L);
updater.addKey("index_key2");
updater.setLong("birthyear", 1975L);
updater.setLong("birthmonth", 4L);
updater.addKey("index_key3");
updater.setLong("birthyear", 1975L);
updater.setLong("birthmonth", 5L);
updater.addKey("index_key4");
updater.setLong("birthyear", 1975L);
updater.setLong("birthmonth", 6L);
updater.addKey("index_key5");
updater.setLong("birthyear", 1975L);
updater.setLong("birthmonth", 7L);
updater.addKey("index_key6");
updater.setLong("birthyear", 1976L);
updater.setLong("birthmonth", 6L);
template.update(updater);
IndexedSlicesPredicate<String, String, Long> predicate =
new IndexedSlicesPredicate<String, String, Long>(se, se, LongSerializer.get());
predicate.startKey("");
predicate.addExpression("birthyear", IndexOperator.EQ, 1975L);
ColumnFamilyResult<String, String> result =
template.queryColumns(predicate);
int cnt = result.getColumnNames().size();
while (result.hasNext()) {
cnt += result.next().getColumnNames().size();
}
assertEquals(8, cnt);
result =
template.queryColumns(predicate, Arrays.asList(new String[]{"birthmonth"}));
cnt = result.getColumnNames().size();
while (result.hasNext()) {
cnt += result.next().getColumnNames().size();
}
assertEquals(4, cnt);
}
@Test
public void testColumnValueTypes() {
final float EPSILON = 0.0000001f;
ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(keyspace, "Standard1", se, se);
ColumnFamilyUpdater<String,String> updater = template.createUpdater("key1");
updater.setString("column1","string value");
updater.setUUID("column2", UUID.fromString("cf316d50-f7c0-11e1-a21f-0800200c9a66"));
updater.setLong("column3", 829398278497234L);
updater.setInteger("column4", 27344);
updater.setFloat("column5",3.14159265f);
updater.setDouble("column6",3.14159265358979323846264338327950288);
updater.setBoolean("column7", true);
updater.setByteArray("column8", new byte[] {97, 91, 99});
Date date = new Date();
updater.setDate("column9", date);
template.update(updater);
ColumnFamilyResult<String,String> wrapper = template.queryColumns("key1");
assertEquals("string value",wrapper.getString("column1"));
assertEquals(UUID.fromString("cf316d50-f7c0-11e1-a21f-0800200c9a66"), wrapper.getUUID("column2"));
assertEquals(Long.valueOf(829398278497234L), wrapper.getLong("column3"));
assertEquals(Integer.valueOf(27344), wrapper.getInteger("column4"));
assertEquals(3.14159265f,wrapper.getFloat("column5"), EPSILON);
assertEquals(3.14159265358979323846264338327950288, wrapper.getDouble("column6"), EPSILON);
assertEquals(true, wrapper.getBoolean("column7"));
assertArrayEquals(new byte[] {97, 91, 99}, wrapper.getByteArray("column8"));
assertEquals(date, wrapper.getDate("column9"));
assertEquals(9, wrapper.getColumnNames().size());
}
}