package me.prettyprint.cassandra.model; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import me.prettyprint.cassandra.utils.Assert; import me.prettyprint.hector.api.Serializer; import org.apache.cassandra.thrift.IndexExpression; import org.apache.cassandra.thrift.KeyRange; /** * A helper class for range queries. * <p> * We allow only keys range or tokens range at a time. * * @author Ran Tavory * @author Javier A. Sotelo */ public final class HKeyRange<K> { private K startKey; private K endKey; private String startToken; private String endToken; private List<IndexExpression> rowFilters; private int rowCount = 100; private final Serializer<K> keySerializer; public HKeyRange(Serializer<K> keySerializer) { Assert.notNull(keySerializer, "keySerializer is null"); this.keySerializer = keySerializer; } public HKeyRange<K> setKeys(K start, K end) { this.startKey = start; this.endKey = end; this.startToken = null; this.endToken = null; return this; } public HKeyRange<K> setTokens(K startKey, String startToken, String endToken) { this.startKey = startKey; this.endKey = null; this.startToken = startToken; this.endToken = endToken; return this; } public HKeyRange<K> setRowCount(int rowCount) { this.rowCount = rowCount; return this; } public int getRowCount() { return this.rowCount; } public void addToExpressions(IndexExpression elem) { if (this.rowFilters == null) { this.rowFilters = new ArrayList<IndexExpression>(); } this.rowFilters.add(elem); } /** * * @return The thrift representation of this object */ public KeyRange toThrift() { KeyRange keyRange = new KeyRange(rowCount); if(startToken != null) keyRange.setStart_token(startToken); else keyRange.setStart_key(startKey == null ? ByteBuffer.wrap(new byte[0]) : keySerializer.toByteBuffer(startKey)); if(endToken != null) keyRange.setEnd_token(endToken); else keyRange.setEnd_key(endKey == null ? ByteBuffer.wrap(new byte[0]) : keySerializer.toByteBuffer(endKey)); if (rowFilters != null) for (IndexExpression filter : rowFilters) { keyRange.addToRow_filter(filter); } return keyRange; } @Override public String toString() { StringBuilder sb = new StringBuilder("HKeyRange(start:"); sb.append(startKey); sb.append(",end:"); sb.append(endKey); sb.append(",indexed expressions:"); if (rowFilters == null || rowFilters.isEmpty()) sb.append("[]"); else sb.append(Arrays.toString(rowFilters.toArray())); sb.append(")"); return sb.toString(); } }