BRINのインタフェースは高度に抽象化されており、アクセスメソッドを実装する人は、アクセスされるデータ型のセマンティクスを実装するだけで良いようになっています。 BRIN層は、同時実行性、ログ、インデックス構造の検索を担当します。
BRINアクセスメソッドを動作させるために必要なのは、インデックスに格納された要約値の振る舞いと、それらがインデックススキャンする際にどう関係するのかを定義する少数のメソッドを実装することだけです。 つまり、BRINは一般性、コードの再利用性、整理されたインタフェースと拡張性を同時に実現しています。
BRIN用の演算子クラスは、4つのメソッドを提供する必要があります。
BrinOpcInfo *opcInfo(Oid type_oid)
インデックスが貼られた列の要約データに関する内部情報を返します。 返却値はpallocされたBrinOpcInfoへのポインタでなければなりません。BrinOpcInfoは以下の定義を持ちます。
typedef struct BrinOpcInfo { /* Number of columns stored in an index column of this opclass */ uint16 oi_nstored; /* Opaque pointer for the opclass' private use */ void *oi_opaque; /* Type cache entries of the stored columns */ TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER]; } BrinOpcInfo;
BrinOpcInfo
.oi_opaque
は、演算子クラスのルーチンが、インデックススキャン中にサポート関数同士で情報のやり取りをするために使うことができます。
bool consistent(BrinDesc *bdesc, BrinValues *column,
ScanKey key)
ScanKeyがある範囲のインデックス値と一致しているかどうかを返します。 属性の数はスキャンキーの一部として渡されます。
bool addValue(BrinDesc *bdesc, BrinValues *column,
Datum newval, bool isnull)
追加された新しい値をインデックスが表現できるように、与えられたインデックスタプルとインデックス値にしたがい、タプルの指定アトリビュートを変更します。
タプルの更新が行われれば、true
が返却されます。
bool unionTuples(BrinDesc *bdesc, BrinValues *a,
BrinValues *b)
2つのインデックスタプルを統合します。 与えられた2つのインデックスタプルのうち、最初のインデックスタプルを変更して、両方のタプルを表現できるようにします。 2番目のタプルは変更されません。
コア配布物には、2種類の演算子クラスが含まれます。すなわち、minmaxとinclusionです。 それらを使った演算子クラスの定義がコア配布物に必要に応じて含まれます。 同じ定義を使って、ユーザは他のデータ型のために演算子クラスを定義することができます。 そのためにソースコードを書く必要はありません。適切なシステムカタログの定義があれば十分です。 演算子ストラテジのセマンティクスは、サポート関数のソースコード中に埋め込まれていることに注意してください。
前述の4つの主要なサポート関数を実装することにより、まったく異なるセマンティクスを実装する演算子クラスも可能です。 なお、メジャーリリース間では下位互換性は保証されていません。 たとえば、新しいリリースでは、サポート関数が追加で必要になるかもしれません。
表 67.2で示すように、全順序集合を実装するデータ型のための演算子クラスを書くために、関連する演算子とともにminmaxサポート関数を使うことができます。 演算子クラスのメンバー(関数と演算子)はすべて必須です。
表67.2 Minmax演算子クラスの関数とサポート番号
演算子クラスメンバー | オブジェクト |
---|---|
Support Function 1 | internal function brin_minmax_opcinfo() |
Support Function 2 | internal function brin_minmax_add_value() |
Support Function 3 | internal function brin_minmax_consistent() |
Support Function 4 | internal function brin_minmax_union() |
Operator Strategy 1 | operator less-than |
Operator Strategy 2 | operator less-than-or-equal-to |
Operator Strategy 3 | operator equal-to |
Operator Strategy 4 | operator greater-than-or-equal-to |
Operator Strategy 5 | operator greater-than |
表 67.3で示すように、他のデータ型の値を含む複合データ型の演算子クラスを書くには、関連する演算子とともに、inclusionサポート関数を使うことができます。 任意の言語で書かれたたったひとつの関数を追加するだけです。 機能を追加するために関数を追加できます。 すべての演算子はオプションです。 表の中依存性の項目で示されているように、ある種の演算子は他の演算子を必要とすることもあります。
表67.3 Inclusion演算子クラスの関数とサポート番号
演算子クラスメンバー | オブジェクト | 依存性 |
---|---|---|
Support Function 1 | internal function brin_inclusion_opcinfo() | |
Support Function 2 | internal function brin_inclusion_add_value() | |
Support Function 3 | internal function brin_inclusion_consistent() | |
Support Function 4 | internal function brin_inclusion_union() | |
Support Function 11 | function to merge two elements | |
Support Function 12 | optional function to check whether two elements are mergeable | |
Support Function 13 | optional function to check if an element is contained within another | |
Support Function 14 | optional function to check whether an element is empty | |
Operator Strategy 1 | operator left-of | Operator Strategy 4 |
Operator Strategy 2 | operator does-not-extend-to-the-right-of | Operator Strategy 5 |
Operator Strategy 3 | operator overlaps | |
Operator Strategy 4 | operator does-not-extend-to-the-left-of | Operator Strategy 1 |
Operator Strategy 5 | operator right-of | Operator Strategy 2 |
Operator Strategy 6, 18 | operator same-as-or-equal-to | Operator Strategy 7 |
Operator Strategy 7, 13, 16, 24, 25 | operator contains-or-equal-to | |
Operator Strategy 8, 14, 26, 27 | operator is-contained-by-or-equal-to | Operator Strategy 3 |
Operator Strategy 9 | operator does-not-extend-above | Operator Strategy 11 |
Operator Strategy 10 | operator is-below | Operator Strategy 12 |
Operator Strategy 11 | operator is-above | Operator Strategy 9 |
Operator Strategy 12 | operator does-not-extend-below | Operator Strategy 10 |
Operator Strategy 20 | operator less-than | Operator Strategy 5 |
Operator Strategy 21 | operator less-than-or-equal-to | Operator Strategy 5 |
Operator Strategy 22 | operator greater-than | Operator Strategy 1 |
Operator Strategy 23 | operator greater-than-or-equal-to | Operator Strategy 1 |
サポート関数番号1-10は、BRINの内部関数用に予約されており、SQLレベルの関数は番号11から始まります。
サポート関数11は、インデックスを構築するのに必要なメイン関数です。
その関数は演算子クラスと同じデータ型を持つ2つの引数を受け取り、それらの和を返します。
もしSTORAGE
パラメータで定義されていれば、inclusion 演算子クラスは異なるデータ型の和を格納できます。
和関数の返り値は、STORAGE
データ型と一致していなければなりません。
サポート関数番号12と14は、組み込みデータ型の例外事象をサポートするために提供されます サポート関数番号12は、マージできない異なるファミリーのネットワークアドレスをサポートするために使用されます。 サポート関数番号14は、空のレンジをサポートするために使用されます。 サポート関数番号13はオプションですが、和関数に渡される前に新しい値のチェックを行うためのものとして推奨されます。 BRINフレームワークは和が変化しない時に操作を省略することができるため、この関数を使うことによってインデックスの性能が向上する可能性があります。
minmaxとinclusion演算子クラスは、データ型をまたがる演算子をサポートします。
しかし、これらを使用すると依存関係はより複雑になります。
minmax演算子クラスは、両方の引数がデータ型が同じ型である完全な演算子のセットが必要になります。
追加の演算子の組を定義することにより、追加のデータ型をサポートすることができます。
表 67.3で示すように、inclusion演算子クラスのストラテジは、他の演算子クラスのストラテジに依存するか、自分自身の演算子クラスのストラテジに依存します。
演算子クラスは、依存演算子がSTORAGE
データ型とともにサポートするデータ型の左辺引数、他のサポートするデータ型をサポートする演算子の右辺引数として定義される必要があります。
minmaxの例としてfloat4_minmax_ops
、inclusionの例としてbox_inclusion_ops
を参照してください。