7.15.13. in_records
#
7.15.13.1. 概要#
バージョン 7.0.2 で追加.
in_records
を使うと既存のテーブルを条件のパターンとして使うことができます。テーブル内の各レコードがそれぞれ条件のパターンになります。
in_records
を使うと複数のクエリーを1つのクエリーにできるかもしれません。
in_records
は sub_filter に似ています。2つの違いは次の通りです。
sub_filter
では条件テーブルを参照するカラムが必須ですが、in_records
では必要ありません。
sub_filter
では上述の参照カラム用のインデックスカラムが必須ですが、in_records
ではインデックスカラムは必要ありません。
sub_filter
ではすべての論理演算を使えますが、in_records
では1つのパターン内でAND論理演算しか使えません。
sub_filter
では条件に1つの参照カラムの値しか使えませんが、in_records
では条件に1つ以上の値を使えます。複数の値を指定するために複数のカラムや関数などを使えます。
sub_filter
ではインデックスサーチを使いますが、in_records
ではシーケンシャルサーチを使います。
7.15.13.2. 構文#
in_records
には4つ以上のパラメーターがあります。:
in_records(condition_table,
value1, mode1, condition_column_name1,
...,
valueN, modeN, condition_column_nameN)
7.15.13.3. 使い方#
使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。
サンプルスキーマ:
実行例:
table_create Tags TABLE_PAT_KEY ShortText
# [[0,1337566253.89858,0.000355720520019531],true]
table_create Conditions TABLE_PAT_KEY ShortText
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Conditions user_pattern COLUMN_SCALAR ShortText
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Conditions tag COLUMN_SCALAR Tags
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Conditions max_length COLUMN_SCALAR UInt32
# [[0,1337566253.89858,0.000355720520019531],true]
table_create Memos TABLE_HASH_KEY ShortText
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Memos user COLUMN_SCALAR ShortText
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Memos tag COLUMN_SCALAR Tags
# [[0,1337566253.89858,0.000355720520019531],true]
サンプルデータ:
実行例:
load --table Memos
[
{"_key": "Groonga is fast", "user": "alice", "tag": "groonga"},
{"_key": "Mroonga is fast", "user": "alice", "tag": "mroonga"},
{"_key": "Groonga is very good!", "user": "alice", "tag": "groonga"},
{"_key": "Droonga is fast", "user": "david", "tag": "droonga"},
{"_key": "Groonga is a HTTP server", "user": "david", "tag": "groonga"}
]
# [[0,1337566253.89858,0.000355720520019531],5]
サンプル条件:
実行例:
load --table Conditions
[
{"_key": "lic + groonga", "user_pattern": "lic", "tag": "groonga", max_length: 20},
{"_key": "dav + droonga", "user_pattern": "dav", "tag": "droonga", max_length: 50}
]
# [[0,1337566253.89858,0.000355720520019531],2]
以下は Conditions
テーブル内のレコードで検索をする in_records
の使用例です。各レコードを条件として使います。
実行例:
plugin_register functions/string
# [[0,1337566253.89858,0.000355720520019531],true]
select \
--table Memos \
--filter 'in_records(Conditions, \
user, "@", "user_pattern", \
tag, "==", "tag", \
string_length(_key), "<=", "max_length")' \
--sort_by _id \
--output_columns _key,user,tag
# [
# [
# 0,
# 1337566253.89858,
# 0.000355720520019531
# ],
# [
# [
# [
# 2
# ],
# [
# [
# "_key",
# "ShortText"
# ],
# [
# "user",
# "ShortText"
# ],
# [
# "tag",
# "Tags"
# ]
# ],
# [
# "Groonga is fast",
# "alice",
# "groonga"
# ],
# [
# "Droonga is fast",
# "david",
# "droonga"
# ]
# ]
# ]
# ]
この filter
は各レコードに対して次の3つの条件で絞り込みます。
Memos.user
がConditions.user_pattern
にマッチ(@
)するか。
Memos.tag
はConditions.tag
と等しい(==
)か。
Memos._key
の文字数がConditions.max_length
以下か。
Conditions
テーブル内の少なくとも1つのレコードがこれら3つの条件すべてで真を返せば Memos
テーブルのそのレコードはマッチします。
Conditions
テーブルの最初のレコードは次の条件を使います。
Memos.user
には部分文字列として"lic"
がある。
Memos.tag
は"groonga"
である。
Memos._key
の文字数が20
以下である。
この条件は次のレコードにマッチします。
{"_key": "Groonga is fast", "user": "alice", "tag": "groonga"}
Conditions
テーブルの2つめのレコードは次の条件を使います。
Memos.user
には部分文字列として"dav"
がある。
Memos.tag
は"droonga"
である。
Memos._key
の文字数が50
以下である。
この条件は次のレコードにマッチします。
{"_key": "Droonga is fast", "user": "david", "tag": "droonga"}
検索結果には前述のすべてのレコードが含まれます。
7.15.13.4. 引数#
in_records
には4つ以上のパラメーターが必須です。
7.15.13.4.1. 必須引数#
condition_table
と「 value
、 mode_name
、 condition_column_name
」のセットです。「 value
、 mode_name
、 condition_column_name
」のセットは複数回指定できます。
7.15.13.4.1.1. condition_table
#
レコードとして条件が入っているテーブルを指定します。
7.15.13.4.2. value
#
比較対象の値を指定します。
7.15.13.4.3. mode_name
#
value と condition_column_name の値の比較方法(モード名)を指定します。
利用可能なモード名は default_mode を見てください。 "NEAR"
、 "SIMILAR"
と "SUFFIX"
以外のすべてのモード名をサポートしています。
7.15.13.4.4. condition_column_name
#
条件として使う condition_table のカラム名を指定します。
7.15.13.4.5. 省略可能引数#
省略可能な引数はありません。
7.15.13.5. 戻り値#
in_records
は対象レコードが指定した条件テーブル内の1つ以上のレコード(パターン)にマッチするかどうかを返します。
もし該当レコードがマッチすれば、 true
を返します。そうでなければ false
を返します。