package me.prettyprint.cassandra.model.thrift; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import me.prettyprint.cassandra.model.AbstractSliceQuery; import me.prettyprint.cassandra.model.CounterRowsImpl; import me.prettyprint.cassandra.model.KeyspaceOperationCallback; 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.CounterRows; import me.prettyprint.hector.api.exceptions.HectorException; import me.prettyprint.hector.api.query.MultigetSliceCounterQuery; import me.prettyprint.hector.api.query.QueryResult; import org.apache.cassandra.thrift.ColumnParent; import org.apache.cassandra.thrift.CounterColumn; /** * A query wrapper for the thrift call multiget_slice */ public final class ThriftMultigetSliceCounterQuery<K, N> extends AbstractSliceQuery<K, N, Long, CounterRows<K, N>> implements MultigetSliceCounterQuery<K, N> { private Iterable<K> keys; public ThriftMultigetSliceCounterQuery(Keyspace k, Serializer<K> keySerializer, Serializer<N> nameSerializer) { super(k, keySerializer, nameSerializer, LongSerializer.get()); } @Override public MultigetSliceCounterQuery<K, N> setKeys(K... keys) { this.keys = Arrays.asList(keys); return this; } @Override public MultigetSliceCounterQuery<K, N> setKeys(Iterable<K> keys) { this.keys = keys; return this; } @Override public QueryResult<CounterRows<K, N>> execute() { Assert.notNull(columnFamilyName, "columnFamilyName can't be null"); Assert.notNull(keys, "keys can't be null"); return new QueryResultImpl<CounterRows<K, N>>(keyspace.doExecute( new KeyspaceOperationCallback<CounterRows<K, N>>() { @Override public CounterRows<K, N> doInKeyspace(KeyspaceService ks) throws HectorException { List<ByteBuffer> keysList = new ArrayList<ByteBuffer>(); for (K k : keys) { keysList.add(keySerializer.toByteBuffer(k)); } ColumnParent columnParent = new ColumnParent(columnFamilyName); Map<K, List<CounterColumn>> thriftRet = keySerializer.fromBytesMap( ks.multigetCounterSlice(keysList, columnParent, getPredicate())); return new CounterRowsImpl<K, N>(thriftRet, columnNameSerializer); } }, consistency), this); } @Override public String toString() { return "MultigetSliceQuery(" + keys + "," + super.toStringInternal() + ")"; } @SuppressWarnings("unchecked") @Override public MultigetSliceCounterQuery<K, N> setColumnNames(N... columnNames) { return (MultigetSliceCounterQuery<K, N>) super.setColumnNames(columnNames); } @SuppressWarnings("unchecked") @Override public MultigetSliceCounterQuery<K, N> setRange(N start, N finish, boolean reversed, int count) { return (MultigetSliceCounterQuery<K, N>) super.setRange(start, finish, reversed, count); } @SuppressWarnings("unchecked") @Override public MultigetSliceCounterQuery<K, N> setColumnFamily(String cf) { return (MultigetSliceCounterQuery<K, N>) super.setColumnFamily(cf); } }