Skip to content

Commit

Permalink
Add support for RangeSubSlicesCounterQuery
Browse files Browse the repository at this point in the history
  • Loading branch information
hibnico committed Jan 26, 2012
1 parent f977122 commit ab56b5f
Show file tree
Hide file tree
Showing 4 changed files with 185 additions and 0 deletions.
@@ -0,0 +1,111 @@
package me.prettyprint.cassandra.model.thrift;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import me.prettyprint.cassandra.model.AbstractSliceQuery;
import me.prettyprint.cassandra.model.HKeyRange;
import me.prettyprint.cassandra.model.KeyspaceOperationCallback;
import me.prettyprint.cassandra.model.OrderedCounterRowsImpl;
import me.prettyprint.cassandra.model.OrderedRowsImpl;
import me.prettyprint.cassandra.model.QueryResultImpl;
import me.prettyprint.cassandra.serializers.LongSerializer;
import me.prettyprint.cassandra.service.KeyspaceService;
import me.prettyprint.cassandra.utils.Assert;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.beans.OrderedCounterRows;
import me.prettyprint.hector.api.beans.OrderedRows;
import me.prettyprint.hector.api.exceptions.HectorException;
import me.prettyprint.hector.api.query.QueryResult;
import me.prettyprint.hector.api.query.RangeSubSlicesCounterQuery;
import me.prettyprint.hector.api.query.RangeSubSlicesQuery;

import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.CounterColumn;

/**
* A query for the thrift call get_range_slices for subcolumns of supercolumns
*
* @author Ran Tavory
*
*/
public final class ThriftRangeSubSlicesCounterQuery<K,SN,N> extends AbstractSliceQuery<K,N,Long,OrderedCounterRows<K,N>>
implements RangeSubSlicesCounterQuery<K, SN, N>{

private final Serializer<SN> sNameSerializer;
private final HKeyRange<K> keyRange;
private SN superColumn;

public ThriftRangeSubSlicesCounterQuery(Keyspace k, Serializer<K> keySerializer, Serializer<SN> sNameSerializer,
Serializer<N> nameSerializer) {
super(k, keySerializer, nameSerializer, LongSerializer.get());
Assert.notNull(sNameSerializer, "sNameSerializer cannot be null");
this.sNameSerializer = sNameSerializer;
keyRange = new HKeyRange<K>(keySerializer);
}


@Override
public RangeSubSlicesCounterQuery<K,SN,N> setKeys(K start, K end) {
keyRange.setKeys(start, end);
return this;
}

@Override
public RangeSubSlicesCounterQuery<K,SN,N> setRowCount(int rowCount) {
keyRange.setRowCount(rowCount);
return this;
}

@Override
public RangeSubSlicesCounterQuery<K,SN,N> setSuperColumn(SN sc) {
Assert.notNull(sc, "sc can't be null");
superColumn = sc;
return this;
}

@Override
public QueryResult<OrderedCounterRows<K,N>> execute() {
Assert.notNull(columnFamilyName, "columnFamilyName can't be null");
Assert.notNull(superColumn, "superColumn cannot be null");

return new QueryResultImpl<OrderedCounterRows<K,N>>(keyspace.doExecute(
new KeyspaceOperationCallback<OrderedCounterRows<K,N>>() {
@Override
public OrderedCounterRows<K,N> doInKeyspace(KeyspaceService ks) throws HectorException {
ColumnParent columnParent = new ColumnParent(columnFamilyName);
columnParent.setSuper_column(sNameSerializer.toByteBuffer(superColumn));
Map<K, List<CounterColumn>> thriftRet = keySerializer.fromBytesMap(
ks.getRangeCounterSlices(columnParent, getPredicate(), keyRange.toThrift()));
return new OrderedCounterRowsImpl<K,N>((LinkedHashMap<K, List<CounterColumn>>) thriftRet, columnNameSerializer);
}
}), this);
}

@Override
public String toString() {
return "RangeSubSlicesCounterQuery(" + keyRange + super.toStringInternal() + ")";
}

@SuppressWarnings("unchecked")
@Override
public RangeSubSlicesCounterQuery<K, SN, N> setColumnNames(N... columnNames) {
return (RangeSubSlicesCounterQuery<K, SN, N>) super.setColumnNames(columnNames);
}

@SuppressWarnings("unchecked")
@Override
public RangeSubSlicesCounterQuery<K, SN, N> setRange(N start, N finish, boolean reversed, int count) {
return (RangeSubSlicesCounterQuery<K, SN, N>) super.setRange(start, finish, reversed, count);
}

@SuppressWarnings("unchecked")
@Override
public RangeSubSlicesCounterQuery<K, SN, N> setColumnFamily(String cf) {
return (RangeSubSlicesCounterQuery<K, SN, N>) super.setColumnFamily(cf);
}

}
Expand Up @@ -23,6 +23,7 @@
import me.prettyprint.cassandra.model.thrift.ThriftMultigetSuperSliceQuery;
import me.prettyprint.cassandra.model.thrift.ThriftRangeSlicesCounterQuery;
import me.prettyprint.cassandra.model.thrift.ThriftRangeSlicesQuery;
import me.prettyprint.cassandra.model.thrift.ThriftRangeSubSlicesCounterQuery;
import me.prettyprint.cassandra.model.thrift.ThriftRangeSubSlicesQuery;
import me.prettyprint.cassandra.model.thrift.ThriftRangeSuperSlicesCounterQuery;
import me.prettyprint.cassandra.model.thrift.ThriftRangeSuperSlicesQuery;
Expand Down Expand Up @@ -71,6 +72,7 @@
import me.prettyprint.hector.api.query.MultigetSuperSliceQuery;
import me.prettyprint.hector.api.query.RangeSlicesCounterQuery;
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.RangeSuperSlicesCounterQuery;
import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
Expand Down Expand Up @@ -486,6 +488,13 @@ public static <K, SN, N, V> RangeSubSlicesQuery<K, SN, N, V> createRangeSubSlice
sNameSerializer, nameSerializer, valueSerializer);
}

