diff --git a/core/src/main/java/me/prettyprint/cassandra/model/thrift/ThriftRangeSubSlicesCounterQuery.java b/core/src/main/java/me/prettyprint/cassandra/model/thrift/ThriftRangeSubSlicesCounterQuery.java new file mode 100644 index 000000000..bf60edd2b --- /dev/null +++ b/core/src/main/java/me/prettyprint/cassandra/model/thrift/ThriftRangeSubSlicesCounterQuery.java @@ -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 extends AbstractSliceQuery> + implements RangeSubSlicesCounterQuery{ + + private final Serializer sNameSerializer; + private final HKeyRange keyRange; + private SN superColumn; + + public ThriftRangeSubSlicesCounterQuery(Keyspace k, Serializer keySerializer, Serializer sNameSerializer, + Serializer nameSerializer) { + super(k, keySerializer, nameSerializer, LongSerializer.get()); + Assert.notNull(sNameSerializer, "sNameSerializer cannot be null"); + this.sNameSerializer = sNameSerializer; + keyRange = new HKeyRange(keySerializer); + } + + + @Override + public RangeSubSlicesCounterQuery setKeys(K start, K end) { + keyRange.setKeys(start, end); + return this; + } + + @Override + public RangeSubSlicesCounterQuery setRowCount(int rowCount) { + keyRange.setRowCount(rowCount); + return this; + } + + @Override + public RangeSubSlicesCounterQuery setSuperColumn(SN sc) { + Assert.notNull(sc, "sc can't be null"); + superColumn = sc; + return this; + } + + @Override + public QueryResult> execute() { + Assert.notNull(columnFamilyName, "columnFamilyName can't be null"); + Assert.notNull(superColumn, "superColumn cannot be null"); + + return new QueryResultImpl>(keyspace.doExecute( + new KeyspaceOperationCallback>() { + @Override + public OrderedCounterRows doInKeyspace(KeyspaceService ks) throws HectorException { + ColumnParent columnParent = new ColumnParent(columnFamilyName); + columnParent.setSuper_column(sNameSerializer.toByteBuffer(superColumn)); + Map> thriftRet = keySerializer.fromBytesMap( + ks.getRangeCounterSlices(columnParent, getPredicate(), keyRange.toThrift())); + return new OrderedCounterRowsImpl((LinkedHashMap>) thriftRet, columnNameSerializer); + } + }), this); + } + + @Override + public String toString() { + return "RangeSubSlicesCounterQuery(" + keyRange + super.toStringInternal() + ")"; + } + + @SuppressWarnings("unchecked") + @Override + public RangeSubSlicesCounterQuery setColumnNames(N... columnNames) { + return (RangeSubSlicesCounterQuery) super.setColumnNames(columnNames); + } + + @SuppressWarnings("unchecked") + @Override + public RangeSubSlicesCounterQuery setRange(N start, N finish, boolean reversed, int count) { + return (RangeSubSlicesCounterQuery) super.setRange(start, finish, reversed, count); + } + + @SuppressWarnings("unchecked") + @Override + public RangeSubSlicesCounterQuery setColumnFamily(String cf) { + return (RangeSubSlicesCounterQuery) super.setColumnFamily(cf); + } + +} diff --git a/core/src/main/java/me/prettyprint/hector/api/factory/HFactory.java b/core/src/main/java/me/prettyprint/hector/api/factory/HFactory.java index 9e11575f0..7d24811f5 100644 --- a/core/src/main/java/me/prettyprint/hector/api/factory/HFactory.java +++ b/core/src/main/java/me/prettyprint/hector/api/factory/HFactory.java @@ -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; @@ -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; @@ -486,6 +488,13 @@ public static RangeSubSlicesQuery createRangeSubSlice sNameSerializer, nameSerializer, valueSerializer); } + public static RangeSubSlicesCounterQuery createRangeSubSlicesCounterQuery( + Keyspace keyspace, Serializer keySerializer, + Serializer sNameSerializer, Serializer nameSerializer) { + return new ThriftRangeSubSlicesCounterQuery(keyspace, keySerializer, + sNameSerializer, nameSerializer); + } + public static SliceQuery createSliceQuery( Keyspace keyspace, Serializer keySerializer, Serializer nameSerializer, Serializer valueSerializer) { diff --git a/core/src/main/java/me/prettyprint/hector/api/query/RangeSubSlicesCounterQuery.java b/core/src/main/java/me/prettyprint/hector/api/query/RangeSubSlicesCounterQuery.java new file mode 100644 index 000000000..735b52846 --- /dev/null +++ b/core/src/main/java/me/prettyprint/hector/api/query/RangeSubSlicesCounterQuery.java @@ -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 extends Query> { + + RangeSubSlicesCounterQuery setKeys(K start, K end); + + RangeSubSlicesCounterQuery setRowCount(int rowCount); + + RangeSubSlicesCounterQuery setSuperColumn(SN superColumn); + + RangeSubSlicesCounterQuery setColumnNames(N... columnNames); + + RangeSubSlicesCounterQuery setRange(N start, N finish, boolean reversed, int count); + + RangeSubSlicesCounterQuery setColumnFamily(String cf); + + Collection getColumnNames(); + +} \ No newline at end of file diff --git a/core/src/test/java/me/prettyprint/hector/api/ApiV2SystemTest.java b/core/src/test/java/me/prettyprint/hector/api/ApiV2SystemTest.java index 3aeae8d2e..b8855b596 100644 --- a/core/src/test/java/me/prettyprint/hector/api/ApiV2SystemTest.java +++ b/core/src/test/java/me/prettyprint/hector/api/ApiV2SystemTest.java @@ -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; @@ -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; @@ -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; @@ -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 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> r = q.execute(); + assertNotNull(r); + OrderedCounterRows rows = r.get(); + assertNotNull(rows); + assertEquals(2, rows.getCount()); + CounterRow row = rows.getList().get(0); + assertNotNull(row); + assertEquals("testRangeSubSlicesCounterQuery2", row.getKey()); + CounterSlice 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";