PostgreSQL cube

2021-09-16 15:35 更新
F.9.1. 語(yǔ)法
F.9.2. 精度
F.9.3. 用法
F.9.4. 默認(rèn)值
F.9.5. 注解

這個(gè)模塊實(shí)現(xiàn)了一種數(shù)據(jù)類(lèi)型cube來(lái)表示多維立方體。

此模塊被視為trusted,也就是說(shuō),它可以由在當(dāng)前數(shù)據(jù)庫(kù)上具有 CREATE 權(quán)限的非超級(jí)用戶(hù)安裝。

F.9.1. 語(yǔ)法

表 F.2展示了cube類(lèi)型有效的外部表示。xy等表示浮點(diǎn)數(shù)。

表 F.2. 立方體外部表示

外部語(yǔ)法 含義
x 一個(gè)一維點(diǎn)(或者長(zhǎng)度為零的一維區(qū)間)
(x ) 同上
x1 ,x2,...,xn n-維空間中的一個(gè)點(diǎn),內(nèi)部表示為一個(gè)零容積立方體
(x1 ,x2,...,xn) 同上
(x ),(y) 開(kāi)始于x并且結(jié)束于y的一個(gè)一維區(qū)間,反之亦然。順序并不重要
[(x ),(y)] 同上
(x1 ,...,xn),(y1,...,yn) 一個(gè) n-維立方體,用它的對(duì)角頂點(diǎn)對(duì)表示
[(x1 ,...,xn),(y1,...,yn)] 同上

一個(gè)立方體的對(duì)角錄入的順序無(wú)關(guān)緊要。如果需要?jiǎng)?chuàng)建一種統(tǒng)一的左下 — 右上的內(nèi)部表示,cube函數(shù)會(huì)自動(dòng)地交換值。當(dāng)角重合時(shí),cube只存儲(chǔ)一個(gè)角和一個(gè)is point標(biāo)志,這樣避免浪費(fèi)空間。

輸入中的空白空間會(huì)被忽略,因此[(x ),(y)][ ( x ), ( y ) ]相同。

F.9.2. 精度

值在內(nèi)部被存儲(chǔ)為 64 位浮點(diǎn)數(shù)。這意味著超過(guò) 16 位有效位的數(shù)字將被截?cái)唷?/p>

F.9.3. 用法

表 F.3展示了為類(lèi)型cube提供的專(zhuān)用的操作符。

表 F.3. 立方體操作符

操作符

描述

cube && cubeboolean

立方體是否有重疊?

cube @> cubeboolean

第一個(gè)立方體是否包含第二個(gè)立方體?

cube <@ cubeboolean

第一個(gè)立方體是否包含在第二個(gè)立方體里面?

cube -> integerfloat8

提取立方體的第 n個(gè)坐標(biāo),(從1開(kāi)始計(jì)數(shù))。

cube ~> integerfloat8

提取立方體的第 n個(gè)坐標(biāo),以下列方式計(jì)數(shù): n = 2 * k - 1 表示第k個(gè)維度的下限, n = 2 * k 表示第k個(gè)維度的上限。 負(fù)的n表示相應(yīng)正坐標(biāo)的倒數(shù)值。此操作符專(zhuān)為 KNN-GiST 支持而設(shè)計(jì)。

cube <-> cubefloat8

計(jì)算兩個(gè)立方體之間的歐幾里德距離.

cube <#> cubefloat8

計(jì)算兩個(gè)立方體之間的直線(L-1 度量)距離。

cube <=> cubefloat8

計(jì)算兩個(gè)立方體之間的切比雪夫(L-inf 度量)距離.


