package me.prettyprint.cassandra.model.thrift; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import me.prettyprint.cassandra.model.AbstractSliceQuery; import me.prettyprint.cassandra.model.HKeyRange; import me.prettyprint.cassandra.model.KeyspaceOperationCallback; import me.prettyprint.cassandra.model.OrderedRowsImpl; import me.prettyprint.cassandra.model.QueryResultImpl; 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.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.IndexExpression; import org.apache.cassandra.thrift.IndexOperator; /** * A query for the thrift call get_range_slices. * * @author Ran Tavory * @author Javier A. Sotelo * * @param <N> * @param <V> */ public final class ThriftRangeSlicesQuery<K, N,V> extends AbstractSliceQuery<K, N,V,OrderedRows<K, N,V>> implements RangeSlicesQuery<K, N, V> { private final HKeyRange<K> keyRange; public ThriftRangeSlicesQuery(Keyspace keyspace, Serializer<K> keySerializer, Serializer<N> nameSerializer, Serializer<V> valueSerializer) { super(keyspace, keySerializer, nameSerializer, valueSerializer); keyRange = new HKeyRange<K>(keySerializer); } @Override public int getRowCount() { return keyRange.getRowCount(); } @Override public RangeSlicesQuery<K, N, V> setKeys(K start, K end) { keyRange.setKeys(start, end); return this; } @Override public RangeSlicesQuery<K, N, V> setTokens(K startKey, String startToken, String endToken) { keyRange.setTokens(startKey, startToken, endToken); return this; } @Override public RangeSlicesQuery<K, N, V> setRowCount(int rowCount) { keyRange.setRowCount(rowCount); return this; } @Override public QueryResult<OrderedRows<K, N, V>> execute() { Assert.notNull(columnFamilyName, "columnFamilyName can't be null"); 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 { ColumnParent columnParent = new ColumnParent(columnFamilyName); Map<K, List<Column>> thriftRet = keySerializer.fromBytesMap( ks.getRangeSlices(columnParent, getPredicate(), keyRange.toThrift())); return new OrderedRowsImpl<K,N,V>((LinkedHashMap<K, List<Column>>) thriftRet, columnNameSerializer, valueSerializer); } }, consistency), this); } @Override public String toString() { return "RangeSlicesQuery(" + keyRange + super.toStringInternal() + ")"; } @SuppressWarnings("unchecked") @Override public RangeSlicesQuery<K, N, V> setRange(N start, N finish, boolean reversed, int count) { return (RangeSlicesQuery<K, N, V>) super.setRange(start, finish, reversed, count); } @SuppressWarnings("unchecked") @Override public RangeSlicesQuery<K, N, V> setColumnFamily(String cf) { return (RangeSlicesQuery<K, N, V>) super.setColumnFamily(cf); } @SuppressWarnings("unchecked") @Override public RangeSlicesQuery<K, N, V> setColumnNames(N... columnNames) { return (RangeSlicesQuery<K, N, V>) super.setColumnNames(columnNames); } @Override public ThriftRangeSlicesQuery<K, N, V> setReturnKeysOnly() { super.setReturnKeysOnly(); return this; } @Override public ThriftRangeSlicesQuery<K, N, V> addEqualsExpression(N columnName, V columnValue) { keyRange.addToExpressions(new IndexExpression(columnNameSerializer.toByteBuffer(columnName), IndexOperator.EQ, valueSerializer.toByteBuffer(columnValue))); return this; } @Override public ThriftRangeSlicesQuery<K, N, V> addLteExpression(N columnName, V columnValue) { keyRange.addToExpressions(new IndexExpression(columnNameSerializer.toByteBuffer(columnName), IndexOperator.LTE, valueSerializer.toByteBuffer(columnValue))); return this; } @Override public ThriftRangeSlicesQuery<K, N, V> addGteExpression(N columnName, V columnValue) { keyRange.addToExpressions(new IndexExpression(columnNameSerializer.toByteBuffer(columnName), IndexOperator.GTE, valueSerializer.toByteBuffer(columnValue))); return this; } @Override public ThriftRangeSlicesQuery<K, N, V> addLtExpression(N columnName, V columnValue) { keyRange.addToExpressions(new IndexExpression(columnNameSerializer.toByteBuffer(columnName), IndexOperator.LT, valueSerializer.toByteBuffer(columnValue))); return this; } @Override public ThriftRangeSlicesQuery<K, N, V> addGtExpression(N columnName, V columnValue) { keyRange.addToExpressions(new IndexExpression(columnNameSerializer.toByteBuffer(columnName), IndexOperator.GT, valueSerializer.toByteBuffer(columnValue))); return this; } }