本モジュールは、多次元立方体を表すためのcube
データ型を実装します。
(訳注:以下cubeを立方体と訳しますが、ここでのcubeが指しているものは、厳密には「(超)立方体」ではありません。正確には、それぞれの「(超)面」がある座標軸に対して垂直な「(超)直方体」です。)
このモジュールは「trusted」と見なされます。つまり、現在のデータベースに対してCREATE
権限を持つ非スーパーユーザがインストールできます。
表 F.2はcube
型で有効な外部表現を示します。
x
、y
などは浮動小数点数を意味します。
表F.2 cubeの外部表現
外部構文 | 意味 |
---|---|
| 1次元の点。(すなわち、幅ゼロの一次元間隔) |
( | 同上 |
| n次元空間の点。 内部的には体積0の立方体として表されます。 |
( | 同上 |
( |
x からy まで(またはその逆)の1次元の間隔。
順序は関係ありません。
|
[( | 同上 |
( | 対角の組み合わせで表されるn次元の立方体。 |
[( | 同上 |
立方体の対角の入力順序は関係ありません。
統一的な「左下 — 右上」という内部表現を作成するために必要ならば、cube
関数は自動的に値を交換します。
角が一致する場合、cube
型には無駄を省くために、「点である」フラグを加えた一つの角のみ格納されます。
空白文字は入力時に無視されます。
このため、[(
はx
),(y
)][ (
と同じです。
x
), ( y
) ]
値は内部的に64ビットの浮動小数点数値として格納されます。 つまり、有効桁が16より大きい数値は切り詰められることを意味します。
表 F.3は、cube
型に提供されている専用の演算子を示します。
表F.3 cubeの演算子
演算子 説明 |
---|
立方体が重なるか。 |
1番目の立方体は2番目のものを含むか。 |
1番目の立方体は2番目のものに含まれるか。 |
立方体の(1から数えた) |
以下のように立方体の |
2つの立方体のユークリッド距離を計算します。 |
2つの立方体のタクシー(L-1計量)距離を計算します。 |
2つの立方体のチェビシェフ(L-無限大計量)距離を計算します。 |
上記の演算子に加えて、cube
型では表 9.1にある通常の比較演算子が利用可能です。
これらの演算子は、まず最初の座標を比較し、それらが同一の場合は2番目の座標を比較し、と続けます。
それらは、主にcube
型のためのB-treeインデックス演算子クラスをサポートするために存在し、例えばcube
型の列にUNIQUE制約をつけたい場合に便利です。
cube
モジュールは、cube
型の値用にGiSTインデックス演算子クラスも提供します。
cube
型GiSTインデックスは、WHERE
句内にて=
、&&
、@>
、<@
演算子を用いて値を検索するために使用することができます。
加えて、cube
型GiSTインデックスは、ORDER BY
句内にて<->
、<#>
、<=>
のメトリック演算子を用いて近傍値を発見するために使用することができます。
例えば、3次元の点である(0.5, 0.5, 0.5)の最近傍点は、以下のように効率よく発見できます。
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
~>
演算子でもこの方法で、選択された座標によってソートされた最初のいくつかの値を効率よく探査するために使用できます。
例えば、1番目の座標(左下隅)によって昇順に並べ替えられた最初のいくつかの立方体を取得するために、以下のような問い合わせを使用することができます。
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
そして、右上の1番目の座標によって昇順に並べ替えられた2次元の立方体を取得するために、以下のような問い合わせを使用することができます。
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
表 F.4は有効な関数を示します。
表F.4 cubeの関数
関数 説明 例 |
---|
同じ座標をもつ、1次元の立方体を作成します。
|
1次元の立方体を作成します。
|
配列で定義される座標を使用した体積0の立方体を作成します。
|
2つの配列で定義される右上および左下座標を持つ立方体を作成します。配列長は同じでなければなりません。
|
既存の立方体に次元を加え、新しい座標の同じ値の端点をもつ立方体を新しく作成します。 これは計算した値で部品を追加しながら立方体を構築する場合に有用です。
|
既存の立方体に次元を加えた立方体を新しく作成します。 これは計算した値で部品を追加しながら立方体を構築する場合に有用です。
|
立方体の次元数を返します。
|
立方体の左下隅の
|
立方体の右上隅の
|
立方体が点、つまり立方体が定義する2つの隅が同一の場合真を返します。
|
2つの立方体間の距離を返します。 両方の立方体が点の場合、これは通常の距離測定関数です。
|
配列内の次元インデックスの一覧を使用して、既存の立方体から新しい立方体を作成します。 単一次元の端点を展開するために使用したり、次元を除去したり、希望通りの順序に並べ替えたりすることができます。
|
2つの立方体の和集合を作成します。
|
2つの立方体の共通部分を作成します。
|
最小で
|
select cube_union('(0,5,2),(2,3,1)', '0'); cube_union ------------------- (0, 0, 0),(2, 5, 2) (1 row)
この和集合および以下の共通集合は一般常識と矛盾しないと思います。
select cube_inter('(0,-1),(1,1)', '(-2),(2)'); cube_inter ------------- (0, 0),(1, 0) (1 row)
次元が異なる立方体の二項演算すべてにおいて、より低い次元の方がデカルト投影、つまり、文字列表現で省略された座標に0を持つものになると仮定します。 上の例は以下と同じです。
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)'); cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
以下の包含の述部は点構文を使用しますが、実際内部的には第2引数は矩形として表されます。 この構文により、別の点用の型や(box,point)という述部用の関数を定義することが不要になります。
select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row)
使用例については、sql/cube.sql
リグレッションテストを参照してください。
破壊防止のために立方体の次元数に100までという制限を行いました。
これはcubedata.h
で設定されており、必要に応じて多少大きくすることができます。
原作者: Gene Selkov, Jr. <selkovjr@mcs.anl.gov>
,
Mathematics and Computer Science Division, Argonne National Laboratory.
GiST (http://gist.cs.berkeley.edu/)の要点(gist)を説明してくださったJoe Hellerstein博士 (https://dsf.berkeley.edu/jmh/) に感謝します。 また、Illustra用の例の作者である彼の以前の生徒Andy Dongに感謝します。 また、自分の世界を作成できるようにし、静かに生活できるようにしてもらった、過去から現在までのすべてのPostgres開発者に感謝します。 データベース研究を長年誠実にサポートしてくれたArgonne LabとU.S. Department of Energyにも感謝します。
2002年8月/9月にBruno Wolff III <bruno@wolff.to>
による小規模な改修がこのパッケージになされました。
この改修には、単精度から倍精度への精度の変更といくつかの関数の追加が含まれます。
2006年7月にJoshua Reich <josh@root.net>
による改修がさらになされました。
この改修にはcube(float8[], float8[])
が含まれ、また、古いV0プロトコルからV1呼び出しプロトコルを使用するようコードが整理されました。