フィールド範囲の指定

ストアで複数キー操作を行う場合、操作対象の行の範囲を指定できます。これは、FieldRangeクラスを使用して行います。このクラスは、一括読取りを行うすべてのメソッドに受け入れられます。このクラスは、選択した行をフィールド値の一致する範囲に制限するために使用されます。

たとえば、次のような表を定義したとします。

CREATE TABLE myTable (
    surname STRING,
    familiarName STRING,
    userID STRING,
    phonenumber STRING,
    address STRING,
    email STRING,
    dateOfBirth STRING,
    PRIMARY KEY (SHARD(surname, familiarName), userID)
) 

surnameには、個人の姓(Smithなど)が含まれます。familiarNameには、一般的な名前(BobPatriciaRobertなど)が含まれます。

このとき、surnameがSmithのユーザーに関連するすべての行に操作を実行できますが、フィールド範囲を指定して、familiarNameがアルファベット順でBobからPatriciaまでに含まれるユーザーのみに結果セットを制限することもできます。

FieldRangeFieldRangeクラスを使用して作成され、このクラスは、MultiRowOptionsクラスを使用して複数の読取り操作を実行するために使用するメソッドに指定します。このクラスには、範囲を設定する主キー・フィールドの名前と、範囲値(両端の値が含まれるかどうかを含む)が必要です。

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

この例ではTableIteratorを使用しますが、Store.multi_get()メソッドなど、複数行の読取り操作でも同様にこの範囲を簡単に使用できます。

def display_row(row):
    try:
            print "Retrieved row:"
            print "\tSurname: %s" % row['surname']
            print "\tFamiliar Name: %s" % row['familiarName']
            print "\tUser ID: %s" % row['userID']
            print "\tPhone: %s" % row['phonenumber']
            print "\tAddress: %s" % row['address']
            print "\tEmail: %s" % row['email']
            print "\tDate of Birth: %s" % row['dateOfBirth']
            print "\n"
    except KeyError, ke:
        logging.error("Row display failed. Bad key: %s" % ke.message)


def do_store_ops(store):

    key_d = {'surname' : 'Smith'}

    field_range = FieldRange({
                             ONDB_FIELD : "familiarName",
                             ONDB_START_VALUE : "Bob",
                             ONDB_END_VALUE : "Patricia",
                             # These next two are the default values,
                             # so are not really needed.
                             ONDB_START_INCLUSIVE : True,
                             ONDB_END_INCLUSIVE : True
                             })

    mro = MultiRowOptions({ONDB_FIELD_RANGE : field_range})


    try:
        row_list = store.table_iterator("myTable", key_d, False, mro)
        if not row_list:
            logging.debug("Table retrieval failed")
        else:
            logging.debug("Table retrieval succeeded.")
            for r in row_list:
                display_row(r)
    except IllegalArgumentException, iae:
        logging.error("Table retrieval failed.")
        logging.error(iae.message)