索引の読取り

表の索引を使用して表の行を取得するには、Store.index_iterator()を使用します。表の主キーを使用して表の行を読み取るためにtable_teratorを使用する場合と同様に、索引を使用して読み取る場合、フィールド範囲、トラバース方向などのオプションを設定できます。デフォルトでは、索引スキャンはFORWARD順にエントリを返します。

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

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

これにより、dateOfBirthフィールドの値に基づいて表myTableDoBという名前の索引が作成されます。 索引をスキャンするには、次の手順を実行します。

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 = {}

    try:
        row_list = store.index_iterator("myTable", "DoB",
                                        key_d, False)
        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) 

前述の例では、コードはDoB索引で索引付けされたすべての行を調べます。さらに便利なことに、この場合の例では、フィールド範囲の使用によって返される行を制限することになります。これは、FieldRangeオブジェクトを構築することで行います。これを行うには、範囲の基になるフィールドを指定する必要があります。索引は複数の表フィールドに基づくことができるため、オブジェクトを指定するフィールド名は索引付けされたフィールドの1つである必要があります。

たとえば、行がyyyy-mm-ddの形式で日付を保持している場合、次のように1994年5月に生まれたすべての人を取得できます。この索引では、1つのフィールドdateOfBirthのみが調べられるため、フィールド名をFieldRangeオブジェクトに渡します。

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 = {}

    field_range = FieldRange({
                             ONDB_FIELD : "dateOfBirth",
                             ONDB_START_VALUE : "1994-05-01",
                             ONDB_END_VALUE : "1994-05-30",
                             # 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.index_iterator("myTable", "DoB",
                                        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)