索引の読取り
表の索引を使用して表の行を取得するには、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
フィールドの値に基づいて表myTable
のDoB
という名前の索引が作成されます。 索引をスキャンするには、次の手順を実行します。
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)