2 F.10. cube — a multi-dimensional cube data type #
11 This module implements a data type cube for representing
12 multidimensional cubes.
14 This module is considered “trusted”, that is, it can be installed by
15 non-superusers who have CREATE privilege on the current database.
19 Table F.1 shows the valid external representations for the cube type.
20 x, y, etc. denote floating-point numbers.
22 Table F.1. Cube External Representations
23 External Syntax Meaning
24 x A one-dimensional point (or, zero-length one-dimensional interval)
26 x1,x2,...,xn A point in n-dimensional space, represented internally as
28 (x1,x2,...,xn) Same as above
29 (x),(y) A one-dimensional interval starting at x and ending at y or
30 vice versa; the order does not matter
31 [(x),(y)] Same as above
32 (x1,...,xn),(y1,...,yn) An n-dimensional cube represented by a pair of
33 its diagonally opposite corners
34 [(x1,...,xn),(y1,...,yn)] Same as above
36 It does not matter which order the opposite corners of a cube are
37 entered in. The cube functions automatically swap values if needed to
38 create a uniform “lower left — upper right” internal representation.
39 When the corners coincide, cube stores only one corner along with an
40 “is point” flag to avoid wasting space.
42 White space is ignored on input, so [(x),(y)] is the same as [ ( x ), (
47 Values are stored internally as 64-bit floating point numbers. This
48 means that numbers with more than about 16 significant digits will be
53 Table F.2 shows the specialized operators provided for type cube.
55 Table F.2. Cube Operators
61 cube && cube → boolean
65 cube @> cube → boolean
67 Does the first cube contain the second?
69 cube <@ cube → boolean
71 Is the first cube contained in the second?
73 cube -> integer → float8
75 Extracts the n-th coordinate of the cube (counting from 1).
77 cube ~> integer → float8
79 Extracts the n-th coordinate of the cube, counting in the following
80 way: n = 2 * k - 1 means lower bound of k-th dimension, n = 2 * k means
81 upper bound of k-th dimension. Negative n denotes the inverse value of
82 the corresponding positive coordinate. This operator is designed for
85 cube <-> cube → float8
87 Computes the Euclidean distance between the two cubes.
89 cube <#> cube → float8
91 Computes the taxicab (L-1 metric) distance between the two cubes.
93 cube <=> cube → float8
95 Computes the Chebyshev (L-inf metric) distance between the two cubes.
97 In addition to the above operators, the usual comparison operators
98 shown in Table 9.1 are available for type cube. These operators first
99 compare the first coordinates, and if those are equal, compare the
100 second coordinates, etc. They exist mainly to support the b-tree index
101 operator class for cube, which can be useful for example if you would
102 like a UNIQUE constraint on a cube column. Otherwise, this ordering is
103 not of much practical use.
105 The cube module also provides a GiST index operator class for cube
106 values. A cube GiST index can be used to search for values using the =,
107 &&, @>, and <@ operators in WHERE clauses.
109 In addition, a cube GiST index can be used to find nearest neighbors
110 using the metric operators <->, <#>, and <=> in ORDER BY clauses. For
111 example, the nearest neighbor of the 3-D point (0.5, 0.5, 0.5) could be
112 found efficiently with:
113 SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
115 The ~> operator can also be used in this way to efficiently retrieve
116 the first few values sorted by a selected coordinate. For example, to
117 get the first few cubes ordered by the first coordinate (lower left
118 corner) ascending one could use the following query:
119 SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
121 And to get 2-D cubes ordered by the first coordinate of the upper right
123 SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
125 Table F.3 shows the available functions.
127 Table F.3. Cube Functions
135 cube ( float8 ) → cube
137 Makes a one dimensional cube with both coordinates the same.
141 cube ( float8, float8 ) → cube
143 Makes a one dimensional cube.
147 cube ( float8[] ) → cube
149 Makes a zero-volume cube using the coordinates defined by the array.
151 cube(ARRAY[1,2,3]) → (1, 2, 3)
153 cube ( float8[], float8[] ) → cube
155 Makes a cube with upper right and lower left coordinates as defined by
156 the two arrays, which must be of the same length.
158 cube(ARRAY[1,2], ARRAY[3,4]) → (1, 2),(3, 4)
160 cube ( cube, float8 ) → cube
162 Makes a new cube by adding a dimension on to an existing cube, with the
163 same values for both endpoints of the new coordinate. This is useful
164 for building cubes piece by piece from calculated values.
166 cube('(1,2),(3,4)'::cube, 5) → (1, 2, 5),(3, 4, 5)
168 cube ( cube, float8, float8 ) → cube
170 Makes a new cube by adding a dimension on to an existing cube. This is
171 useful for building cubes piece by piece from calculated values.
173 cube('(1,2),(3,4)'::cube, 5, 6) → (1, 2, 5),(3, 4, 6)
175 cube_dim ( cube ) → integer
177 Returns the number of dimensions of the cube.
179 cube_dim('(1,2),(3,4)') → 2
181 cube_ll_coord ( cube, integer ) → float8
183 Returns the n-th coordinate value for the lower left corner of the
186 cube_ll_coord('(1,2),(3,4)', 2) → 2
188 cube_ur_coord ( cube, integer ) → float8
190 Returns the n-th coordinate value for the upper right corner of the
193 cube_ur_coord('(1,2),(3,4)', 2) → 4
195 cube_is_point ( cube ) → boolean
197 Returns true if the cube is a point, that is, the two defining corners
200 cube_is_point(cube(1,1)) → t
202 cube_distance ( cube, cube ) → float8
204 Returns the distance between two cubes. If both cubes are points, this
205 is the normal distance function.
207 cube_distance('(1,2)', '(3,4)') → 2.8284271247461903
209 cube_subset ( cube, integer[] ) → cube
211 Makes a new cube from an existing cube, using a list of dimension
212 indexes from an array. Can be used to extract the endpoints of a single
213 dimension, or to drop dimensions, or to reorder them as desired.
215 cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) → (3),(7)
217 cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) → (5, 3, 1, 1),(8,
220 cube_union ( cube, cube ) → cube
222 Produces the union of two cubes.
224 cube_union('(1,2)', '(3,4)') → (1, 2),(3, 4)
226 cube_inter ( cube, cube ) → cube
228 Produces the intersection of two cubes.
230 cube_inter('(1,2)', '(3,4)') → (3, 4),(1, 2)
232 cube_enlarge ( c cube, r double, n integer ) → cube
234 Increases the size of the cube by the specified radius r in at least n
235 dimensions. If the radius is negative the cube is shrunk instead. All
236 defined dimensions are changed by the radius r. Lower-left coordinates
237 are decreased by r and upper-right coordinates are increased by r. If a
238 lower-left coordinate is increased to more than the corresponding
239 upper-right coordinate (this can only happen when r < 0) than both
240 coordinates are set to their average. If n is greater than the number
241 of defined dimensions and the cube is being enlarged (r > 0), then
242 extra dimensions are added to make n altogether; 0 is used as the
243 initial value for the extra coordinates. This function is useful for
244 creating bounding boxes around a point for searching for nearby points.
246 cube_enlarge('(1,2),(3,4)', 0.5, 3) → (0.5, 1.5, -0.5),(3.5, 4.5, 0.5)
251 select cube_union('(0,5,2),(2,3,1)', '0');
257 does not contradict common sense, neither does the intersection:
258 select cube_inter('(0,-1),(1,1)', '(-2),(2)');
264 In all binary operations on differently-dimensioned cubes, the
265 lower-dimensional one is assumed to be a Cartesian projection, i. e.,
266 having zeroes in place of coordinates omitted in the string
267 representation. The above examples are equivalent to:
268 cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
269 cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
271 The following containment predicate uses the point syntax, while in
272 fact the second argument is internally represented by a box. This
273 syntax makes it unnecessary to define a separate point type and
274 functions for (box,point) predicates.
275 select cube_contains('(0,0),(1,1)', '0.5,0.5');
283 For examples of usage, see the regression test sql/cube.sql.
285 To make it harder for people to break things, there is a limit of 100
286 on the number of dimensions of cubes. This is set in cubedata.h if you
287 need something bigger.
291 Original author: Gene Selkov, Jr. <selkovjr@mcs.anl.gov>, Mathematics
292 and Computer Science Division, Argonne National Laboratory.
294 My thanks are primarily to Prof. Joe Hellerstein
295 (https://dsf.berkeley.edu/jmh/) for elucidating the gist of the GiST
296 (http://gist.cs.berkeley.edu/), and to his former student Andy Dong for
297 his example written for Illustra. I am also grateful to all Postgres
298 developers, present and past, for enabling myself to create my own
299 world and live undisturbed in it. And I would like to acknowledge my
300 gratitude to Argonne Lab and to the U.S. Department of Energy for the
301 years of faithful support of my database research.
303 Minor updates to this package were made by Bruno Wolff III
304 <bruno@wolff.to> in August/September of 2002. These include changing
305 the precision from single precision to double precision and adding some
308 Additional updates were made by Joshua Reich <josh@root.net> in July
309 2006. These include cube(float8[], float8[]) and cleaning up the code
310 to use the V1 call protocol instead of the deprecated V0 protocol.