package me.prettyprint.hector.api;
import static me.prettyprint.hector.api.factory.HFactory.createColumn;
import static me.prettyprint.hector.api.factory.HFactory.createColumnQuery;
import static me.prettyprint.hector.api.factory.HFactory.createCountQuery;
import static me.prettyprint.hector.api.factory.HFactory.createCounterColumn;
import static me.prettyprint.hector.api.factory.HFactory.createCounterColumnQuery;
import static me.prettyprint.hector.api.factory.HFactory.createKeyspace;
import static me.prettyprint.hector.api.factory.HFactory.createMultigetSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.createMultigetSubSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.createMultigetSuperSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.createMutator;
import static me.prettyprint.hector.api.factory.HFactory.createRangeSlicesQuery;
import static me.prettyprint.hector.api.factory.HFactory.createRangeSubSlicesQuery;
import static me.prettyprint.hector.api.factory.HFactory.createRangeSubSlicesCounterQuery;
import static me.prettyprint.hector.api.factory.HFactory.createRangeSuperSlicesQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.createCounterSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.createCounterSuperColumn;
import static me.prettyprint.hector.api.factory.HFactory.createSubColumnQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSubCountQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSubSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSubSliceCounterQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSuperColumn;
import static me.prettyprint.hector.api.factory.HFactory.createSuperColumnQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSuperCountQuery;
import static me.prettyprint.hector.api.factory.HFactory.createSuperSliceQuery;
import static me.prettyprint.hector.api.factory.HFactory.getOrCreateCluster;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import me.prettyprint.cassandra.BaseEmbededServerSetupTest;
import me.prettyprint.cassandra.serializers.StringSerializer;
import me.prettyprint.hector.api.beans.ColumnSlice;
import me.prettyprint.hector.api.beans.CounterRow;
import me.prettyprint.hector.api.beans.CounterSlice;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.beans.HCounterColumn;
import me.prettyprint.hector.api.beans.HCounterSuperColumn;
import me.prettyprint.hector.api.beans.HSuperColumn;
import me.prettyprint.hector.api.beans.OrderedCounterRows;
import me.prettyprint.hector.api.beans.OrderedRows;
import me.prettyprint.hector.api.beans.OrderedSuperRows;
import me.prettyprint.hector.api.beans.Row;
import me.prettyprint.hector.api.beans.Rows;
import me.prettyprint.hector.api.beans.SuperRow;
import me.prettyprint.hector.api.beans.SuperRows;
import me.prettyprint.hector.api.beans.SuperSlice;
import me.prettyprint.hector.api.mutation.MutationResult;
import me.prettyprint.hector.api.mutation.Mutator;
import me.prettyprint.hector.api.query.ColumnQuery;
import me.prettyprint.hector.api.query.CountQuery;
import me.prettyprint.hector.api.query.CounterQuery;
import me.prettyprint.hector.api.query.MultigetSliceQuery;
import me.prettyprint.hector.api.query.MultigetSubSliceQuery;
import me.prettyprint.hector.api.query.MultigetSuperSliceQuery;
import me.prettyprint.hector.api.query.QueryResult;
import me.prettyprint.hector.api.query.RangeSlicesQuery;
import me.prettyprint.hector.api.query.RangeSubSlicesCounterQuery;
import me.prettyprint.hector.api.query.RangeSubSlicesQuery;
import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
import me.prettyprint.hector.api.query.SliceCounterQuery;
import me.prettyprint.hector.api.query.SliceQuery;
import me.prettyprint.hector.api.query.SubColumnQuery;
import me.prettyprint.hector.api.query.SubCountQuery;
import me.prettyprint.hector.api.query.SubSliceCounterQuery;
import me.prettyprint.hector.api.query.SubSliceQuery;
import me.prettyprint.hector.api.query.SuperColumnQuery;
import me.prettyprint.hector.api.query.SuperCountQuery;
import me.prettyprint.hector.api.query.SuperSliceQuery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ApiV2SystemTest extends BaseEmbededServerSetupTest {
static final Logger log = LoggerFactory.getLogger(ApiV2SystemTest.class);
final static String KEYSPACE = "Keyspace1";
final static String COUNTER_CF = "Counter1";
static final StringSerializer se = new StringSerializer();
Cluster cluster;
Keyspace ko;
@Before
public void setupCase() {
cluster = getOrCreateCluster("Test Cluster", "127.0.0.1:9170");
ko = createKeyspace(KEYSPACE, cluster);
}
@After
public void teardownCase() {
ko = null;
cluster = null;
}
@Test
public void testInsertGetRemoveCounter() {
Mutator<String> m = createMutator(ko, se);
MutationResult mr = m.insertCounter("testInsertGetRemoveCounter", COUNTER_CF,
createCounterColumn("testInsertGetRemoveCounter_name", 25));
log.debug("insert execution time: {}", mr.getExecutionTimeMicro());
// get value
CounterQuery<String, String> q = createCounterColumnQuery(ko, se, se);
q.setColumnFamily(COUNTER_CF).
setName("testInsertGetRemoveCounter_name").
setKey("testInsertGetRemoveCounter");
QueryResult<HCounterColumn<String>> r = q.execute();
assertNotNull(r);
HCounterColumn<String> c = r.get();
assertNotNull(c);
Long value = c.getValue();
assertEquals(25, value.longValue());
String name = c.getName();
assertEquals("testInsertGetRemoveCounter_name", name);
assertEquals(q, r.getQuery());
// remove value
m = createMutator(ko, se);
m.deleteCounter("testInsertGetRemoveCounter", COUNTER_CF, "testInsertGetRemoveCounter_name", se);
// get already removed value
CounterQuery<String, String> q2 = createCounterColumnQuery(ko, se, se);
q2.setName("testInsertGetRemoveCounter_name").setColumnFamily(COUNTER_CF);
QueryResult<HCounterColumn<String>> r2 = q2.setKey("testInsertGetRemoveCounter")
.execute();
assertNotNull(r2);
assertNull("Value should have been deleted", r2.get());
}
@Test
public void testCounterMutation() {
// Insert a counter mutation
Mutator<String> m = createMutator(ko, se);
m.addCounter("testCounterMutation",
COUNTER_CF,
createCounterColumn("testCounterMutation_col_name", 5));
m.execute();
// Check the value
assertEquals(new Long(5), readCounterValue("testCounterMutation", COUNTER_CF, "testCounterMutation_col_name"));
// Delete
m = createMutator(ko, se);
m.addCounterDeletion("testCounterMutation", COUNTER_CF);
m.execute();
// Check the value again. IT should be deleted.
assertNull(readCounterValue("testCounterMutation", COUNTER_CF, "testCounterMutation_col_name"));
}
private Long readCounterValue(String key, String cf, String colName) {
CounterQuery<String, String> q = createCounterColumnQuery(ko, se, se);
q.setColumnFamily(cf).setName(colName).setKey(key);
HCounterColumn<String> c = q.execute().get();
if (c == null)
return null;
return c.getValue();
}
@Test
public void testIncrementDecrementCounter() {
createMutator(ko, se).incrementCounter("testIncrementDecrementCounter", COUNTER_CF, "testIncrementDecrementCounter_name", 7);
createMutator(ko, se).decrementCounter("testIncrementDecrementCounter", COUNTER_CF, "testIncrementDecrementCounter_name", 2);
// The total in the counter is 5. (7 - 2)
// get value
CounterQuery<String, String> q = createCounterColumnQuery(ko, se, se);
q.setColumnFamily(COUNTER_CF).setName("testIncrementDecrementCounter_name");
QueryResult<HCounterColumn<String>> r = q.setKey("testIncrementDecrementCounter")
.execute();
assertNotNull(r);
HCounterColumn<String> c = r.get();
assertNotNull(c);
Long value = c.getValue();
assertEquals(5, value.longValue());
}
@Test
public void testInsertGetRemove() {
String cf = "Standard1";
Mutator<String> m = createMutator(ko, se);
MutationResult mr = m.insert(
"testInsertGetRemove",
cf,
createColumn("testInsertGetRemove", "testInsertGetRemove_value_", se,
se));
// Check the mutation result metadata
// assertEquals("127.0.0.1:9170", mr.getHostUsed());
log.debug("insert execution time: {}", mr.getExecutionTimeMicro());
// get value
ColumnQuery<String, String, String> q = createColumnQuery(ko, se, se, se);
q.setName("testInsertGetRemove").setColumnFamily(cf);
QueryResult<HColumn<String, String>> r = q.setKey("testInsertGetRemove")
.execute();
assertNotNull(r);
HColumn<String, String> c = r.get();
assertNotNull(c);
String value = c.getValue();
assertEquals("testInsertGetRemove_value_", value);
String name = c.getName();
assertEquals("testInsertGetRemove", name);
assertEquals(q, r.getQuery());
// remove value
m = createMutator(ko, se);
m.delete("testInsertGetRemove", cf,
"testInsertGetRemove", se);
// get already removed value
ColumnQuery<String, String, String> q2 = createColumnQuery(ko, se, se, se);
q2.setName("testInsertGetRemove").setColumnFamily(cf);
QueryResult<HColumn<String, String>> r2 = q2.setKey("testInsertGetRemove")
.execute();
assertNotNull(r2);
assertNull("Value should have been deleted", r2.get());
}
@Test
public void testBatchInsertGetRemove() {
String cf = "Standard1";
Mutator<String> m = createMutator(ko, se);
for (int i = 0; i < 5; i++) {
m.addInsertion(
"testInsertGetRemove" + i,
cf,
createColumn("testInsertGetRemove", "testInsertGetRemove_value_" + i,
se, se));
}
m.execute();
// get value
ColumnQuery<String, String, String> q = createColumnQuery(ko, se, se, se);
q.setName("testInsertGetRemove").setColumnFamily(cf);
for (int i = 0; i < 5; i++) {
QueryResult<HColumn<String, String>> r = q.setKey(
"testInsertGetRemove" + i).execute();
assertNotNull(r);
HColumn<String, String> c = r.get();
assertNotNull(c);
String value = c.getValue();
assertEquals("testInsertGetRemove_value_" + i, value);
}
// remove value
m = createMutator(ko, se);
for (int i = 0; i < 5; i++) {
m.addDeletion("testInsertGetRemove" + i, cf, "testInsertGetRemove", se);
}
m.execute();
// get already removed value
ColumnQuery<String, String, String> q2 = createColumnQuery(ko, se, se, se);
q2.setName("testInsertGetRemove").setColumnFamily(cf);
for (int i = 0; i < 5; i++) {
QueryResult<HColumn<String, String>> r = q2.setKey(
"testInsertGetRemove" + i).execute();
assertNotNull(r);
assertNull("Value should have been deleted", r.get());
}
}
@Test
public void testSuperInsertGetRemove() {
String cf = "Super1";
Mutator<String> m = createMutator(ko, se);
@SuppressWarnings("unchecked")
// aye, varargs and generics aren't good friends...
List<HColumn<String, String>> columns = Arrays.asList(
createColumn("name1", "value1", se, se),
createColumn("name2", "value2", se, se));
m.insert("testSuperInsertGetRemove", cf,
createSuperColumn("testSuperInsertGetRemove", columns, se, se, se));
// get value
SuperColumnQuery<String, String, String, String> q = createSuperColumnQuery(
ko, se, se, se, se);
q.setSuperName("testSuperInsertGetRemove").setColumnFamily(cf);
QueryResult<HSuperColumn<String, String, String>> r = q.setKey(
"testSuperInsertGetRemove").execute();
assertNotNull(r);
HSuperColumn<String, String, String> sc = r.get();
assertNotNull(sc);
assertEquals(2, sc.getSize());
HColumn<String, String> c = sc.get(0);
String value = c.getValue();
assertEquals("value1", value);
String name = c.getName();
assertEquals("name1", name);
HColumn<String, String> c2 = sc.get(1);
assertEquals("name2", c2.getName());
assertEquals("value2", c2.getValue());
{
Iterator<HColumn<String, String>> it = sc.getColumns().iterator();
while(it.hasNext()){
it.next();
it.remove();
}
assertEquals("The list of columns should be mutable", 0, sc.getColumns().size());
}
// remove value
m = createMutator(ko, se);
m.subDelete("testSuperInsertGetRemove", cf, "testSuperInsertGetRemove",
null, se, se);
// test after removal
r = q.execute();
sc = r.get();
assertNull(sc);
}
@Test
public void testSubColumnQuery() {
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 1,
"testSubColumnQuery", 1, "testSubColumnQuerySuperColumn");
// get value
SubColumnQuery<String, String, String, String> q = createSubColumnQuery(ko,
se, se, se, se);
q.setSuperColumn("testSubColumnQuerySuperColumn0").setColumn("c000")
.setColumnFamily(cf);
QueryResult<HColumn<String, String>> r = q.setKey("testSubColumnQuery0")
.execute();
assertNotNull(r);
HColumn<String, String> c = r.get();
assertNotNull(c);
String value = c.getValue();
assertEquals("v000", value);
String name = c.getName();
assertEquals("c000", name);
// get nonexisting value
q.setColumn("column doesn't exist");
r = q.execute();
assertNotNull(r);
c = r.get();
assertNull(c);
// remove value
deleteColumns(cleanup);
}
@Test
public void testMultigetSliceQuery() {
String cf = "Standard1";
TestCleanupDescriptor cleanup = insertColumns(cf, 4,
"testMultigetSliceQuery", 3, "testMultigetSliceQueryColumn");
// get value
MultigetSliceQuery<String, String, String> q = createMultigetSliceQuery(ko,
se, se, se);
q.setColumnFamily(cf);
q.setKeys("testMultigetSliceQuery1", "testMultigetSliceQuery2");
// try with column name first
q.setColumnNames("testMultigetSliceQueryColumn1",
"testMultigetSliceQueryColumn2");
QueryResult<Rows<String, String, String>> r = q.execute();
assertNotNull(r);
Rows<String, String, String> rows = r.get();
assertNotNull(rows);
assertEquals(2, rows.getCount());
Row<String, String, String> row = rows.getByKey("testMultigetSliceQuery1");
assertNotNull(row);
assertEquals("testMultigetSliceQuery1", row.getKey());
ColumnSlice<String, String> slice = row.getColumnSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals("value11",
slice.getColumnByName("testMultigetSliceQueryColumn1").getValue());
assertEquals("value12",
slice.getColumnByName("testMultigetSliceQueryColumn2").getValue());
assertNull(slice.getColumnByName("testMultigetSliceQueryColumn3"));
// Test slice.getColumns
List<HColumn<String, String>> columns = slice.getColumns();
assertNotNull(columns);
assertEquals(2, columns.size());
// now try with start/finish
q = createMultigetSliceQuery(ko, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testMultigetSliceQuery3");
q.setRange("testMultigetSliceQueryColumn1",
"testMultigetSliceQueryColumn3", false, 100);
r = q.execute();
assertNotNull(r);
rows = r.get();
assertEquals(1, rows.getCount());
for (Row<String, String, String> row2 : rows) {
assertNotNull(row2);
slice = row2.getColumnSlice();
assertNotNull(slice);
for (HColumn<String, String> column : slice.getColumns()) {
if (!column.getName().equals("testMultigetSliceQueryColumn1")
&& !column.getName().equals("testMultigetSliceQueryColumn2")
&& !column.getName().equals("testMultigetSliceQueryColumn3")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
}
}
deleteColumns(cleanup);
}
@Test
public void testSliceQuery() {
String cf = "Standard1";
TestCleanupDescriptor cleanup = insertColumns(cf, 1, "testSliceQuery", 4,
"testSliceQuery");
// get value
SliceQuery<String, String, String> q = createSliceQuery(ko, se, se, se);
q.setColumnFamily(cf);
q.setKey("testSliceQuery0");
// try with column name first
q.setColumnNames("testSliceQuery1", "testSliceQuery2", "testSliceQuery3");
QueryResult<ColumnSlice<String, String>> r = q.execute();
assertNotNull(r);
ColumnSlice<String, String> slice = r.get();
assertNotNull(slice);
assertEquals(3, slice.getColumns().size());
// Test slice.getColumnByName
assertEquals("value01", slice.getColumnByName("testSliceQuery1").getValue());
assertEquals("value02", slice.getColumnByName("testSliceQuery2").getValue());
assertEquals("value03", slice.getColumnByName("testSliceQuery3").getValue());
// Test slice.getColumns
List<HColumn<String, String>> columns = slice.getColumns();
assertNotNull(columns);
assertEquals(3, columns.size());
// now try with start/finish
q = createSliceQuery(ko, se, se, se);
q.setColumnFamily(cf);
q.setKey("testSliceQuery0");
// try reversed this time
q.setRange("testSliceQuery2", "testSliceQuery1", true, 100);
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
assertEquals(2, slice.getColumns().size());
for (HColumn<String, String> column : slice.getColumns()) {
if (!column.getName().equals("testSliceQuery1")
&& !column.getName().equals("testSliceQuery2")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
}
deleteColumns(cleanup);
}
@Test
public void testCounterSliceQuery() {
String cf = "Counter1";
//TestCleanupDescriptor cleanup = insertColumns(cf, 1, "testSliceQuery", 4, "testSliceQuery");
Mutator<String> mutator = createMutator(ko, se);
for (int i = 0; i < 10; i++) {
mutator.addCounter("testCounterSliceQuery_key", cf, createCounterColumn("" + i, i));
}
mutator.execute();
// get value
SliceCounterQuery<String, String> q = createCounterSliceQuery(ko, se, se);
q.setColumnFamily(cf);
q.setKey("testCounterSliceQuery_key");
// try with column name first
q.setColumnNames("4", "5", "6");
QueryResult<CounterSlice<String>> r = q.execute();
assertNotNull(r);
CounterSlice<String> slice = r.get();
assertNotNull(slice);
assertEquals(3, slice.getColumns().size());
// Test slice.getColumnByName
assertEquals(4, slice.getColumnByName("4").getValue().longValue());
assertEquals(5, slice.getColumnByName("5").getValue().longValue());
assertEquals(6, slice.getColumnByName("6").getValue().longValue());
// Test slice.getColumns
List<HCounterColumn<String>> columns = slice.getColumns();
assertNotNull(columns);
assertEquals(3, columns.size());
// Cleanup
mutator.deleteCounter("testCounterSliceQuery_key", cf, null, se);
mutator.execute();
}
@Test
public void testSuperSliceQuery() {
String cf = "Super1";
Mutator<String> m = createMutator(ko, se);
for (int j = 1; j <= 3; ++j) {
@SuppressWarnings("unchecked")
HSuperColumn<String, String, String> sc = createSuperColumn(
"testSuperSliceQuery" + j,
Arrays.asList(createColumn("name", "value", se, se)), se, se, se);
m.addInsertion("testSuperSliceQuery", cf, sc);
}
MutationResult mr = m.execute();
//assertTrue("Time should be > 0", mr.getExecutionTimeMicro() > 0);
log.debug("insert execution time: {}", mr.getExecutionTimeMicro());
// get value
SuperSliceQuery<String, String, String, String> q = createSuperSliceQuery(
ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKey("testSuperSliceQuery");
// try with column name first
q.setColumnNames("testSuperSliceQuery1", "testSuperSliceQuery2",
"testSuperSliceQuery3");
QueryResult<SuperSlice<String, String, String>> r = q.execute();
assertNotNull(r);
SuperSlice<String, String, String> slice = r.get();
assertNotNull(slice);
assertEquals(3, slice.getSuperColumns().size());
// Test slice.getColumnByName
assertEquals("value", slice.getColumnByName("testSuperSliceQuery1")
.getColumns().get(0).getValue());
// now try with start/finish
q = createSuperSliceQuery(ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKey("testSuperSliceQuery");
// try reversed this time
q.setRange("testSuperSliceQuery1", "testSuperSliceQuery2", false, 2);
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
for (HSuperColumn<String, String, String> scolumn : slice.getSuperColumns()) {
if (!scolumn.getName().equals("testSuperSliceQuery1")
&& !scolumn.getName().equals("testSuperSliceQuery2")) {
fail("A columns with unexpected column name returned: "
+ scolumn.getName());
}
}
// Delete values
for (int j = 1; j <= 3; ++j) {
m.addDeletion("testSuperSliceQuery", cf, "testSuperSliceQuery" + j, se);
}
mr = m.execute();
// Test after deletion
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
assertTrue(slice.getSuperColumns().isEmpty());
}
/**
* Tests the SubSliceQuery, a query on columns within a supercolumn
*/
@Test
public void testSubSliceQuery() {
String cf = "Super1";
// insert
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 1,
"testSliceQueryOnSubcolumns", 1, "testSliceQueryOnSubcolumns_column");
// get value
SubSliceQuery<String, String, String, String> q = createSubSliceQuery(ko,
se, se, se, se);
q.setColumnFamily(cf);
q.setSuperColumn("testSliceQueryOnSubcolumns_column0");
q.setKey("testSliceQueryOnSubcolumns0");
// try with column name first
q.setColumnNames("c000", "c110", "c_doesn't_exist");
QueryResult<ColumnSlice<String, String>> r = q.execute();
assertNotNull(r);
ColumnSlice<String, String> slice = r.get();
assertNotNull(slice);
assertEquals(2, slice.getColumns().size());
// Test slice.getColumnByName
assertEquals("v000", slice.getColumnByName("c000").getValue());
// now try with start/finish
q = createSubSliceQuery(ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKey("testSliceQueryOnSubcolumns0");
q.setSuperColumn("testSliceQueryOnSubcolumns_column0");
// try reversed this time
q.setRange("c000", "c110", false, 2);
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
for (HColumn<String, String> column : slice.getColumns()) {
if (!column.getName().equals("c000") && !column.getName().equals("c110")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
}
// Delete values
deleteColumns(cleanup);
// Test after deletion
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
assertTrue(slice.getColumns().isEmpty());
}
/**
* Tests the SubSliceQuery, a query on columns within a supercolumn
*/
@Test
public void testSubSliceCounterQuery() {
String cf = "SuperCounter1";
// insert
TestCleanupDescriptor cleanup = insertSuperCountColumns(cf, 1,
"testSliceCounterQueryOnSubcolumns", 1, "testSliceCounterQueryOnSubcolumns_column");
// get value
SubSliceCounterQuery<String, String, String> q = createSubSliceCounterQuery(ko,
se, se, se);
q.setColumnFamily(cf);
q.setSuperColumn("testSliceCounterQueryOnSubcolumns_column0");
q.setKey("testSliceCounterQueryOnSubcolumns0");
// try with column name first
q.setColumnNames("c000", "c110", "c_doesn't_exist");
QueryResult<CounterSlice<String>> r = q.execute();
assertNotNull(r);
CounterSlice<String> slice = r.get();
assertNotNull(slice);
assertEquals(2, slice.getColumns().size());
// Test slice.getColumnByName
assertEquals(Long.valueOf(0), slice.getColumnByName("c000").getValue());
// now try with start/finish
q = createSubSliceCounterQuery(ko, se, se, se);
q.setColumnFamily(cf);
q.setKey("testSliceCounterQueryOnSubcolumns0");
q.setSuperColumn("testSliceCounterQueryOnSubcolumns_column0");
// try reversed this time
q.setRange("c000", "c110", false, 2);
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
for (HCounterColumn<String> column : slice.getColumns()) {
if (!column.getName().equals("c000") && !column.getName().equals("c110")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
}
// Delete values
deleteColumns(cleanup);
// Test after deletion
r = q.execute();
assertNotNull(r);
slice = r.get();
assertNotNull(slice);
assertTrue(slice.getColumns().isEmpty());
}
@Test
public void testMultigetSuperSliceQuery() {
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 4,
"testSuperMultigetSliceQueryKey", 3, "testSuperMultigetSliceQuery");
// get value
MultigetSuperSliceQuery<String, String, String, String> q = createMultigetSuperSliceQuery(
ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testSuperMultigetSliceQueryKey0",
"testSuperMultigetSliceQueryKey3");
// try with column name first
q.setColumnNames("testSuperMultigetSliceQuery1",
"testSuperMultigetSliceQuery2");
QueryResult<SuperRows<String, String, String, String>> r = q.execute();
assertNotNull(r);
SuperRows<String, String, String, String> rows = r.get();
assertNotNull(rows);
assertEquals(2, rows.getCount());
SuperRow<String, String, String, String> row = rows
.getByKey("testSuperMultigetSliceQueryKey0");
assertNotNull(row);
assertEquals("testSuperMultigetSliceQueryKey0", row.getKey());
SuperSlice<String, String, String> slice = row.getSuperSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals("v001", slice.getColumnByName("testSuperMultigetSliceQuery1")
.getColumns().get(0).getValue());
assertNull(slice.getColumnByName("testSuperMultigetSliceQuery3"));
deleteColumns(cleanup);
}
@Test
public void testMultigetSubSliceQuery() {
String cf = "Super1";
// insert
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 3,
"testMultigetSubSliceQuery", 1, "testMultigetSubSliceQuery");
// get value
MultigetSubSliceQuery<String, String, String, String> q = createMultigetSubSliceQuery(
ko, se, se, se, se);
q.setColumnFamily(cf);
q.setSuperColumn("testMultigetSubSliceQuery0");
q.setKeys("testMultigetSubSliceQuery0", "testMultigetSubSliceQuery2");
// try with column name first
q.setColumnNames("c000", "c110");
QueryResult<Rows<String, String, String>> r = q.execute();
assertNotNull(r);
Rows<String, String, String> rows = r.get();
assertNotNull(rows);
assertEquals(2, rows.getCount());
Row<String, String, String> row = rows
.getByKey("testMultigetSubSliceQuery0");
assertNotNull(row);
assertEquals("testMultigetSubSliceQuery0", row.getKey());
ColumnSlice<String, String> slice = row.getColumnSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals("v000", slice.getColumnByName("c000").getValue());
assertEquals("v100", slice.getColumnByName("c110").getValue());
// Test slice.getColumns
List<HColumn<String, String>> columns = slice.getColumns();
assertNotNull(columns);
assertEquals(2, columns.size());
// now try with start/finish
q = createMultigetSubSliceQuery(ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testMultigetSubSliceQuery0");
q.setSuperColumn("testMultigetSubSliceQuery0");
// try reversed this time
q.setRange("c000", "c110", false, 2);
r = q.execute();
assertNotNull(r);
rows = r.get();
assertEquals(1, rows.getCount());
for (Row<String, String, String> row2 : rows) {
assertNotNull(row2);
slice = row2.getColumnSlice();
assertNotNull(slice);
assertEquals(2, slice.getColumns().size());
for (HColumn<String, String> column : slice.getColumns()) {
if (!column.getName().equals("c000")
&& !column.getName().equals("c110")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
}
}
// Delete values
deleteColumns(cleanup);
}
@Test
public void testRangeSlicesQuery() {
String cf = "Standard1";
TestCleanupDescriptor cleanup = insertColumns(cf, 4,
"testRangeSlicesQuery", 3, "testRangeSlicesQueryColumn");
// get value
RangeSlicesQuery<String, String, String> q = createRangeSlicesQuery(ko, se,
se, se);
q.setColumnFamily(cf);
q.setKeys("testRangeSlicesQuery1", "testRangeSlicesQuery3");
// try with column name first
q.setColumnNames("testRangeSlicesQueryColumn1",
"testRangeSlicesQueryColumn2");
QueryResult<OrderedRows<String, String, String>> r = q.execute();
assertNotNull(r);
OrderedRows<String, String, String> rows = r.get();
assertNotNull(rows);
assertEquals(3, rows.getCount());
Row<String, String, String> row = rows.getList().get(0);
assertNotNull(row);
assertEquals("testRangeSlicesQuery1", row.getKey());
ColumnSlice<String, String> slice = row.getColumnSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals("value11", slice
.getColumnByName("testRangeSlicesQueryColumn1").getValue());
assertEquals("value12", slice
.getColumnByName("testRangeSlicesQueryColumn2").getValue());
assertNull(slice.getColumnByName("testRangeSlicesQueryColumn3"));
// Test slice.getColumns
List<HColumn<String, String>> columns = slice.getColumns();
assertNotNull(columns);
assertEquals(2, columns.size());
// now try with setKeys in combination with setRange
q.setKeys("testRangeSlicesQuery1", "testRangeSlicesQuery5");
q.setRange("testRangeSlicesQueryColumn1", "testRangeSlicesQueryColumn3",
false, 100);
r = q.execute();
assertNotNull(r);
rows = r.get();
assertEquals(3, rows.getCount());
for (Row<String, String, String> row2 : rows) {
assertNotNull(row2);
slice = row2.getColumnSlice();
assertNotNull(slice);
assertEquals(2, slice.getColumns().size());
for (HColumn<String, String> column : slice.getColumns()) {
if (!column.getName().equals("testRangeSlicesQueryColumn1")
&& !column.getName().equals("testRangeSlicesQueryColumn2")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
}
}
// Delete values
deleteColumns(cleanup);
}
@Test
public void testRangeSuperSlicesQuery() {
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 4,
"testRangeSuperSlicesQuery", 3, "testRangeSuperSlicesQuery");
// get value
RangeSuperSlicesQuery<String, String, String, String> q = createRangeSuperSlicesQuery(
ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testRangeSuperSlicesQuery2", "testRangeSuperSlicesQuery3");
// try with column name first
q.setColumnNames("testRangeSuperSlicesQuery1", "testRangeSuperSlicesQuery2");
QueryResult<OrderedSuperRows<String, String, String, String>> r = q
.execute();
assertNotNull(r);
OrderedSuperRows<String, String, String, String> rows = r.get();
assertNotNull(rows);
assertEquals(2, rows.getCount());
SuperRow<String, String, String, String> row = rows.getList().get(0);
assertNotNull(row);
assertEquals("testRangeSuperSlicesQuery2", row.getKey());
SuperSlice<String, String, String> slice = row.getSuperSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals("v021", slice.getColumnByName("testRangeSuperSlicesQuery1")
.get(0).getValue());
assertEquals("v022", slice.getColumnByName("testRangeSuperSlicesQuery2")
.get(0).getValue());
assertNull(slice.getColumnByName("testRangeSuperSlicesQuery3"));
// now try with setKeys in combination with setRange
q.setKeys("testRangeSuperSlicesQuery0", "testRangeSuperSlicesQuery5");
q.setRange("testRangeSuperSlicesQuery1", "testRangeSuperSlicesQuery3",
false, 100);
r = q.execute();
assertNotNull(r);
rows = r.get();
assertEquals(4, rows.getCount());
for (SuperRow<String, String, String, String> row2 : rows) {
assertNotNull(row2);
slice = row2.getSuperSlice();
assertNotNull(slice);
assertEquals(2, slice.getSuperColumns().size());
for (HSuperColumn<String, String, String> column : slice
.getSuperColumns()) {
if (!column.getName().equals("testRangeSuperSlicesQuery1")
&& !column.getName().equals("testRangeSuperSlicesQuery2")) {
fail("A columns with unexpected column name returned: "
+ column.getName());
}
if ( column.getSubColumnByName("c001") != null )
assertEquals("v001",column.getSubColumnByName("c001").getValue());
}
}
{
Iterator<SuperRow<String, String, String, String>> it = rows.getList().iterator();
while(it.hasNext()){
it.next();
it.remove();
}
assertEquals("The list of super rows should be mutable", 0, rows.getList().size());
}
// Delete values
deleteColumns(cleanup);
}
@Test
public void testRangeSuperSlicesQuery_order() {
/*
Test that OrderedSuperRows.getList and OrderedSuperRows..iterator are in the same order
*/
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 4,
"testRangeSuperSlicesQuery", 3, "testRangeSuperSlicesQuery");
// get value
RangeSuperSlicesQuery<String, String, String, String> q = createRangeSuperSlicesQuery(
ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testRangeSuperSlicesQuery0", "testRangeSuperSlicesQuery1");
// try with column name first
q.setColumnNames("testRangeSuperSlicesQuery1", "testRangeSuperSlicesQuery2");
{
QueryResult<OrderedSuperRows<String, String, String, String>> r = q
.execute();
OrderedSuperRows<String, String, String, String> rows = r.get();
assertEquals(2, rows.getCount());
int i = 0;
Iterator<SuperRow<String, String, String, String>> iterator = rows.getList().iterator();
while (iterator.hasNext()) {
SuperRow<String, String, String, String> row = iterator.next();
assertNotNull(row);
assertEquals("testRangeSuperSlicesQuery" + i, row.getKey());
i++;
}
}
{
QueryResult<OrderedSuperRows<String, String, String, String>> r = q.execute();
OrderedSuperRows<String, String, String, String> rows = r.get();
assertEquals(2, rows.getCount());
int i = 0;
Iterator<SuperRow<String, String, String, String>> iterator = rows.iterator();
while (iterator.hasNext()) {
SuperRow<String, String, String, String> row = iterator.next();
assertNotNull(row);
assertEquals("testRangeSuperSlicesQuery" + i, row.getKey());
i++;
}
}
// Delete values
deleteColumns(cleanup);
}
@Test
public void testRangeSubSlicesQuery() {
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 4,
"testRangeSubSlicesQuery", 3, "testRangeSubSlicesQuery");
// get value
RangeSubSlicesQuery<String, String, String, String> q = createRangeSubSlicesQuery(
ko, se, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testRangeSubSlicesQuery2", "testRangeSubSlicesQuery3");
// try with column name first
q.setSuperColumn("testRangeSubSlicesQuery1");
q.setColumnNames("c021", "c111");
QueryResult<OrderedRows<String, String, String>> r = q.execute();
assertNotNull(r);
OrderedRows<String, String, String> rows = r.get();
assertNotNull(rows);
assertEquals(2, rows.getCount());
Row<String, String, String> row = rows.getList().get(0);
assertNotNull(row);
assertEquals("testRangeSubSlicesQuery2", row.getKey());
ColumnSlice<String, String> slice = row.getColumnSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals("v021", slice.getColumnByName("c021").getValue());
assertEquals("v121", slice.getColumnByName("c111").getValue());
assertNull(slice.getColumnByName("c033"));
// Delete values
deleteColumns(cleanup);
}
@Test
public void testRangeSubSlicesCounterQuery() {
String cf = "SuperCounter1";
TestCleanupDescriptor cleanup = insertSuperCountColumns(cf, 4,
"testRangeSubSlicesCounterQuery", 3, "testRangeSubSlicesCounterQuery");
// get value
RangeSubSlicesCounterQuery<String, String, String> q = createRangeSubSlicesCounterQuery(
ko, se, se, se);
q.setColumnFamily(cf);
q.setKeys("testRangeSubSlicesCounterQuery2", "testRangeSubSlicesCounterQuery3");
// try with column name first
q.setSuperColumn("testRangeSubSlicesCounterQuery1");
q.setColumnNames("c021", "c111");
QueryResult<OrderedCounterRows<String, String>> r = q.execute();
assertNotNull(r);
OrderedCounterRows<String, String> rows = r.get();
assertNotNull(rows);
assertEquals(2, rows.getCount());
CounterRow<String, String> row = rows.getList().get(0);
assertNotNull(row);
assertEquals("testRangeSubSlicesCounterQuery2", row.getKey());
CounterSlice<String> slice = row.getColumnSlice();
assertNotNull(slice);
// Test slice.getColumnByName
assertEquals(Long.valueOf(3), slice.getColumnByName("c021").getValue());
assertEquals(Long.valueOf(3), slice.getColumnByName("c111").getValue());
assertNull(slice.getColumnByName("c033"));
// Delete values
deleteColumns(cleanup);
}
@Test
public void testCountQuery() {
String cf = "Standard1";
TestCleanupDescriptor cleanup = insertColumns(cf, 1, "testCountQuery", 10,
"testCountQueryColumn");
CountQuery<String, String> cq = createCountQuery(ko, se, se);
cq.setColumnFamily(cf).setKey("testCountQuery0");
cq.setRange("testCountQueryColumn", "testCountQueryColumn999", 100);
QueryResult<Integer> r = cq.execute();
assertNotNull(r);
assertEquals(Integer.valueOf(10), r.get());
// Delete values
deleteColumns(cleanup);
// Try a non existing row, make sure it gets 0 (not exceptions)
cq = createCountQuery(ko, se, se);
cq.setColumnFamily(cf).setKey("testCountQuery_nonexisting");
cq.setRange("testCountQueryColumn", "testCountQueryColumn999", 100);
r = cq.execute();
assertNotNull(r);
assertEquals(Integer.valueOf(0), r.get());
}
@Test
public void testSuperCountQuery() {
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 1,
"testSuperCountQuery", 11, "testSuperCountQueryColumn");
SuperCountQuery<String, String> cq = createSuperCountQuery(ko, se, se);
cq.setColumnFamily(cf).setKey("testSuperCountQuery0");
cq.setRange("testSuperCountQueryColumn", "testSuperCountQueryColumn999",
100);
QueryResult<Integer> r = cq.execute();
assertNotNull(r);
assertEquals(Integer.valueOf(11), r.get());
// Delete values
deleteColumns(cleanup);
}
@Test
public void testSubCountQuery() {
String cf = "Super1";
TestCleanupDescriptor cleanup = insertSuperColumns(cf, 1,
"testSubCountQuery", 1, "testSubCountQueryColumn");
SubCountQuery<String, String, String> cq = createSubCountQuery(ko, se, se,
se);
cq.setRange("c0", "c3", 100);
QueryResult<Integer> r = cq.setColumnFamily(cf)
.setKey("testSubCountQuery0")
.setSuperColumn("testSubCountQueryColumn0").execute();
assertNotNull(r);
assertEquals(Integer.valueOf(2), r.get());
// Delete values
deleteColumns(cleanup);
}
private void deleteColumns(TestCleanupDescriptor cleanup) {
Mutator<String> m = createMutator(ko, se);
for (int i = 0; i < cleanup.rowCount; ++i) {
for (int j = 0; j < cleanup.columnCount; ++j) {
m.addDeletion(cleanup.rowPrefix + i, cleanup.cf, cleanup.columnsPrefix
+ j, se);
}
}
m.execute();
}
private TestCleanupDescriptor insertSuperColumns(String cf, int rowCount,
String rowPrefix, int scCount, String scPrefix) {
Mutator<String> m = createMutator(ko, se);
for (int i = 0; i < rowCount; ++i) {
for (int j = 0; j < scCount; ++j) {
@SuppressWarnings("unchecked")
HSuperColumn<String, String, String> sc = createSuperColumn(scPrefix
+ j, Arrays.asList(
createColumn("c0" + i + j, "v0" + i + j, se, se),
createColumn("c1" + 1 + j, "v1" + i + j, se, se)), se, se, se);
m.addInsertion(rowPrefix + i, cf, sc);
}
}
m.execute();
return new TestCleanupDescriptor(cf, rowCount, rowPrefix, scCount, scPrefix);
}
private TestCleanupDescriptor insertSuperCountColumns(String cf, int rowCount,
String rowPrefix, int scCount, String scPrefix) {
Mutator<String> m = createMutator(ko, se);
for (int i = 0; i < rowCount; ++i) {
for (int j = 0; j < scCount; ++j) {
@SuppressWarnings("unchecked")
HCounterSuperColumn<String, String> sc = createCounterSuperColumn(scPrefix
+ j, Arrays.asList(
createCounterColumn("c0" + i + j, i + j),
createCounterColumn("c1" + 1 + j, i + j)), se, se);
m.addCounter(rowPrefix + i, cf, sc);
}
}
m.execute();
return new TestCleanupDescriptor(cf, rowCount, rowPrefix, scCount, scPrefix);
}
private TestCleanupDescriptor insertColumns(String cf, int rowCount,
String rowPrefix, int columnCount, String columnPrefix) {
Mutator<String> m = createMutator(ko, se);
for (int i = 0; i < rowCount; ++i) {
for (int j = 0; j < columnCount; ++j) {
m.addInsertion(rowPrefix + i, cf,
createColumn(columnPrefix + j, "value" + i + j, se, se));
}
}
MutationResult mr = m.execute();
//assertTrue("Time should be > 0", mr.getExecutionTimeMicro() > 0);
log.debug("insert execution time: {}", mr.getExecutionTimeMicro());
log.debug(mr.toString());
return new TestCleanupDescriptor(cf, rowCount, rowPrefix, columnCount,
columnPrefix);
}
/**
* A class describing what kind of cleanup is required at the end of the test.
* Just some bookeeping, that's all.
*
* @author Ran Tavory
*
*/
private static class TestCleanupDescriptor {
public final String cf;
public final int rowCount;
public final String rowPrefix;
public final int columnCount;
public final String columnsPrefix;
public TestCleanupDescriptor(String cf, int rowCount, String rowPrefix,
int scCount, String scPrefix) {
this.cf = cf;
this.rowCount = rowCount;
this.rowPrefix = rowPrefix;
columnCount = scCount;
columnsPrefix = scPrefix;
}
}
}