Postgresql 中文操作指南

F.11. cube — a multi-dimensional cube data type #

此模块为多维数据集实现了数据类型 cube

This module implements a data type cube for representing multidimensional cubes.

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

This module is considered “trusted”, that is, it can be installed by non-superusers who have CREATE privilege on the current database.

F.11.1. Syntax #

Table F.2显示了_cube_类型的有效外部表示形式。x、_y_等表示浮点数。

Table F.2 shows the valid external representations for the cube type. x, y, etc. denote floating-point numbers.

Table F.2. Cube External Representations

External Syntax

Meaning

x

A one-dimensional point (or, zero-length one-dimensional interval)

(_x)_

Same as above

x1_,x2,…​,_xn

A point in n-dimensional space, represented internally as a zero-volume cube

(_x1,x2,…​,xn)_

Same as above

(_x),(y)_

A one-dimensional interval starting at x and ending at y or vice versa; the order does not matter

[(_x),(y)]_

Same as above

(_x1,…​,xn),(y1,…​,yn)_

An n-dimensional cube represented by a pair of its diagonally opposite corners

[(_x1,…​,xn),(y1,…​,yn)]_

Same as above

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

It does not matter which order the opposite corners of a cube are entered in. The cube functions automatically swap values if needed to create a uniform “lower left — upper right” internal representation. When the corners coincide, cube stores only one corner along with an “is point” flag to avoid wasting space.

输入时忽略空白,因此_[(x), (y)]_ 与 [ ( _x),(y)]_ 相同。

White space is ignored on input, so [(_x),(y)]_ is the same as [ ( _x ), ( y ) ]_.

F.11.2. Precision #

值在内部以 64 位浮点数的形式存储。这意味着拥有超过 16 个有效数字的数字会被截断。

Values are stored internally as 64-bit floating point numbers. This means that numbers with more than about 16 significant digits will be truncated.

F.11.3. Usage #

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

Table F.3 shows the specialized operators provided for type cube.

Table F.3. Cube Operators

Operator

Description

cube && cubeboolean

Do the cubes overlap?

cube @> cubeboolean

Does the first cube contain the second?

cube <@ cubeboolean

Is the first cube contained in the second?

cube integerfloat8

Extracts the n-th coordinate of the cube (counting from 1).

cube ~> integerfloat8

Extracts the n-th coordinate of the cube, counting in the following way: n = 2 * k - 1 means lower bound of k-th dimension, n = 2 * k means upper bound of k-th dimension. Negative n denotes the inverse value of the corresponding positive coordinate. This operator is designed for KNN-GiST support.

cube <→ cubefloat8

Computes the Euclidean distance between the two cubes.

cube <#> cubefloat8

Computes the taxicab (L-1 metric) distance between the two cubes.

cube <⇒ cubefloat8

Computes the Chebyshev (L-inf metric) distance between the two cubes.

除了上述运算符外,类型_cube_还可以使用在 Table 9.1中显示的常用比较运算符。这些运算符首先比较第一个坐标,如果相等,则比较第二个坐标,依此类推。它们主要用于支持_cube_的b树索引运算符类,例如,如果您希望对_cube_列设置UNIQUE约束,这可能很有用。否则,此顺序几乎没有实际用处。

In addition to the above operators, the usual comparison operators shown in Table 9.1 are available for type cube. These operators first compare the first coordinates, and if those are equal, compare the second coordinates, etc. They exist mainly to support the b-tree index operator class for cube, which can be useful for example if you would like a UNIQUE constraint on a cube column. Otherwise, this ordering is not of much practical use.

cube_模块还为_cube_值提供了GiST索引操作符类。_cube_GiST索引可用于使用=&&_、@>_和<@_算符在_WHERE_子句中搜索值。

The cube module also provides a GiST index operator class for cube values. A cube GiST index can be used to search for values using the =, &&, @>, and <@ operators in WHERE clauses.

此外,cube_GiST索引可用于使用<→<#>_和_<⇒_计算算符在_ORDER BY_子句中查找最近邻。例如,可以高效地找到3-D点(0.5,0.5,0.5)的最近邻:

In addition, a cube GiST index can be used to find nearest neighbors using the metric operators <→, <#>, and <⇒ in ORDER BY clauses. For example, the nearest neighbor of the 3-D point (0.5, 0.5, 0.5) could be found efficiently with:

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

_~>_算符还可以这样使用,以高效地检索按某个选定的坐标排序的前几个值。例如,要按第一个坐标(左下角)升序对前几个立方体进行排序,可以使用以下查询:

The ~> operator can also be used in this way to efficiently retrieve the first few values sorted by a selected coordinate. For example, to get the first few cubes ordered by the first coordinate (lower left corner) ascending one could use the following query:

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

并且按右上角的第一个坐标降序对2-D立方体进行排序:

And to get 2-D cubes ordered by the first coordinate of the upper right corner descending:

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

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

Table F.4 shows the available functions.

Table F.4. Cube Functions

Function

Description

Example(s)

cube ( float8 ) → cube

Makes a one dimensional cube with both coordinates the same.

cube(1)(1)

cube ( float8, float8 ) → cube

Makes a one dimensional cube.

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

cube ( float8[] ) → cube

