51.2. 拡張性

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

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

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

int compare(Datum a, Datum b)

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

Datum* extractValue(Datum inputValue, uint32 *nkeys)

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

Datum* extractQuery(Datum query, uint32 *nkeys, StrategyNumber n)

問い合わせ対象の値に与えられるキーの配列を返します。 つまり、queryはインデックス可能な演算子の右辺の値です。 この左辺はインデックス対象の列です。 nは演算子クラス内の演算子の戦略数です(項33.14.2を参照)。 extractQueryはしばしば、queryのデータ型と抽出しなければならないキー値を決定するために、nに注意しなければなりません。 返されるキーの数を*nkeysに格納しなければなりません。

bool consistent(bool check[], StrategyNumber n, Datum query)

インデックス対象値が戦略数nの問い合わせ演算子を満たす(演算子がその演算子クラスでRECHECKと印が付いている場合は満たす可能性がある)場合、真を返します。 check配列の長さは、この問い合わせについて事前に行われたextractQueryが返したキーの数と同じです。 インデックス対象値が愛王する問い合わせキーを持つ場合、check配列の各要素は真です。 つまり、(check[i] == TRUE)の場合、extractQueryの結果配列のi番目のキーがインデックス対象値内に存在します。 元のqueryデータ(抽出されたキー配列ではありません)は、consistentメソッドがそれを調査する必要がある場合に、渡されます。