前回からずいぶん時間がたってしまいました。申し訳ありません。
前回はgetメソッド,そしてget_sliceメソッドでデータを検索する方法を見ていきました。今回は残りのget_range_slices,multiget_slice,get_countの3つのメソッドを見ていきます。
前回同様,検索メソッドの確認の前準備としてデータを投入しておく必要があります。詳細は第7回をご覧ください。
複数のロウを取得する ~get_range_slicesメソッド
前回は基本的に1つのロウに対する操作でしたが,今回は複数のロウを取得してみましょう。そのために使うのがget_range_slicesメソッドです。
まずはコードを見てください。リスト1は郵便番号,住所とその読みを検索するコードです。
リスト1 郵便番号,住所と読みを検索
public class SimpleAddressSearchGetRangeSlices {
public static final String KEYSPACE = "Keyspace1";
public static final String COLUMN_FAMILY = "SimpleAddress";
public static void main(String[] args) throws IOException {
TSocket transport = new TSocket("localhost", 9160);
TProtocol protocol = new TBinaryProtocol(transport);
try {
transport.open();
} catch (TTransportException e) {
throw new RuntimeException(e);
}
try {
Cassandra.Client client = new Cassandra.Client(protocol);
SlicePredicate predicate = new SlicePredicate();
predicate.setColumn_names(Arrays.asList("postalCode".getBytes(),
"address".getBytes(), "addressYomi".getBytes()));
KeyRange range = new KeyRange();
range.setStart_key("");
range.setEnd_key("");
List<KeySlice> ret = client.get_range_slices(KEYSPACE,
new ColumnParent(COLUMN_FAMILY), predicate, range,
ConsistencyLevel.ONE);
int i = 0;
for (KeySlice keySlice : ret) {
System.out.println((i++) + " key = " + keySlice.getKey());
for (ColumnOrSuperColumn csc : keySlice.getColumns()) {
Column column = csc.getColumn();
String name = new String(column.getName());
String value = new String(column.getValue());
System.out.println("\t\t" + name + " -> " + value + "("
+ column.getTimestamp() + ")");
}
}
} catch (InvalidRequestException e) {
throw new RuntimeException(e);
} catch (UnavailableException e) {
throw new RuntimeException(e);
} catch (TimedOutException e) {
throw new RuntimeException(e);
} catch (TException e) {
throw new RuntimeException(e);
} finally {
try {
transport.flush();
} catch (TTransportException e) {
throw new RuntimeException(e);
} finally {
transport.close();
}
}
}
}
SlicePredicateについては前回ご紹介しているので,そちらをご覧ください。
このコードで新たに登場しているのは,KeyRangeとKeySliceという2つのクラスです。
KeyRange
KeyRangeは複数ロウを取得するときのレンジを表すクラスです。これには以下のようなことを設定でき,これに従って検索結果が返されます。
- キーの開始から終了のレンジ
- 取得する最大数
- トークンによるレンジ
リスト1のコードでは,以下のようにキーのレンジを何も指定しないようにしています。
KeyRange range = new KeyRange();
range.setStart_key("");
range.setEnd_key("");
ちなみに,デフォルトでは100件分のデータしか取得しません。そのため,たとえば1000件分取得する場合には,以下のようにする必要があります。
KeyRange range = new KeyRange(1000);
range.setStart_key("");
range.setEnd_key("");
また,キーの開始位置と終了位置を指定する場合は以下のようになります。
KeyRange range = new KeyRange(1000);
range.setStart_key("1760000");
range.setEnd_key("1760004");
このようにキーのレンジを指定できるのですが,いくつか注意点があります(詳細は後述します)。まずは「KeyRangeでキーの取得範囲を指定できる」ことだけわかれば現段階では問題ありません。
KeySlice
次はKeySliceです。KeySliceはget_range_slicesで返される値で,取得したキーと指定されたカラムの集合を持っています。get_range_slicesでは,このKeySliceのListを返します。
取得するコードは,以下のようにKeySliceのListから1つずつ中身を表示するようになっています。
for (KeySlice keySlice : ret) {
System.out.println((i++) + " key = " + keySlice.getKey());
for (ColumnOrSuperColumn csc : keySlice.getColumns()) {
Column column = csc.getColumn();
String name = new String(column.getName());
String value = new String(column.getValue());
System.out.println("\t\t" + name + " -> " + value + "("
+ column.getTimestamp() + ")");
}
}

