本文へスキップ
`Ctrl`+`K`

# 7.16.13. `in_records`

## 7.16.13.1. 概要

Added in version 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.16.13.2. 構文

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

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

## 7.16.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.16.13.4. 引数

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

### 7.16.13.4.1. 必須引数

`condition_table` と「 `value` 、 `mode_name` 、 `condition_column_name` 」のセットです。「 `value` 、 `mode_name` 、 `condition_column_name` 」のセットは複数回指定できます。

#### 7.16.13.4.1.1. `condition_table`

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

### 7.16.13.4.2. `value`

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

### 7.16.13.4.3. `mode_name`

value と condition_column_name の値の比較方法（モード名）を指定します。

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

### 7.16.13.4.4. `condition_column_name`

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

### 7.16.13.4.5. 省略可能引数

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

## 7.16.13.5. 戻り値

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

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