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.KeyspaceOperationCallback;
import me.prettyprint.cassandra.model.QueryResultImpl;
import me.prettyprint.cassandra.model.RowsImpl;
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.Rows;
import me.prettyprint.hector.api.exceptions.HectorException;
import me.prettyprint.hector.api.query.MultigetSubSliceQuery;
import me.prettyprint.hector.api.query.QueryResult;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnParent;
/**
* A query wrapper for the thrift call multiget_slice for subcolumns of supercolumns
*/
public final class ThriftMultigetSubSliceQuery<K, SN, N, V> extends AbstractSliceQuery<K, N, V, Rows<K, N, V>>
implements MultigetSubSliceQuery<K, SN, N, V> {
private Collection<K> keys;
private final Serializer<SN> sNameSerializer;
private SN superColumn;
public ThriftMultigetSubSliceQuery(Keyspace k, Serializer<K> keySerializer, Serializer<SN> sNameSerializer,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
super(k, keySerializer, nameSerializer, valueSerializer);
Assert.notNull(nameSerializer, "sNameSerializer can't be null");
this.sNameSerializer = sNameSerializer;
}
@Override
public MultigetSubSliceQuery<K, SN, N, V> setKeys(K... keys) {
this.keys = Arrays.asList(keys);
return this;
}
@Override
public MultigetSubSliceQuery<K, SN, N, V> setKeys(Collection<K> keys) {
this.keys = keys;
return this;
}
/**
* Set the supercolumn to run the slice query on
*/
@Override
public MultigetSubSliceQuery<K,SN,N,V> setSuperColumn(SN superColumn) {
Assert.notNull(superColumn, "supercolumn may not be null");
this.superColumn = superColumn;
return this;
}
@Override
public QueryResult<Rows<K, N, V>> execute() {
Assert.noneNull(keys, "Keys cannot be null");
Assert.noneNull(columnFamilyName, "columnFamilyName cannot be null");
Assert.noneNull(superColumn, "superColumn cannot be null");
return new QueryResultImpl<Rows<K, N, V>>(
keyspace.doExecute(new KeyspaceOperationCallback<Rows<K, N, V>>() {
@Override
public Rows<K, N, V> doInKeyspace(KeyspaceService ks) throws HectorException {
List<K> keysList = new ArrayList<K>();
keysList.addAll(keys);
ColumnParent columnParent = new ColumnParent(columnFamilyName);
columnParent.setSuper_column(sNameSerializer.toByteBuffer(superColumn));
Map<K, List<Column>> thriftRet = keySerializer.fromBytesMap(ks.multigetSlice(
keySerializer.toBytesList(keysList), columnParent, getPredicate()));
return new RowsImpl<K, N, V>(thriftRet, columnNameSerializer, valueSerializer);
}
}, consistency), this);
}
@Override
public String toString() {
return "MultigetSubSliceQuery(" + superColumn + "," + keys + "," + super.toStringInternal()
+ ")";
}
@SuppressWarnings("unchecked")
@Override
public MultigetSubSliceQuery<K, SN, N, V> setColumnFamily(String cf) {
return (MultigetSubSliceQuery<K, SN, N, V>) super.setColumnFamily(cf);
}
@SuppressWarnings("unchecked")
@Override
public MultigetSubSliceQuery<K, SN, N, V> setRange(N start, N finish, boolean reversed, int count) {
return (MultigetSubSliceQuery<K, SN, N, V>) super.setRange(start, finish, reversed, count);
}
@SuppressWarnings("unchecked")
@Override
public MultigetSubSliceQuery<K, SN, N, V> setColumnNames(N... columnNames) {
return (MultigetSubSliceQuery<K, SN, N, V>) super.setColumnNames(columnNames);
}
@SuppressWarnings("unchecked")
@Override
public MultigetSubSliceQuery<K, SN, N, V> setColumnNames(Collection<N> columnNames) {
return (MultigetSubSliceQuery<K, SN, N, V>) super.setColumnNames(columnNames);
}
}