pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
该模块实现了用于表示多维立方体的cube数据类型。
表 F.1展示了cube类型合法的外部表示。 x、y等表示浮点数。
表 F.1. Cube external representations
|
一个一维点 (或者长度为零的一维区间) |
( |
同上 |
|
n 维空间中的一个点,在内部表示为零体积立方体 |
( |
同上 |
( |
一个从x开始、到y结束的一维区间, 反过来也可以;顺序无关紧要 |
[( |
同上 |
( |
一个 n 维立方体,由一对对角相对的角点表示 |
[( |
同上 |
立方体的两个对角点以何种顺序输入都无关紧要。必要时, cube函数会自动交换这些值,以创建统一的 “左下角 — 右上角”内部表示。
空白会被忽略,因此 [(与 x),(y)][ ( 相同。x ), ( y ) ]
值在内部以 64 位浮点数存储。这意味着有效数字超过大约 16 位的数值会被截断。
cube模块为cube值提供了一个 GiST 索引操作符类。 GiST 操作符类支持的操作符如表 F.2所示。
表 F.2. Cube GiST operators
| 操作符 | 描述 |
|---|---|
a = b |
立方体 a 和 b 相同。 |
a && b |
立方体 a 和 b 重叠。 |
a @> b |
立方体 a 包含立方体 b。 |
a <@ b |
立方体 a 包含在立方体 b 中。 |
(在 PostgreSQL 8.2 之前,包含操作符 @> 和 <@ 分别称为 @ 和 ~。这些名称仍然可用,但已弃用,最终将被删除。请注意,旧名称与核心几何数据类型以前采用的约定正好相反!)
也提供了标准的 B-树操作符,例如
| 操作符 | 描述 |
|---|---|
[a, b] < [c, d] |
小于 |
[a, b] > [c, d] |
大于 |
这些操作符除了排序之外,在实际用途上没有太大意义。它们首先比较 (a) 与 (c), 如果相等,再比较 (b) 与 (d)。这在大多数情况下能得到相当好的排序结果, 如果你希望对此类型使用 ORDER BY,这会很有用。
表 F.3展示了可用函数。
表 F.3. Cube functions
cube(float8) returns cube |
创建一个一维立方体,其两个坐标相同。 cube(1) == '(1)' |
cube(float8, float8) returns cube |
创建一个一维立方体。 cube(1,2) == '(1),(2)' |
cube(float8[]) returns cube |
根据数组定义的坐标创建一个零体积立方体。 cube(ARRAY[1,2]) == '(1,2)' |
cube(float8[], float8[]) returns cube |
创建一个立方体,其右上角和左下角坐标由这两个数组定义,这两个数组必须等长。 cube('{1,2}'::float[], '{3,4}'::float[]) == '(1,2),(3,4)' |
cube(cube, float8) returns cube |
通过向现有立方体增加一个维度来创建新的立方体,新坐标的两部分取相同的值。 这可用于根据计算得到的值逐步构建立方体。 cube('(1)',2) == '(1,2),(1,2)' |
cube(cube, float8, float8) returns cube |
通过向现有立方体增加一个维度来创建新的立方体。这可用于根据计算得到的值逐步构建立方体。 cube('(1,2)',3,4) == '(1,3),(2,4)' |
cube_dim(cube) returns int |
返回立方体的维数 |
cube_ll_coord(cube, int) returns double |
返回立方体左下角的第 n 个坐标值 |
cube_ur_coord(cube, int) returns double |
返回立方体右上角的第 n 个坐标值 |
cube_is_point(cube) returns bool |
如果立方体是一个点,也就是定义它的两个角相同,则返回真。 |
cube_distance(cube, cube) returns double |
返回两个立方体之间的距离。如果两个立方体都是点,这就是普通的距离函数。 |
cube_subset(cube, int[]) returns cube |
根据数组中给出的维度索引列表,从现有立方体创建一个新立方体。 可用于找出单个维度的左下角(LL)和右上角(UR)坐标,例如, 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) returns cube |
生成两个立方体的并集 |
cube_inter(cube, cube) returns cube |
生成两个立方体的交集 |
cube_enlarge(cube c, double r, int n) returns cube |
将立方体至少 n 个维度的大小增加指定半径。如果半径为负,则改为缩小立方体。 此函数对于创建点周围的边界框、以搜索附近点很有用。所有已定义的维度都会按半径 r 改变。 左下角(LL)坐标减小 r,右上角(UR)坐标增大 r。如果某个左下角坐标增大到超过 对应的右上角坐标(这只可能在 r < 0 时发生),则将两个坐标都设为它们的平均值。 如果 n 大于已定义维度数且立方体正在扩大(r >= 0),则额外坐标以 0 作为基准。 |
下面这个并集:
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 教授 (http://db.cs.berkeley.edu/jmh/), 他为我阐明了 GiST (http://gist.cs.berkeley.edu/) 的要旨; 也感谢他曾经的学生 Andy Dong (http://best.me.berkeley.edu/~adong/) 为 Illustra 编写了示例, http://best.berkeley.edu/~adong/rtree/index.html。 我同样感谢过去和现在所有的 Postgres 开发者, 他们使我得以创造自己的世界并在其中不受打扰地生活。 我还要感谢阿贡实验室以及美国能源部,多年来始终如一地支持我的数据库研究。
Bruno Wolff III <bruno@wolff.to> 在 2002 年 8 月和 9 月 对该软件包做了一些小更新,包括将精度从单精度改为双精度,并增加了一些新函数。
Joshua Reich <josh@root.net> 在 2006 年 7 月做了进一步更新。 这些更新包括加入cube(float8[], float8[]), 并清理代码,使其使用 V1 调用协议而不是已废弃的 V0 协议。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。