public static <K, SN, N> RangeSubSlicesCounterQuery<K, SN, N> createRangeSubSlicesCounterQuery(
Keyspace keyspace, Serializer<K> keySerializer,
Serializer<SN> sNameSerializer, Serializer<N> nameSerializer) {
return new ThriftRangeSubSlicesCounterQuery<K, SN, N>(keyspace, keySerializer,
sNameSerializer, nameSerializer);
}

public static <K, N, V> SliceQuery<K, N, V> createSliceQuery(
Keyspace keyspace, Serializer<K> keySerializer,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
Expand Down
@@ -0,0 +1,27 @@
package me.prettyprint.hector.api.query;

import java.util.Collection;

import me.prettyprint.hector.api.beans.OrderedCounterRows;

/**
* A query for the call get_range_slices on subcolumns of a supercolumns.
*
*/
public interface RangeSubSlicesCounterQuery<K, SN, N> extends Query<OrderedCounterRows<K, N>> {

RangeSubSlicesCounterQuery<K, SN, N> setKeys(K start, K end);

RangeSubSlicesCounterQuery<K, SN, N> setRowCount(int rowCount);

RangeSubSlicesCounterQuery<K, SN, N> setSuperColumn(SN superColumn);

RangeSubSlicesCounterQuery<K, SN, N> setColumnNames(N... columnNames);

RangeSubSlicesCounterQuery<K, SN, N> setRange(N start, N finish, boolean reversed, int count);

RangeSubSlicesCounterQuery<K, SN, N> setColumnFamily(String cf);

Collection<N> getColumnNames();

}
38 changes: 38 additions & 0 deletions core/src/test/java/me/prettyprint/hector/api/ApiV2SystemTest.java
Expand Up @@ -12,6 +12,7 @@
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;
Expand All @@ -38,11 +39,13 @@
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;
Expand All @@ -60,6 +63,7 @@
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;
Expand Down Expand Up @@ -1020,6 +1024,40 @@ public void testRangeSubSlicesQuery() {
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";
Expand Down

0 comments on commit ab56b5f

Please sign in to comment.