# 7.19. エイリアス

バージョン 5.1.2 で追加.

エイリアス機能を使うと複数の名前で1つのテーブル・カラムを参照できます。

## 7.19.1. 概要

このエイリアス機能は次のケースで有用です。

> - テーブルをリネームしたいが現在のテーブル名を使っているGroongaクライアントがいてそれらは変更できない。

> - ダウンタイムなしでカラムの型を変更したい。

前者のケースでは、テーブルをリネームした後も既存のGroongaクライアントは現在のテーブル名（リネーム前のテーブル名）でアクセスできます。なぜなら、エイリアス機能は現在のテーブル名を新しいリネーム後のテーブル名に対応づけるからです。

後者のケースでは、前提として、すべてのGroongaクライアントは `aliased_column` のようなエイリアスされた名前でアクセスするようにしておきます。 `aliased_column` は `current_column` （現在のテーブル）を参照するようにします。この状態で、 `new_column` という新しいカラムを新しい型で作成し、 column_copy を使ってそのカラムに `current_column` からデータをコピーします。その後、 `aliased_column` の参照先を `current_column` から `new_column` に変更します。これですべてのGroongaクライアントは `aliased_column` で `new_column` を参照するようになります。検索リクエストを止める必要はありません。

## 7.19.2. 使い方

エイリアスと実際の名前の対応は通常のテーブルとカラムで管理します。

エイリアス管理テーブルには TABLE_NO_KEY 以外であればどの種類でも使えます。オススメは TABLE_HASH_KEY です。なぜなら、エイリアス機能ではキーの完全一致検索しか使わないからです。キーの完全一致検索が一番速いのは TABLE_HASH_KEY です。

カラムは、種類を スカラーカラム 、型を `ShortText` にします。 `Text` または `LongText` 型も使えますが、意味がありません。なぜなら、テーブル・カラム名の最大サイズは4KiBだからです。 `ShortText` は4KiBのデータを格納できます。

以下はエイリアス管理用のテーブル・カラムの定義例です。

実行例:

    table_create Aliases TABLE_HASH_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Aliases real_name COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]

設定 を使ってこのテーブルとカラムを登録する必要があります。エイリアス機能は設定項目 `alias.column` を使います。次のように config_set を使ってこのテーブルとカラムを登録します。

実行例:

    config_set alias.column Aliases.real_name
    # [[0, 1337566253.89858, 0.000355720520019531], true]

エイリアスの使い方を示すためのスキーマとデータは次の通りです。

実行例:

    table_create Users TABLE_HASH_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Users age COLUMN_SCALAR UInt8
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Users
    [
    {"_key": "alice", "age": 14},
    {"_key": "bob",   "age": 29}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 2]

select で `Users.age` を使えます。

実行例:

    select Users --filter 'age < 20'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "age",
    #           "UInt8"
    #         ]
    #       ],
    #       [
    #         1,
    #         "alice",
    #         14
    #       ]
    #     ]
    #   ]
    # ]

column_rename で `Users.age` を `Users.years` にリネームすると `Users.age` にはアクセスできなくなります。

実行例:

    column_rename Users age years
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    select Users --filter 'age < 20'
    # [
    #   [
    #     -63,
    #     1337566253.89858,
    #     0.000355720520019531,
    #     "Syntax error: <age| |< 20>: [expr][parse] unknown identifier: <age>",
    #     [
    #       [
    #         "yy_syntax_error",
    #         "grn_ecmascript.lemon",
    #         41
    #       ]
    #     ]
    #   ]
    # ]

`Aliases` テーブルに `Users.age` から `Users.years` の対応を追加すると `Users.age` を使うことができます。

実行例:

    load --table Aliases
    [
    {"_key": "Users.age", "real_name": "Users.years"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 1]
    select Users --filter 'age < 20'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "years",
    #           "UInt8"
    #         ]
    #       ],
    #       [
    #         1,
    #         "alice",
    #         14
    #       ]
    #     ]
    #   ]
    # ]

これで、 `Users.years` のエイリアスとして `Users.age` を使うことができます。

## 7.19.3. エイリアスの解決方法

このセクションではエイリアスの解決方法について説明します。

Groongaは存在しない名前（テーブル名、カラム名、コマンド名、関数名など）が参照されたときにエイリアス機能を使います。エイリアス機能で既存のオブジェクト（テーブル、カラム、コマンド、関数など）を置き換えることはできません。

たとえば、以下の例ではエイリアスは解決されません。なぜなら `Users.years` が存在するからです。

実行例:

    column_rename Users years years_old
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    select Users --filter 'age < 20'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "years_old",
    #           "UInt8"
    #         ]
    #       ],
    #       [
    #         1,
    #         "alice",
    #         14
    #       ]
    #     ]
    #   ]
    # ]

Groongaはエイリアスを再帰的に解決します。 `Users.years` を `Users.years_old` にリネームし、 `Users.age` を参照したとします。Groongaは `Users.age` を `Users.years` に置き換え、その後、 `Users.years` を `Users.years_old` に置き換えます。なぜなら、 `Aliases` テーブルには次のレコードがあるからです。

`_key` | `real_name`
--- | ---
`Users.age` | `Users.years`
`Users.years` | `Users.years_old`

以下は `Users.age` が再帰的に解決される例です。

実行例:

    column_rename Users years years_old
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    select Users --filter 'age < 20'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "years_old",
    #           "UInt8"
    #         ]
    #       ],
    #       [
    #         1,
    #         "alice",
    #         14
    #       ]
    #     ]
    #   ]
    # ]

## 7.19.4. 参考

> - 設定

> - config_set

> - table_create

> - column_create

> - select