package me.prettyprint.cassandra.model;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import me.prettyprint.cassandra.service.KeyspaceService;
import me.prettyprint.cassandra.utils.Assert;
import me.prettyprint.hector.api.HConsistencyLevel;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.exceptions.HectorException;
import me.prettyprint.hector.api.query.Query;
import me.prettyprint.hector.api.query.QueryResult;
import org.apache.cassandra.thrift.ColumnParent;
public class MultigetCountQuery<K,N> implements Query<Map<K, Integer>> {
protected final ExecutingKeyspace keyspace;
protected final Serializer<K> keySerializer;
protected String columnFamily;
protected List<K> keys;
protected HConsistencyLevel consistency;
/** The slice predicate for which the count it performed*/
protected final HSlicePredicate<N> slicePredicate;
public MultigetCountQuery(Keyspace k, Serializer<K> keySerializer,
Serializer<N> nameSerializer) {
Assert.notNull(k, "keyspace can't be null");
Assert.notNull(keySerializer, "keySerializer can't be null");
Assert.notNull(nameSerializer, "columnNameSerializer is null");
this.keyspace = (ExecutingKeyspace) k;
this.keySerializer = keySerializer;
this.slicePredicate = new HSlicePredicate<N>(nameSerializer);
}
public MultigetCountQuery<K, N> setKeys(K... keys) {
this.keys = Arrays.asList(keys);
return this;
}
public MultigetCountQuery<K,N> setColumnFamily(String cf) {
this.columnFamily = cf;
return this;
}
public MultigetCountQuery<K,N> setColumnNames(N... columnNames) {
slicePredicate.setColumnNames(columnNames);
return this;
}
public MultigetCountQuery<K,N> setRange(N start, N finish, int count) {
slicePredicate.setRange(start, finish, false, count);
return this;
}
@Override
public HConsistencyLevel getConsistencyLevel() {
return this.consistency;
}
@Override
public void setConsistencyLevel(HConsistencyLevel level) {
this.consistency = level;
}
@Override
public QueryResult<Map<K, Integer>> execute() {
Assert.notNull(keys, "keys list is null");
Assert.notNull(columnFamily, "columnFamily is null");
return new QueryResultImpl<Map<K,Integer>>(keyspace.doExecute(
new KeyspaceOperationCallback<Map<K,Integer>>() {
@Override
public Map<K,Integer> doInKeyspace(KeyspaceService ks) throws HectorException {
ColumnParent columnParent = new ColumnParent(columnFamily);
Map<K,Integer> counts = keySerializer.fromBytesMap(
ks.multigetCount(keySerializer.toBytesList(keys), columnParent, slicePredicate.toThrift()));
return counts;
}
}, consistency), this);
}
@Override
public String toString() {
return String.format("MultigetCountQuery(%s) on cf: %s with keys: %s",slicePredicate.toString(),columnFamily,keys.toString());
}
}