7.17. エイリアス

バージョン 5.1.2 で追加.

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

7.17.1. 概要

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

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

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

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

後者のケースでは、前提として、すべてのGroongaクライアントは aliased_column のようなエイリアスされた名前でアクセスするようにしておきます。 aliased_columncurrent_column (現在のテーブル)を参照するようにします。この状態で、 new_column という新しいカラムを新しい型で作成し、 column_copy を使ってそのカラムに current_column からデータをコピーします。その後、 aliased_column の参照先を current_column から new_column に変更します。これですべてのGroongaクライアントは aliased_columnnew_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]

selectUsers.age を使えます。

実行例:

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

column_renameUsers.ageUsers.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.yearsUsers.years_old にリネームし、 Users.age を参照したとします。Groongaは Users.ageUsers.years に置き換え、その後、 Users.yearsUsers.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
#       ]
#     ]
#   ]
# ]