package me.prettyprint.cassandra.model.thrift;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import me.prettyprint.cassandra.model.AbstractSliceQuery;
import me.prettyprint.cassandra.model.CounterSuperRowsImpl;
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.CounterSuperRows;
import me.prettyprint.hector.api.exceptions.HectorException;
import me.prettyprint.hector.api.query.MultigetSuperSliceCounterQuery;
import me.prettyprint.hector.api.query.QueryResult;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.CounterSuperColumn;
/**
* A query wrapper for the thrift call multiget_slice for a slice of supercolumns
*
*/
public final class ThriftMultigetSuperSliceCounterQuery<K, SN, N> extends
AbstractSliceQuery<K, SN, Long, CounterSuperRows<K, SN, N>> implements MultigetSuperSliceCounterQuery<K, SN, N> {
private Collection<K> keys;
private final Serializer<N> nameSerializer;
public ThriftMultigetSuperSliceCounterQuery(Keyspace keyspace,
Serializer<K> keySerializer,
Serializer<SN> sNameSerializer,
Serializer<N> nameSerializer) {
super(keyspace, keySerializer, sNameSerializer, LongSerializer.get());
Assert.notNull(nameSerializer, "nameSerializer can't be null");
this.nameSerializer = nameSerializer;
}
@Override
public MultigetSuperSliceCounterQuery<K, SN, N> setKeys(K... keys) {
this.keys = Arrays.asList(keys);
return this;
}
@Override
public MultigetSuperSliceCounterQuery<K, SN, N> setKeys(Collection<K> keys) {
this.keys = keys;
return this;
}
@Override
public QueryResult<CounterSuperRows<K, SN, N>> execute() {
return new QueryResultImpl<CounterSuperRows<K, SN, N>>(
keyspace.doExecute(new KeyspaceOperationCallback<CounterSuperRows<K, SN, N>>() {
@Override
public CounterSuperRows<K, SN, N> doInKeyspace(KeyspaceService ks) throws HectorException {
List<K> keysList = new ArrayList<K>();
keysList.addAll(keys);
ColumnParent columnParent = new ColumnParent(columnFamilyName);
Map<K, List<CounterSuperColumn>> thriftRet = keySerializer.fromBytesMap(ks.multigetCounterSuperSlice(
keySerializer.toBytesList(keysList), columnParent, getPredicate()));
return new CounterSuperRowsImpl<K, SN, N>(thriftRet, keySerializer, columnNameSerializer,
nameSerializer);
}
}, consistency), this);
}
@Override
public String toString() {
return "MultigetSuperSliceQuery(" + keys + "," + super.toStringInternal() + ")";
}
@SuppressWarnings("unchecked")
@Override
public MultigetSuperSliceCounterQuery<K, SN, N> setRange(SN start, SN finish, boolean reversed, int count) {
return (MultigetSuperSliceCounterQuery<K, SN, N>) super.setRange(start, finish, reversed, count);
}
@SuppressWarnings("unchecked")
@Override
public MultigetSuperSliceCounterQuery<K, SN, N> setColumnNames(SN... columnNames) {
return (MultigetSuperSliceCounterQuery<K, SN, N>) super.setColumnNames(columnNames);
}
@SuppressWarnings("unchecked")
@Override
public MultigetSuperSliceCounterQuery<K, SN, N> setColumnNames(Collection<SN> columnNames) {
return (MultigetSuperSliceCounterQuery<K, SN, N>) super.setColumnNames(columnNames);
}
@SuppressWarnings("unchecked")
@Override
public MultigetSuperSliceCounterQuery<K, SN, N> setColumnFamily(String cf) {
return (MultigetSuperSliceCounterQuery<K, SN, N>) super.setColumnFamily(cf);
}
}