PostgreSQL 9.3.4 文档 | ||||
---|---|---|---|---|
Prev | Up | Appendix F. 额外提供的模块 | Next |
这个模块实现了一种数据类型cube来表示多维立方体。
Table F-1展示了cube类型有效的外部表示。x、y等表示浮点数。
Table F-1. 立方体外部表示
x | 一个一维点(或者长度为零的一维区间) |
(x) | 同上 |
x1,x2,...,xn | n-维空间中的一个点,内部表示为一个零容积立方体 |
(x1,x2,...,xn) | 同上 |
(x),(y) | 开始于x并且结束于y的一个一维区间,反之亦然。顺序并不重要 |
[(x),(y)] | 同上 |
(x1,...,xn),(y1,...,yn) | 一个 n-维立方体,用它的对角顶点对表示 |
[(x1,...,xn),(y1,...,yn)] | 同上 |
一个立方体的对角录入的顺序无关紧要。如果需要创建一种统一的"左下 — 右上"的内部表示,cube函数会自动地交换值。
空白空间会被忽略,因此[(x),(y)]与[ ( x ), ( y ) ]相同。
值在内部被存储为 64 位浮点数。这意味着超过 16 位有效位的数字将被截断。
cube模块包括一个用于cube值的 GiST 索引操作符类。Table F-2中展示了 GiST 操作符类支持的操作符。
Table F-2. 立方体 GiST 操作符
操作符 | 描述 |
---|---|
a = b | 立方体 a 和 b 相同。 |
a && b | 立方体 a 和 b 重叠。 |
a @> b | 立方体 a 包含 立方体 b。 |
a <@ b | 立方体 a 被包含在立方体 b 中。 |
(在 PostgreSQL 8.2 之前,包含操作符@>和<@分别被称为@和~。这些名称仍然可用,但是已经被废弃并且最终将会退休。注意旧的名字与之前核心几何数据类型遵循的习惯相反!)
也提供了标准的 B-树操作符,例如
这些操作符除了排序之外没有什么实际意义。这些操作符首先比较 a 和 c,如果相等再比较 b 和 d。这在大部分情况下能导致不错的排序,如果你想对这种类型使用 ORDER BY 这将有所帮助。Table F-3展示了可用的函数。
Table F-3. 立方体函数
cube(float8) 返回 cube | 制造一个一维立方体,坐标都是相同的。 cube(1) == '(1)' |
cube(float8, float8) 返回 cube | 制造一个一维立方体。 cube(1,2) == '(1),(2)' |
cube(float8[]) 返回 cube | 使用数组定义的坐标制造一个零容积的立方体。 cube(ARRAY[1,2]) == '(1,2)' |
cube(float8[], float8[]) 返回 cube | 用由两个数组定义的右上和左下坐标制造一个立方体,两个数组必须等长。 cube('{1,2}'::float[], '{3,4}'::float[]) == '(1,2),(3,4)' |
cube(cube, float8) 返回 cube | 在一个现有的立方体上增加一维来制造一个新立方体,对新坐标的各个部分都采用相同的值。这可以用于从计算得到的值逐渐地构建立方体。 cube('(1)',2) == '(1,2),(1,2)' |
cube(cube, float8, float8) 返回 cube | 在一个现有的立方体上增加一维来制造一个新立方体。这可以用于从计算得到的值逐渐地构建立方体。cube('(1,2)',3,4) == '(1,3),(2,4)' |
cube_dim(cube) 返回 int | 返回该立方体的维数 |
cube_ll_coord(cube, int) 返回 double | 返回一个立方体的左下角的第 n 个坐标值 |
cube_ur_coord(cube, int) 返回 double | 返回一个立方体的右上角的第 n 个坐标值 |
cube_is_point(cube) 返回 bool | 如果一个立方体是一个点则返回真,也就是两个定义点相同。 |
cube_distance(cube, cube) 返回 double | 返回两个立方体之间的距离。如果两个都是点,这就是普通距离函数。 |
cube_subset(cube, int[]) 返回 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) 返回 cube | 产生两个立方体的并 |
cube_inter(cube, cube) 返回 cube | 产生两个立方体的交 |
cube_enlarge(cube c, double r, int n) 返回 cube | 用一个指定的半径在至少 n 个维度上增加立方体的尺寸。如果该半径是负值,则该立方体会收缩。这有助于围绕一个点创建一个外包盒来搜索附近点。所有已定义的维度都会按照半径 r 被改变。LL 坐标按照 r 被减小并且 UR 坐标按照 r 被增加。如果一个 LL 坐标被增加得超过对应的 UR 坐标(这只会发生在 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)
在所有不同维度立方体的二元操作中,我假定低纬度的那一个要做笛卡尔投影,即为字符串表示中被省略的坐标取零。上面的例子等同于:
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 教授(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[])并且将代码从废弃的 V0 协议改到 V1 调用协议。