package me.prettyprint.cassandra.model;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import me.prettyprint.cassandra.service.KeyspaceService;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.Serializer;
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.RangeSlicesQuery;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.IndexClause;
import org.apache.cassandra.thrift.IndexExpression;
import org.apache.cassandra.thrift.IndexOperator;
/**
* This class will soon be removed, use {@link RangeSlicesQuery} instead.<br>
* <br>
* Uses new secondary indexes. Your CF must be configured for such to use this.
* The following creates an Indexed CF with the "birthday" column indexed (where
* birthdate represents a timestamp as it is validated by the LongType):
*
* <pre>
* - name: Indexed1
* column_metadata:
* - name: birthdate
* validator_class: LongType
* index_type: KEYS
* </pre>
*
* @author zznate (nate@riptano.com)
*/
@Deprecated
public class IndexedSlicesQuery<K, N, V> extends
AbstractSliceQuery<K, N, V, OrderedRows<K, N, V>> {
private final IndexClause indexClause;
public IndexedSlicesQuery(Keyspace k, Serializer<K> keySerializer,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
super(k, keySerializer, nameSerializer, valueSerializer);
indexClause = new IndexClause();
}
public IndexedSlicesQuery<K, N, V> addEqualsExpression(N columnName,
V columnValue) {
indexClause.addToExpressions(new IndexExpression(columnNameSerializer
.toByteBuffer(columnName), IndexOperator.EQ, valueSerializer
.toByteBuffer(columnValue)));
return this;
}
public IndexedSlicesQuery<K, N, V> addLteExpression(N columnName,
V columnValue) {
indexClause.addToExpressions(new IndexExpression(columnNameSerializer
.toByteBuffer(columnName), IndexOperator.LTE, valueSerializer
.toByteBuffer(columnValue)));
return this;
}
public IndexedSlicesQuery<K, N, V> addGteExpression(N columnName,
V columnValue) {
indexClause.addToExpressions(new IndexExpression(columnNameSerializer
.toByteBuffer(columnName), IndexOperator.GTE, valueSerializer
.toByteBuffer(columnValue)));
return this;
}
public IndexedSlicesQuery<K, N, V> addLtExpression(N columnName, V columnValue) {
indexClause.addToExpressions(new IndexExpression(columnNameSerializer
.toByteBuffer(columnName), IndexOperator.LT, valueSerializer
.toByteBuffer(columnValue)));
return this;
}
public IndexedSlicesQuery<K, N, V> addGtExpression(N columnName, V columnValue) {
indexClause.addToExpressions(new IndexExpression(columnNameSerializer
.toByteBuffer(columnName), IndexOperator.GT, valueSerializer
.toByteBuffer(columnValue)));
return this;
}
@Override
public IndexedSlicesQuery<K, N, V> setColumnNames(Collection<N> columnNames) {
super.setColumnNames(columnNames);
return this;
}
@Override
public IndexedSlicesQuery<K, N, V> setColumnNames(N... columnNames) {
super.setColumnNames(columnNames);
return this;
}
@Override
public IndexedSlicesQuery<K, N, V> setRange(N start, N finish,
boolean reversed, int count) {
super.setRange(start, finish, reversed, count);
return this;
}
@Override
public IndexedSlicesQuery<K, N, V> setReturnKeysOnly() {
super.setReturnKeysOnly();
return this;
}
public IndexedSlicesQuery<K, N, V> setStartKey(K startKey) {
indexClause.setStart_key(keySerializer.toByteBuffer(startKey));
return this;
}
@Override
public IndexedSlicesQuery<K, N, V> setColumnFamily(String cf) {
super.setColumnFamily(cf);
return this;
}
public IndexedSlicesQuery<K, N, V> setRowCount(int rowCount) {
indexClause.setCount(rowCount);
return this;
}
public int getRowCount() {
return indexClause.getCount();
}
@Override
public QueryResult<OrderedRows<K, N, V>> execute() {
return new QueryResultImpl<OrderedRows<K, N, V>>(
keyspace.doExecute(new KeyspaceOperationCallback<OrderedRows<K, N, V>>() {
@Override
public OrderedRows<K, N, V> doInKeyspace(KeyspaceService ks)
throws HectorException {
Map<ByteBuffer, List<Column>> ret = null;
if (!indexClause.isSetStart_key()) {
indexClause.setStart_key(new byte[0]);
}
ColumnParent columnParent = new ColumnParent(columnFamilyName);
ret = ks
.getIndexedSlices(columnParent, indexClause, getPredicate());
Map<K, List<Column>> thriftRet = keySerializer.fromBytesMap(ret);
return new OrderedRowsImpl<K, N, V>(
(LinkedHashMap<K, List<Column>>) thriftRet,
columnNameSerializer, valueSerializer);
}
}, consistency), this);
}
}