(在 PostgreSQL 8.2 之前,包含操作符@><@分別被稱(chēng)為@~。這些名稱(chēng)仍然可用,但是已經(jīng)被廢棄并且最終將會(huì)退休。注意舊的名字與之前核心幾何數(shù)據(jù)類(lèi)型遵循的習(xí)慣相反?。?/p>

除上述操作符外,表 9.1 中顯示的常用比較操作符也可用于cube類(lèi)型。 這些操作符首先比較第一個(gè)坐標(biāo),如果它們相等再比較第二個(gè)坐標(biāo)等等。 它們主要為支持cube的 b樹(shù)索引操作符類(lèi)而存在,這類(lèi)操作符對(duì)支持cube列上的 UNIQUE 約束等很有用。 否則,這種排序沒(méi)有太大的實(shí)際作用。

cube模塊也為cube值提供了一個(gè) GiST 索引操作符類(lèi)。cube GiST 索引可以被用于在WHERE子句中通過(guò)=&&、@>以及 <@操作符來(lái)搜索值。

此外,cube GiST 索引可以被用在ORDER BY子句中通過(guò)度量操作符<-><#><=>來(lái)查找最近鄰。例如, 3-D 點(diǎn)(0.5, 0.5, 0.5)的最近鄰可以用下面的查詢(xún)很快地找到:

SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;

也可以用這種方式使用~>操作符來(lái)高效地檢索通過(guò)選定坐標(biāo)排序后的前幾個(gè)值。例如,可以用下面的查詢(xún)得到通過(guò)第一個(gè)坐標(biāo)(左下角)升序排列后的前幾個(gè)立方體:

SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;

以及得到通過(guò)右上角第一個(gè)坐標(biāo)降序排列后的 2-D 立方體:

SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;

表 F.4展示了可用的函數(shù)。

表 F.4. 立方體函數(shù)

函數(shù)

描述

示例

cube ( float8 ) → cube

制作一個(gè)一維立方體,其兩個(gè)坐標(biāo)都是相同的。

cube(1)(1)

cube ( float8, float8 ) → cube

制作一個(gè)一維立方體。

cube(1,2)(1),(2)

cube ( float8[] ) → cube

使用數(shù)組定義的坐標(biāo)制作一個(gè)零值的立方體

cube(ARRAY[1,2,3])(1, 2, 3)

cube ( float8[], float8[] ) → cube

用由兩個(gè)數(shù)組定義的右上和左下坐標(biāo)制造一個(gè)立方體,兩個(gè)數(shù)組必須等長(zhǎng)。

cube(ARRAY[1,2], ARRAY[3,4])(1, 2),(3, 4)

cube ( cube, float8 ) → cube

在一個(gè)現(xiàn)有的立方體上增加一維來(lái)制造一個(gè)新立方體,對(duì)新坐標(biāo)的各個(gè)端點(diǎn)都采用相同的值。這可以用于從計(jì)算得到的值逐漸地構(gòu)建立方體。

cube('(1,2),(3,4)'::cube, 5)(1, 2, 5),(3, 4, 5)

cube ( cube, float8, float8 ) → cube

在一個(gè)現(xiàn)有的立方體上增加一維來(lái)制造一個(gè)新立方體。這可以用于從計(jì)算得到的值逐漸地構(gòu)建立方體。

cube('(1,2),(3,4)'::cube, 5, 6)(1, 2, 5),(3, 4, 6)

cube_dim ( cube ) → integer

返回該立方體的維數(shù)。

cube_dim('(1,2),(3,4)')2

cube_ll_coord ( cube, integer ) → float8

返回一個(gè)立方體的左下角的第 n個(gè)坐標(biāo)值

cube_ll_coord('(1,2),(3,4)', 2)2

cube_ur_coord ( cube, integer ) → float8

返回一個(gè)立方體的右上角的第n個(gè)坐標(biāo)值

cube_ur_coord('(1,2),(3,4)', 2)4

cube_is_point ( cube ) → boolean

如果一個(gè)立方體是一個(gè)點(diǎn)則返回真,也就是兩個(gè)定義點(diǎn)相同。

cube_is_point(cube(1,1))t

cube_distance ( cube, cube ) → float8

返回兩個(gè)立方體之間的距離。如果兩個(gè)都是點(diǎn),這就是普通距離函數(shù)。

cube_distance('(1,2)', '(3,4)')2.8284271247461903

cube_subset ( cube, integer[] ) → cube

從一個(gè)現(xiàn)有的立方體制造一個(gè)新立方體,使用來(lái)自于一個(gè)數(shù)組的維索引列表。 它可以被用來(lái)抽取一個(gè)單一維度的端點(diǎn),或者它可以被用來(lái)去除維度,或者按照需要對(duì)它們重新排序。

cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2])(3),(7)

cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1])(5, 3, 1, 1),(8, 7, 6, 6)

cube_union ( cube, cube ) → cube

產(chǎn)生兩個(gè)立方體的并集。

cube_union('(1,2)', '(3,4)')(1, 2),(3, 4)

cube_inter ( cube, cube ) → cube

產(chǎn)生兩個(gè)立方體的交集。

cube_inter('(1,2)', '(3,4)')(3, 4),(1, 2)

cube_enlarge ( c cube, r double, n integer ) → cube

用一個(gè)指定的半徑r在至少n個(gè)維度上增加立方體的尺寸。 如果該半徑是負(fù)值,則該立方體會(huì)收縮。所有已定義的維度都會(huì)按照半徑r被改變。 左下坐標(biāo)按照 r被減小并且右上坐標(biāo)按照 r被增加。 如果一個(gè)左下坐標(biāo)被增加得超過(guò)對(duì)應(yīng)的右上坐標(biāo)(這只會(huì)發(fā)生在r < 0 時(shí)),則兩個(gè)坐標(biāo)會(huì)被設(shè)置為它們的均值。 如果n大于已定義的維度數(shù)并且該立方體被增加(r > 0), 則額外的維度會(huì)被加入以讓維度數(shù)達(dá)到n,對(duì)于額外的坐標(biāo)將使用 0 作為初始值。 這個(gè)函數(shù)可用來(lái)創(chuàng)建圍繞一個(gè)點(diǎn)的邊界框以搜索臨近點(diǎn)。

cube_enlarge('(1,2),(3,4)', 0.5, 3)(0.5, 1.5, -0.5),(3.5, 4.5, 0.5)


F.9.4. 默認(rèn)值

我相信這個(gè)并:

select cube_union('(0,5,2),(2,3,1)', '0');
cube_union
-------------------
(0, 0, 0),(2, 5, 2)
(1 row)

不會(huì)與常識(shí)矛盾,下面的交也不會(huì)

select cube_inter('(0,-1),(1,1)', '(-2),(2)');
cube_inter
-------------
(0, 0),(1, 0)
(1 row)

在所有不同維度立方體的二元操作中,我假定低緯度的那一個(gè)要做笛卡爾投影,即為字符串表示中被省略的坐標(biāo)取零。上面的例子等同于:

cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');

下列包含謂詞使用點(diǎn)語(yǔ)法,不過(guò)實(shí)際上第二個(gè)參數(shù)在內(nèi)部被表示為一個(gè)盒子。這種語(yǔ)法讓我們不必定義一種單獨(dú)的點(diǎn)類(lèi)型以及用于(盒子, 點(diǎn))謂詞的函數(shù)。

select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)

F.9.5. 注解

用法的例子可見(jiàn)回歸測(cè)試sql/cube.sql。

為了不容易出問(wèn)題,對(duì)于立方體的維度數(shù)有 100 的限制。如果你想要更大的立方體,可以在cubedata.h中修改。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)