Makes a zero-volume cube using the coordinates defined by the array.

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

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

Makes a cube with upper right and lower left coordinates as defined by the two arrays, which must be of the same length.

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

cube ( cube, float8 ) → cube

Makes a new cube by adding a dimension on to an existing cube, with the same values for both endpoints of the new coordinate. This is useful for building cubes piece by piece from calculated values.

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

cube ( cube, float8, float8 ) → cube

Makes a new cube by adding a dimension on to an existing cube. This is useful for building cubes piece by piece from calculated values.

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

cube_dim ( cube ) → integer

Returns the number of dimensions of the cube.

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

cube_ll_coord ( cube, integer ) → float8

Returns the n-th coordinate value for the lower left corner of the cube.

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

cube_ur_coord ( cube, integer ) → float8

Returns the n-th coordinate value for the upper right corner of the cube.

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

cube_is_point ( cube ) → boolean

Returns true if the cube is a point, that is, the two defining corners are the same.

cube_is_point(cube(1,1))t

cube_distance ( cube, cube ) → float8

Returns the distance between two cubes. If both cubes are points, this is the normal distance function.

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

cube_subset ( cube, integer[] ) → cube

Makes a new cube from an existing cube, using a list of dimension indexes from an array. Can be used to extract the endpoints of a single dimension, or to drop dimensions, or to reorder them as desired.

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

Produces the union of two cubes.

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

cube_inter ( cube, cube ) → cube

Produces the intersection of two cubes.

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

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

Increases the size of the cube by the specified radius r in at least n dimensions. If the radius is negative the cube is shrunk instead. All defined dimensions are changed by the radius r. Lower-left coordinates are decreased by r and upper-right coordinates are increased by r. If a lower-left coordinate is increased to more than the corresponding upper-right coordinate (this can only happen when r < 0) than both coordinates are set to their average. If n is greater than the number of defined dimensions and the cube is being enlarged (r > 0), then extra dimensions are added to make n altogether; 0 is used as the initial value for the extra coordinates. This function is useful for creating bounding boxes around a point for searching for nearby points.

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

F.11.4. Defaults #

此并集:

This union:

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

不违背常识,交集也不违背:

does not contradict common sense, neither does the intersection:

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

在不同维度立方体上的所有二元操作中,较低维度的一个被认为是笛卡尔投影,即,具有在字符串表示中被忽略的坐标的零。上述例子等同于:

In all binary operations on differently-dimensioned cubes, the lower-dimensional one is assumed to be a Cartesian projection, i. e., having zeroes in place of coordinates omitted in the string representation. The above examples are equivalent to:

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

以下包含谓词使用点语法,而事实上第二个参数在内部由一个方框表示。此语法消除了定义一个单独的点类型和(方框、点)谓词函数的必要性。

The following containment predicate uses the point syntax, while in fact the second argument is internally represented by a box. This syntax makes it unnecessary to define a separate point type and functions for (box,point) predicates.

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

F.11.5. Notes #

有关使用方法的示例,请参阅回归测试 sql/cube.sql

For examples of usage, see the regression test sql/cube.sql.

为了让人们更难破坏组件,对立方体的维数有一个 100 的限制。如果您需要更大的限制,请在 cubedata.h 设置。

To make it harder for people to break things, there is a limit of 100 on the number of dimensions of cubes. This is set in cubedata.h if you need something bigger.

F.11.6. Credits #

原始作者:基因塞尔科夫,Jr. < link:mailto:selkovjr@mcs.anl.gov[selkovjr@mcs.anl.gov]> ,数学和计算机科学分部,阿贡国家实验室。

Original author: Gene Selkov, Jr. <link:mailto:selkovjr@mcs.anl.gov[selkovjr@mcs.anl.gov]>, Mathematics and Computer Science Division, Argonne National Laboratory.

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

My thanks are primarily to Prof. Joe Hellerstein (https://dsf.berkeley.edu/jmh/) for elucidating the gist of the GiST (http://gist.cs.berkeley.edu/), and to his former student Andy Dong for his example written for Illustra. I am also grateful to all Postgres developers, present and past, for enabling myself to create my own world and live undisturbed in it. And I would like to acknowledge my gratitude to Argonne Lab and to the U.S. Department of Energy for the years of faithful support of my database research.

2002 年 8/9 月,布鲁诺沃尔夫三世 < link:mailto:bruno@wolff.to[bruno@wolff.to]> 对这个包进行了小更新。包括将精度从单精度改成双精度并添加一些新函数。

Minor updates to this package were made by Bruno Wolff III <link:mailto:bruno@wolff.to[bruno@wolff.to]> in August/September of 2002. These include changing the precision from single precision to double precision and adding some new functions.

2006 年 7 月,乔舒亚里奇 < link:mailto:josh@root.net[josh@root.net]> 对这个包进行了其他更新。包括 cube(float8[], float8[]) ,并将代码清理干净,不再用已废弃的 V0 协议,而是使用 V1 调用协议。

Additional updates were made by Joshua Reich <link:mailto:josh@root.net[josh@root.net]> in July 2006. These include cube(float8[], float8[]) and cleaning up the code to use the V1 call protocol instead of the deprecated V0 protocol.