该模块实现了用于表示多维立方体的cube数据类型。
该模块被视为“受信任的”,也就是说,拥有当前数据库 CREATE权限的非超级用户也可以安装它。
Table F.1展示了cube类型合法的外部表示。 x、y等表示浮点数。
Table F.1. cube 外部表示
| 外部语法 | 含义 |
|---|---|
|
一个一维点 (或者长度为零的一维区间) |
( |
同上 |
|
n 维空间中的一个点,在内部表示为零体积立方体 |
( |
同上 |
( |
一个从x开始、到y结束的一维区间, 反过来也可以;顺序无关紧要 |
[( |
同上 |
( |
一个 n 维立方体,由一对对角相对的角点表示 |
[( |
同上 |
立方体的两个对角点以何种顺序输入都无关紧要。必要时, cube函数会自动交换这些值,以创建统一的 “左下角 — 右上角”内部表示。当两个角点重合时, cube只存储其中一个角点,并附带一个“is point”标志, 以避免浪费空间。
输入时会忽略空白字符,因此 [(与 x),(y)][ ( 相同。x ), ( y ) ]
值在内部以 64 位浮点数存储。这意味着有效数字超过大约 16 位的数值会被截断。
Table F.2展示了为cube类型提供的专用操作符。
Table F.2. cube 操作符
|
操作符 描述 |
|---|
|
两个立方体是否重叠? |
|
第一个立方体是否包含第二个立方体? |
|
第一个立方体是否包含在第二个立方体中? |
|
提取立方体的第 |
|
提取立方体的第 |
|
计算两个立方体之间的欧几里得距离。 |
|
计算两个立方体之间的出租车(L-1 度量)距离。 |
|
计算两个立方体之间的切比雪夫(L-inf 度量)距离。 |
除了上述操作符外,Table 9.1中列出的常见比较操作符 也可用于cube类型。这些操作符先比较第一个坐标;如果两者相等,再比较第二个坐标, 依此类推。它们主要是为了支持cube的 B-树索引操作符类而存在;例如, 如果你希望在cube列上定义 UNIQUE 约束,这会很有用。 除此之外,这种排序在实践中并没有太大用处。
cube模块还为cube值提供了一个 GiST 索引操作符类。 cube GiST 索引可用于在WHERE子句中使用 =、&&、@> 和<@操作符搜索值。
此外,cube GiST 索引还可用于在ORDER BY子句中借助度量操作符 <->、<#>和 <=>查找最近邻。例如,三维点 (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;
要获得按右上角第一个坐标降序排列的二维立方体,可以使用:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
Table F.3展示了可用函数。
Table F.3. cube 函数
|
函数 描述 示例 |
|---|
|
创建一个一维立方体,其两个坐标相同。
|
|
创建一个一维立方体。
|
|
根据数组定义的坐标创建一个零体积立方体。
|
|
创建一个立方体,其右上角和左下角坐标由这两个数组定义,这两个数组必须等长。
|
|
通过向现有立方体增加一个维度来创建新的立方体,新坐标的两个端点取相同的值。 这可用于根据计算得到的值逐步构建立方体。
|
|
通过向现有立方体增加一个维度来创建新的立方体。这可用于根据计算得到的值逐步构建立方体。
|
|
返回立方体的维数。
|
|
返回立方体左下角的第
|
|
返回立方体右上角的第
|
|
如果立方体是一个点,也就是定义它的两个角相同,则返回真。
|
|
返回两个立方体之间的距离。如果两个立方体都是点,这就是普通的距离函数。
|
|
根据数组中给出的维度索引列表,从现有立方体创建一个新立方体。 可用于提取单个维度的端点、删除维度,或者按需要重新排列维度。
|
|
生成两个立方体的并集。
|
|
生成两个立方体的交集。
|
|
以指定的半径
|
下面这个并集:
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)');
下面的包含谓词使用的是点语法,但实际上第二个参数在内部表示为一个 box。 这种语法使我们无须单独定义点类型以及用于 (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>, 阿贡国家实验室数学与计算机科学部。
我首先要感谢 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 协议。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。