本模組實現了一個名為 cube
的資料型別,用於表示多維立方體。
此模組被認為是“受信任的”,這意味著非超級使用者也可以在其擁有的資料庫上安裝它,前提是他們具有 CREATE
許可權。
表 F.1 顯示了 cube
型別的有效外部表示。 x
、 y
等表示浮點數。
表 F.1. Cube 外部表示
外部語法 | 含義 |
---|---|
|
一維點(或零長度的一維區間) |
( |
同上 |
|
n 維空間中的一個點,在內部表示為一個零體積的立方體 |
( |
同上 |
( |
一維區間,起始點為 x ,終點為 y ,或反之;順序無關緊要 |
[( |
同上 |
( |
一個 n 維立方體,由其對角線上的兩個頂點表示 |
[( |
同上 |
輸入對角頂點時,它們的順序並不重要。 cube
函式會自動交換值以建立統一的“左下 - 右上”內部表示。當頂點重合時,cube
只儲存一個頂點並帶有一個“是點”標誌,以避免浪費空間。
輸入時會忽略空格,因此 [(
與 x
),(y
)][ (
相同。x
), ( y
) ]
值以 64 位浮點數形式儲存。這意味著超過約 16 位有效數字的數字將被截斷。
表 F.2 顯示了為 cube
型別提供的專用運算子。
表 F.2. Cube 運算子
運算子 描述 |
---|
兩個立方體是否重疊? |
第一個立方體是否包含第二個立方體? |
第一個立方體是否被包含在第二個立方體中? |
提取立方體的第 |
提取立方體的第 |
計算兩個立方體之間的歐幾里得距離。 |
計算兩個立方體之間的計程車距離(L-1 度量)。 |
計算兩個立方體之間的切比雪夫距離(L-inf 度量)。 |
除了上述運算子之外,cube
型別還支援 表 9.1 中顯示的常規比較運算子。這些運算子首先比較第一個座標,如果它們相等,則比較第二個座標,依此類推。它們主要用於支援 cube
的 b-tree 索引運算子類,例如,當您希望對 cube
列設定 UNIQUE 約束時,這可能很有用。否則,這種排序的實際用途不大。
cube
模組還為 cube
值提供了一個 GiST 索引運算子類。 cube
GiST 索引可用於在 WHERE
子句中使用 =
、 &&
、 @>
和 <@
運算子搜尋值。
此外,cube
GiST 索引還可用於使用 ORDER BY
子句中的度量運算子 <->
、 <#>
和 <=>
來查詢最近鄰。例如,可以使用以下命令高效地查詢 3D 點 (0.5, 0.5, 0.5) 的最近鄰:
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
也可以使用 ~>
運算子以這種方式高效地檢索按選定座標排序的前幾個值。例如,要按第一個座標(左下角)升序排序的前幾個立方體,可以使用以下查詢:
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
以及按右上角第一個座標降序排序的 2D 立方體:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
表 F.3 顯示了可用的函式。
表 F.3. Cube 函式
函式 描述 示例 |
---|
建立一個一維立方體,兩個座標值相同。
|
建立一個一維立方體。
|
使用陣列定義的座標建立一個零體積的立方體。
|
建立一個立方體,其右上角和左下角座標由兩個陣列定義,這兩個陣列的長度必須相同。
|
透過向現有立方體新增一個維度來建立一個新立方體,新座標的兩個端點值相同。這有助於按部就班地構建立方體。
|
透過向現有立方體新增一個維度來建立一個新立方體。這有助於按部就班地構建立方體。
|
返回立方體的維度數。
|
返回立方體左下角第
|
返回立方體右上角第
|
如果立方體是點(即兩個定義角相同),則返回 true。
|
返回兩個立方體之間的距離。如果兩個立方體都是點,則這是常規距離函式。
|
使用陣列中的維度索引列表,從現有立方體建立一個新立方體。可用於提取單個維度的端點,或刪除維度,或按所需順序重新排列它們。
|
生成兩個立方體的並集。
|
生成兩個立方體的交集。
|
將立方體在至少
|
此並集
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)
在不同維度的立方體的所有二進位制運算中,低維立方體被假定為笛卡爾投影,即,省略的座標被零替換。上面的例子等價於
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)'); cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
以下包含謂詞使用了點語法,但實際上第二個引數在內部由一個盒子表示。這種語法使得無需為(盒子,點)謂詞定義單獨的點型別和函式。
select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row)
原作者:Gene Selkov, Jr. <selkovjr@mcs.anl.gov>
,阿貢國家實驗室數學與計算機科學部。
我最感謝的是 Joe Hellerstein 教授(https://dsf.berkeley.edu/jmh/),他闡明瞭 GiST 的核心思想(http://gist.cs.berkeley.edu/),以及他的前學生 Andy Dong 為 Illustra 編寫的示例。我還感謝所有 Postgres 的開發者(現任和前任),他們使我能夠創造自己的世界並安寧地生活其中。我還要感謝阿貢實驗室和美國能源部多年來對我的資料庫研究提供的堅定支援。
Bruno Wolff III <bruno@wolff.to>
於 2002 年 8 月/9 月對該軟體包進行了小幅更新。這些更新包括將精度從單精度改為雙精度,並添加了一些新函式。
Joshua Reich <josh@root.net>
於 2006 年 7 月進行了其他更新。這些更新包括 cube(float8[], float8[])
函式,以及將程式碼清理為使用 V1 呼叫協議而不是已棄用的 V0 協議。
如果您在文件中發現任何不正確之處、與您在使用特定功能時的體驗不符之處,或者需要進一步說明之處,請使用 此表單 報告文件問題。