summaryrefslogtreecommitdiff
path: root/contrib/cube/README.cube
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cube/README.cube')
-rw-r--r--contrib/cube/README.cube355
1 files changed, 0 insertions, 355 deletions
diff --git a/contrib/cube/README.cube b/contrib/cube/README.cube
deleted file mode 100644
index 56b06202dc..0000000000
--- a/contrib/cube/README.cube
+++ /dev/null
@@ -1,355 +0,0 @@
-This directory contains the code for the user-defined type,
-CUBE, representing multidimensional cubes.
-
-
-FILES
------
-
-Makefile building instructions for the shared library
-
-README.cube the file you are now reading
-
-cube.c the implementation of this data type in c
-
-cube.sql.in SQL code needed to register this type with postgres
- (transformed to cube.sql by make)
-
-cubedata.h the data structure used to store the cubes
-
-cubeparse.y the grammar file for the parser (used by cube_in() in cube.c)
-
-cubescan.l scanner rules (used by cube_yyparse() in cubeparse.y)
-
-
-INSTALLATION
-============
-
-To install the type, run
-
- make
- make install
-
-The user running "make install" may need root access; depending on how you
-configured the PostgreSQL installation paths.
-
-This only installs the type implementation and documentation. To make the
-type available in any particular database, as a postgres superuser do:
-
- psql -d databasename < cube.sql
-
-If you install the type in the template1 database, all subsequently created
-databases will inherit it.
-
-To test the new type, after "make install" do
-
- make installcheck
-
-If it fails, examine the file regression.diffs to find out the reason (the
-test code is a direct adaptation of the regression tests from the main
-source tree).
-
-By default the external functions are made executable by anyone.
-
-SYNTAX
-======
-
-The following are valid external representations for the CUBE type:
-
-'x' A floating point value representing
- a one-dimensional point or one-dimensional
- zero length cubement
-
-'(x)' Same as above
-
-'x1,x2,x3,...,xn' A point in n-dimensional space,
- represented internally as a zero volume box
-
-'(x1,x2,x3,...,xn)' Same as above
-
-'(x),(y)' 1-D cubement starting at x and ending at y
- or vice versa; the order does not matter
-
-'(x1,...,xn),(y1,...,yn)' n-dimensional box represented by
- a pair of its opposite corners, no matter which.
- Functions take care of swapping to achieve
- "lower left -- upper right" representation
- before computing any values
-
-Grammar
--------
-
-rule 1 box -> O_BRACKET paren_list COMMA paren_list C_BRACKET
-rule 2 box -> paren_list COMMA paren_list
-rule 3 box -> paren_list
-rule 4 box -> list
-rule 5 paren_list -> O_PAREN list C_PAREN
-rule 6 list -> FLOAT
-rule 7 list -> list COMMA FLOAT
-
-Tokens
-------
-
-n [0-9]+
-integer [+-]?{n}
-real [+-]?({n}\.{n}?|\.{n})
-FLOAT ({integer}|{real})([eE]{integer})?
-O_BRACKET \[
-C_BRACKET \]
-O_PAREN \(
-C_PAREN \)
-COMMA \,
-
-
-Examples of valid CUBE representations:
---------------------------------------
-
-'x' A floating point value representing
- a one-dimensional point (or, zero-length
- one-dimensional interval)
-
-'(x)' Same as above
-
-'x1,x2,x3,...,xn' A point in n-dimensional space,
- represented internally as a zero volume cube
-
-'(x1,x2,x3,...,xn)' Same as above
-
-'(x),(y)' A 1-D 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 box represented by
- a pair of its diagonally opposite corners,
- regardless of order. Swapping is provided
- by all comarison routines to ensure the
- "lower left -- upper right" representation
- before actaul comparison takes place.
-
-'[(x1,...,xn),(y1,...,yn)]' Same as above
-
-
-White space is ignored, so '[(x),(y)]' can be: '[ ( x ), ( y ) ]'
-
-
-DEFAULTS
-========
-
-I believe 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 to the 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 sized boxes, I assume the smaller
-one 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 the special Point type
-and functions for (box,point) predicates.
-
-select cube_contains('(0,0),(1,1)', '0.5,0.5');
-cube_contains
---------------
-t
-(1 row)
-
-
-PRECISION
-=========
-
-Values are stored internally as 64-bit floating point numbers. This means that
-numbers with more than about 16 significant digits will be truncated.
-
-
-USAGE
-=====
-
-The access method for CUBE is a GiST index (gist_cube_ops), which is a
-generalization of R-tree. GiSTs allow the postgres implementation of
-R-tree, originally encoded to support 2-D geometric types such as
-boxes and polygons, to be used with any data type whose data domain
-can be partitioned using the concepts of containment, intersection and
-equality. In other words, everything that can intersect or contain
-its own kind can be indexed with a GiST. That includes, among other
-things, all geometric data types, regardless of their dimensionality
-(see also contrib/seg).
-
-The operators supported by the GiST access method include:
-
-a = b Same as
-
- The cubements a and b are identical.
-
-a && b Overlaps
-
- The cubements a and b overlap.
-
-a @> b Contains
-
- The cubement a contains the cubement b.
-
-a <@ b Contained in
-
- The cubement a is contained in b.
-
-(Before PostgreSQL 8.2, the containment operators @> and <@ were
-respectively called @ and ~. These names are still available, but are
-deprecated and will eventually be retired. Notice that the old names
-are reversed from the convention formerly followed by the core geometric
-datatypes!)
-
-Although the mnemonics of the following operators is questionable, I
-preserved them to maintain visual consistency with other geometric
-data types defined in Postgres.
-
-Other operators:
-
-[a, b] < [c, d] Less than
-[a, b] > [c, d] Greater than
-
- These operators do not make a lot of sense for any practical
- purpose but sorting. These operators first compare (a) to (c),
- and if these are equal, compare (b) to (d). That accounts for
- reasonably good sorting in most cases, which is useful if
- you want to use ORDER BY with this type
-
-The following functions are available:
-
-cube_distance(cube, cube) returns double
- cube_distance returns the distance between two cubes. If both cubes are
- points, this is the normal distance function.
-
-cube(float8) returns cube
- This makes a one dimensional cube with both coordinates the same.
- If the type of the argument is a numeric type other than float8 an
- explicit cast to float8 may be needed.
- cube(1) == '(1)'
-
-cube(float8, float8) returns cube
- This makes a one dimensional cube.
- cube(1,2) == '(1),(2)'
-
-cube(float8[]) returns cube
- This makes a zero-volume cube using the coordinates defined by the
- array.
- cube(ARRAY[1,2]) == '(1,2)'
-
-cube(float8[], float8[]) returns cube
- This makes a cube, with upper right and lower left coordinates as
- defined by the 2 float arrays. Arrays must be of the same length.
- cube('{1,2}'::float[], '{3,4}'::float[]) == '(1,2),(3,4)'
-
-cube(cube, float8) returns cube
- This builds a new cube by adding a dimension on to an existing cube with
- the same values for both parts of the new coordinate. This is useful for
- building cubes piece by piece from calculated values.
- cube('(1)',2) == '(1,2),(1,2)'
-
-cube(cube, float8, float8) returns cube
- This builds 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) == '(1,3),(2,4)'
-
-cube_dim(cube) returns int
- cube_dim returns the number of dimensions stored in the the data structure
- for a cube. This is useful for constraints on the dimensions of a cube.
-
-cube_ll_coord(cube, int) returns double
- cube_ll_coord returns the nth coordinate value for the lower left corner
- of a cube. This is useful for doing coordinate transformations.
-
-cube_ur_coord(cube, int) returns double
- cube_ur_coord returns the nth coordinate value for the upper right corner
- of a cube. This is useful for doing coordinate transformations.
-
-cube_subset(cube, int[]) returns cube
- Builds a new cube from an existing cube, using a list of dimension indexes
- from an array. Can be used to find both the ll and ur coordinate of single
- dimenion, e.g.: cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) = '(3),(7)'
- Or can be used to drop dimensions, or reorder them as desired, e.g.:
- cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) = '(5, 3, 1, 1),(8, 7, 6, 6)'
-
-cube_is_point(cube) returns bool
- cube_is_point returns true if a cube is also a point. This is true when the
- two defining corners are the same.
-
-cube_enlarge(cube, double, int) returns cube
- cube_enlarge increases the size of a cube by a specified radius in at least
- n dimensions. If the radius is negative the box is shrunk instead. This
- is useful for creating bounding boxes around a point for searching for
- nearby points. All defined dimensions are changed by the radius. If n
- is greater than the number of defined dimensions and the cube is being
- increased (r >= 0) then 0 is used as the base for the extra coordinates.
- LL coordinates are decreased by r and UR coordinates are increased by r. If
- a LL coordinate is increased to larger than the corresponding UR coordinate
- (this can only happen when r < 0) than both coordinates are set to their
- average. To make it harder for people to break things there is an effective
- maximum on the dimension of cubes of 100. This is set in cubedata.h if
- you need something bigger.
-
-There are a few other potentially useful functions defined in cube.c
-that vanished from the schema because I stopped using them. Some of
-these were meant to support type casting. Let me know if I was wrong:
-I will then add them back to the schema. I would also appreciate
-other ideas that would enhance the type and make it more useful.
-
-For examples of usage, see sql/cube.sql
-
-
-CREDITS
-=======
-
-This code is essentially based on the example written for
-Illustra, http://garcia.me.berkeley.edu/~adong/rtree
-
-My thanks are primarily to Prof. Joe Hellerstein
-(http://db.cs.berkeley.edu/~jmh/) for elucidating the gist of the GiST
-(http://gist.cs.berkeley.edu/), and to his former student, Andy Dong
-(http://best.me.berkeley.edu/~adong/), for his exemplar.
-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.
-
-------------------------------------------------------------------------
-Gene Selkov, Jr.
-Computational Scientist
-Mathematics and Computer Science Division
-Argonne National Laboratory
-9700 S Cass Ave.
-Building 221
-Argonne, IL 60439-4844
-
-selkovjr@mcs.anl.gov
-
-------------------------------------------------------------------------
-
-Minor updates to this package were made by Bruno Wolff III <bruno@wolff.to>
-in August/September of 2002.
-
-These include changing the precision from single precision to double
-precision and adding some new functions.
-
-------------------------------------------------------------------------
-
-Additional updates were made by Joshua Reich <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 form.