7.17. エイリアス¶
バージョン 5.1.2 で追加.
エイリアス機能を使うと複数の名前で1つのテーブル・カラムを参照できます。
7.17.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.17.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>",
# [
# [
# "yy_syntax_error",
# "grn_ecmascript.lemon",
# 34
# ]
# ]
# ],
# []
# ]
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.17.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
# ]
# ]
# ]
# ]