★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

52.2. 拡張性

GINインタフェースは高度に抽象化されています。 アクセスメソッド実装者に要求されることは、アクセスするデータ型の意味を実装することだけです。 GIN層自体が同時実行性、ログ処理、ツリー構造の検索処理に関する注意を行います

GINアクセスメソッドを動作させるために取ることは、4つ(または5つ)のユーザ定義関数を実装することだけです。 これは、ツリー内のキーの動作とキーとインデックス付けされる値、インデックス可能な問い合わせ間の関係を定義します。 すなわち、GINは、一般化、コード再利用、整理されたインタフェースによる拡張性を組み合わせます。

GIN用の演算子クラスが提供しなければならない内4つのメソッドを示します。

int compare(Datum a, Datum b)

キー(インデックス付けされる値ではありません)を比較し、0より小さい、0、または0より大きい整数を返します。 それぞれ、最初のキーが2番目のキーより、小さい、等しい、または大きいことを示します。

Datum *extractValue(Datum inputValue, int32 *nkeys)

インデックス対象値に与えられるキーの配列を返します。 返されるキーの数は*nkeysに格納しなければなりません。

Datum *extractQuery(Datum query, int32 *nkeys, StrategyNumber n, bool **pmatch, Pointer **extra_data)

問い合わせ対象の値に与えられるキーの配列を返します。 つまり、queryはインデックス可能な演算子の右辺の値です。 この左辺はインデックス対象の列です。 nは演算子クラス内の演算子の戦略数です(項34.14.2を参照)。 extractQueryはしばしば、queryのデータ型と抽出しなければならないキー値を決定するために、nを調べなければなりません。 返されるキーの数を*nkeysに格納しなければなりません。 問い合わせがキーを含んでいない場合、extractQueryは、演算子の意味合いによって*nkeysに0または-1を格納しなければなりません。 0は全ての値がqueryに一致し、完全インデックススキャンが行われることを意味します(しかし、項52.5を参照)。 -1は何もqueryに一致せず、インデックススキャンはすべて飛ばされます。 部分マッチが提供されている場合、pmatchは使用する出力引数です。使用するには、extractQuery*nkeys論理値の配列を割り当て、*pmatchの番地に格納しなければなりません。関連するキーが部分マッチを必要とするとき、それぞれの配列要素はTRUEに、そうでなければFALSEに設定されなければなりません。 *pmatch が NULL に設定されていない場合、GINは部分マッチが必要ないと想定します。呼び出し前に変数はNULLに初期化されますので、この引数は部分マッチが支援されていない場合、演算子クラスで単に無視されます。 extra_dataは、consistentcomparePartialメソッドに追加データを渡すためのextractQueryを可能にする出力引数です。使用するには、extractQuery*nkeysポインタの配列を割り付け、*extra_dataの番地に格納し、そして望まれるのは何でも個別のポインタに格納されなければなりません。変数は呼び出し前にNULLに初期化されますので、追加データを必要としない演算子クラスでこの引数は単に無視されます。もし*extra_dataが設定されれば、配列全部がconsistentメソッドに、適切な要素がcomparePartialメソッドに渡されます。

bool consistent(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck

インデックス付けられた値が戦略数nを持つ問い合わせ演算子を満たす(または、recheck印が返されたときはたぶん満たすかもしれない)場合に真を返します。 check配列はnkeys長さを持ち、このqueryデータに対して事前に行われたextractQueryが返したキーの数と同じです。 インデックス対象値が対応する問い合わせキーを持つ場合、check配列の各要素は真です。 つまり、(check[i] == TRUE)の場合、extractQueryの結果配列のi番目のキーがインデックス対象値内に存在します。 元のqueryデータ(抽出されたキー配列ではありません)は、consistentメソッドがそれを調査する必要がある場合に、渡されます。 extra_dataextractQueryにより返された追加データ配列で、ない場合はNULLです。 成功の場合、*recheckはヒープタプルが問い合わせ演算子に対し再検査を必要とすれば真で、インデックス検査が的確であれば偽です。

オプションとして、GINに対する演算子クラスは第5のメソッドを提供します。

int comparePartial(Datum partial_key, Datum key, StrategyNumber n, Pointer extra_data)

問い合わせとインデックスキーの部分一致を比較します。 符号が結果を示す整数が返ります。 ゼロ未満はインデックスキーは問い合わせに一致しないが、インデックススキャンを続けるべきであることを示します。 ゼロはインデックスキーが問い合わせに一致することを示します。 ゼロより大きな値はこれ以上の一致はありえないためインデックススキャンを停止すべきであることを示します。 スキャンをいつ停止するかを決めるためにセマンテックスが必要とされる場合、部分一致問い合わせを生成した演算子の戦略番号nが提供されます。 またextra_dataextractQueryで作成される追加データ配列の対応する要素、もしなければNULLです。

"部分一致"問い合わせをサポートするためには、演算子クラスはcomparePartialメソッドを提供しなければなりません。 またそのextractQueryは、部分一致問い合わせであった時にpmatchパラメータを設定しなければなりません。 詳細については項52.3.2を参照してください。