Skip to content

F.11. cube — 多维立方体数据类型#

F.11.1. 语法
F.11.2. 精度
F.11.3. 用法
F.11.4. 默认值
F.11.5. 备注
F.11.6. 鸣谢

此模块实现了一个数据类型cube,用于表示多维立方体。

此模块被认为是“受信任的”,也就是说,它可以由在当前数据库上具有CREATE权限的非超级用户安装。

F.11.1. 语法#

表 F.2显示了cube类型的有效外部表示。x、*y*等表示浮点数。

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

外部语法含义
x一维点(或零长度一维区间)
(x)与上述相同
x1,x2,...,xnn 维空间中的一个点,在内部表示为零体积立方体
(x1,x2,...,xn)与上述相同
(x),(y)一维区间,从 x 开始,在 y 结束,或反之亦然;顺序无关紧要
[(x),(y)]与上述相同
(x1,...,xn),(y1,...,yn)由一对对角线相对的角表示的 n 维立方体
[(x1,...,xn),(y1,...,yn)]与上述相同

以何种顺序输入立方体的相对角并不重要。cube函数会根据需要自动交换值,以创建统一的“左下角 — 右上角”内部表示。当角重合时,cube仅存储一个角以及一个“是点”标志,以避免浪费空间。

输入时会忽略空格,因此[(*x*),(*y*)][ (*x*), (*y*) ]相同。

F.11.2. 精度#

值在内部存储为 64 位浮点数。这意味着,超过约 16 个有效数字的数字将被截断。

F.11.3. 用法#

表 F.3显示了为类型cube提供的专门运算符。

表 F.3. Cube 运算符

运算符

描述

cube && cubeboolean

Cube 是否重叠?

cube @> cubeboolean

第一个 Cube 是否包含第二个 Cube?

cube <@ cubeboolean

第一个 Cube 是否包含在第二个 Cube 中?

cube -> integerfloat8

提取 Cube 的第 n 个坐标(从 1 开始计数)。

cube ~> integerfloat8

提取 Cube 的第 n 个坐标,按以下方式计数:n = 2 * k - 1 表示第 k 维的下界,n = 2 * k 表示第 k 维的上界。负 n 表示相应正坐标的逆值。此运算符专为 KNN-GiST 支持而设计。

cube <-> cubefloat8

计算两个 Cube 之间的欧几里得距离。

cube <#> cubefloat8

计算两个 Cube 之间的出租车(L-1 度量)距离。

cube <=> cubefloat8

计算两个 Cube 之间的切比雪夫(L-inf 度量)距离。

除了上述运算符外,表 9.1中所示的常见比较运算符也可用于类型cube。这些运算符首先比较第一个坐标,如果相等,则比较第二个坐标,依此类推。它们主要用于支持cube的 b 树索引运算符类,例如,如果您希望对cube列进行 UNIQUE 约束,这可能很有用。否则,此排序在实践中并没有多大用处。

cube模块还为cube值提供了一个 GiST 索引运算符类。cubeGiST 索引可用于在WHERE子句中使用运算符=&&@><@搜索值。

此外,cubeGiST 索引可用于在ORDER BY子句中使用度量运算符<-><#><=>查找最近邻域。例如,可以使用以下方法有效地找到 3-D 点 (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;

要按右上角的第一个坐标降序排列 2-D 立方体

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

表 F.4显示了可用的函数。

表 F.4 立方体函数

函数

描述

示例

cube ( float8 ) → cube

创建一个一维立方体,其两个坐标相同。

cube(1)(1)

cube ( float8, float8 ) → cube

创建一个一维立方体。

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

cube ( float8[] ) → cube

使用数组中定义的坐标创建零体积立方体。

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

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

使用两个数组定义的右上角和左下角坐标创建立方体,这两个数组的长度必须相同。

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

cube ( cube, float8 ) → cube

通过在现有立方体上添加一个维度来创建一个新的立方体,新坐标的两个端点具有相同的值。这对于根据计算值逐个构建立方体非常有用。

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

cube ( cube, float8, float8 ) → cube

通过在现有立方体上添加一个维度来创建一个新的立方体。这对于根据计算值逐个构建立方体非常有用。

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

cube_dim ( cube ) → integer

返回立方体的维度数。

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

cube_ll_coord ( cube, integer ) → float8

返回立方体左下角的第 n 个坐标值。

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

cube_ur_coord ( cube, integer ) → float8

返回立方体右上角的第 n 个坐标值。

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

cube_is_point ( cube ) → boolean

如果该立方体是一个点,即两个定义的角是相同的,则返回 true。

cube_is_point(cube(1,1))t

cube_distance ( cube, cube ) → float8

返回两个立方体之间的距离。如果两个立方体都是点,则这是正常的距离函数。

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

cube_subset ( cube, integer[] ) → cube

使用数组中的维度索引列表,根据现有立方体创建一个新立方体。可用于提取单个维度的端点,或删除维度,或按需要重新排列维度。

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

生成两个立方体的并集。

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

cube_inter ( cube, cube ) → cube

生成两个立方体的交集。

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

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

将立方体的大小至少在 n 个维度中增加指定的半径 r。如果半径为负,则缩小立方体。所有已定义的维度都将更改为半径 r。左下角坐标减少 r,右上角坐标增加 r。如果左下角坐标增加到大于相应的右上角坐标(这仅在 r < 0 时发生),则两个坐标都将设置为其平均值。如果 n 大于已定义维度的数量,并且立方体正在扩大(r > 0),则添加额外的维度以使 n 总计;0 用作额外坐标的初始值。此函数可用于在点周围创建边界框,以搜索附近的点。

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

F.11.4. 默认值#

此联合

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)');

以下包含谓词使用点语法,而实际上第二个参数在内部由一个框表示。此语法使得不必定义一个单独的点类型和用于 (box,point) 谓词的函数。

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

F.11.5. 注释#

有关用法示例,请参见回归测试sql/cube.sql

为了让人们更难破坏事物,立方体维度数量的限制为 100。如果您需要更大的数量,请在cubedata.h中设置。

F.11.6. 鸣谢#

最初作者:Gene Selkov, Jr.<[[email protected]](/cdn-cgi/l/email-protection#295a4c4542465f435b69444a5a07484745074e465f)>,数学与计算机科学部,阿贡国家实验室。

我首先要感谢 Joe Hellerstein 教授 (https://dsf.berkeley.edu/jmh/),他阐明了 GiST (http://gist.cs.berkeley.edu/) 的要点,还要感谢他以前的学生 Andy Dong,他为 Illustra 编写了示例。我也感谢所有 Postgres 开发者,无论过去还是现在,他们让我能够创造自己的世界并安然无恙地生活在其中。我还要感谢阿贡实验室和美国能源部多年来对我数据库研究的忠实支持。

此软件包的次要更新由 Bruno Wolff III<[[email protected]](/cdn-cgi/l/email-protection#9bf9e9eef5f4dbecf4f7fdfdb5eff4)>在 2002 年 8 月/9 月完成。这些更新包括将精度从单精度更改为双精度,并添加了一些新函数。

Joshua Reich<[[email protected]](/cdn-cgi/l/email-protection#670d08140f271508081349090213)>在 2006 年 7 月进行了其他更新。这些更新包括cube(float8[], float8[]),并清理了代码以使用 V1 调用协议,而不是弃用的 V0 协议。