7.15.11. in_records

7.15.11.1. 概要

バージョン 7.0.2 で追加.

in_records を使うと既存のテーブルを条件のパターンとして使うことができます。テーブル内の各レコードがそれぞれ条件のパターンになります。

in_records を使うと複数のクエリーを1つのクエリーにできるかもしれません。

in_recordssub_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.11.2. 構文

in_records には4つ以上のパラメーターがあります。:

in_records(condition_table,
           value1, mode1, condition_column_name1,
           ...,
           valueN, modeN, condition_column_nameN)

7.15.11.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.userConditions.user_pattern にマッチ( @ )するか。

  • Memos.tagConditions.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.11.4. 引数

in_records には4つ以上のパラメーターが必須です。

7.15.11.4.1. 必須引数

condition_table と「 valuemode_namecondition_column_name 」のセットです。「 valuemode_namecondition_column_name 」のセットは複数回指定できます。

7.15.11.4.1.1. condition_table

レコードとして条件が入っているテーブルを指定します。

7.15.11.4.2. value

比較対象の値を指定します。

7.15.11.4.3. mode_name

valuecondition_column_name の値の比較方法(モード名)を指定します。

利用可能なモード名は default_mode を見てください。 "NEAR""SIMILAR""SUFFIX" 以外のすべてのモード名をサポートしています。

7.15.11.4.4. condition_column_name

条件として使う condition_table のカラム名を指定します。

7.15.11.4.5. 省略可能引数

省略可能な引数はありません。

7.15.11.5. 戻り値

in_records は対象レコードが指定した条件テーブル内の1つ以上のレコード(パターン)にマッチするかどうかを返します。

もし該当レコードがマッチすれば、 true を返します。そうでなければ false を返します。