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);
}
}, consistency), 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);
}
}