第9章 複数キー操作の場合のキーの範囲と深さ

目次

部分範囲の指定
深さの指定

複数キー操作(KVStore.multiGet()KVStore.multiDelete()KVStore.storeIterator()など)を行う場合、キーの範囲や深さを指定して操作対象のレコードを制限できます。キーの範囲では、一致セットのうち使用するキーのサブセットを指定できます。深さでは、複数キー操作で使用する子の数を指定できます。

部分範囲の指定

ストアで複数キー操作を行う場合、操作対象のレコードの範囲を指定できます。これは、KeyRangeクラスを使用して行います。このクラスで、複数取得操作で使用されるキーの直下のキー・コンポーネントに対してString値の範囲を定義します。

たとえば、次のキーを使用するとします。

/Smith/Bob/-/birthdate
/Smith/Bob/-/phonenumber
/Smith/Bob/-/image
/Smith/Bob/-/userID 
/Smith/Patricia/-/birthdate
/Smith/Patricia/-/phonenumber
/Smith/Patricia/-/image
/Smith/Patricia/-/userID 
/Smith/Richard/-/birthdate
/Smith/Richard/-/phonenumber
/Smith/Richard/-/image
/Smith/Richard/-/userID 
/Wong/Bill/-/birthdate
/Wong/Bill/-/phonenumber
/Wong/Bill/-/image
/Wong/Bill/-/userID

この仮定で、KeyRangeを作成して、ユーザーBob SmithとPatricia Smithに関連するすべてのレコードに対する操作を行うとします。これを行う場合、範囲の上限と下限を定義するキー・コンポーネントを指定する必要があります。指定したキー・コンポーネントを含めるか、除外するかも指定する必要があります。

このケースでは、文字列"Bob"を使用してキー範囲の始まりを定義し、キー範囲の終わりを"Patricia"と定義します。キー範囲の両端は含まれます。

package kvstore.basicExample;

import oracle.kv.KeyRange;

...

KeyRange kr = new KeyRange("Bob", true, "Patricia", true);

複数キー操作を行う際、KeyRangeインスタンスを使用します。たとえば、KVStore.storeIterator()を使用してストアからレコードを取得するとします。

package kvstore.basicExample;

...

import oracle.kv.Direction;
import oracle.kv.Key;
import oracle.kv.Value;
import oracle.kv.KeyRange;
import oracle.kv.KeyValueVersion;
import oracle.kv.RequestTimeoutException;

import java.util.ArrayList;
import java.util.Iterator;

...

ArrayList<String> majorComponents = new ArrayList<String>();

...

// Define the major and minor path components for the key
majorComponents.add("Smith");

// Create the retrieval key
Key myKey = Key.createKey(majorComponents);

KeyRange kr = new KeyRange("Bob", true, "Patricia", true);

// Now retrieve the records. Note that we do not show the creation of
// the kvstore handle here.


try {
    Iterator<KeyValueVersion> i = 
        kvstore.storeIterator(Direction.FORWARD, 0,
                              myKey, kr, null);
    while (i.hasNext()) {
        Value v = i.next().getValue(); 
        // Do some work with the Value here
    }
} catch (RequestTimeoutException re) {
    // The operation was not completed within the 
    // timeout value
}