Este módulo implementa un tipo de datos cube para
representar cubos multidimensionales.
Este módulo se considera “trusted” (confiable), es decir, puede ser
instalado por usuarios no superusuarios que tengan el privilegio CREATE
en la base de datos actual.
La Table F.1 muestra las representaciones externas
válidas para el tipo cube.
x, y, etc., denotan
números de punto flotante.
Table F.1. Representaciones externas de cube
| Sintaxis externa | Significado |
|---|---|
| Un punto unidimensional (o un intervalo unidimensional de longitud cero) |
( | Igual que arriba |
| Un punto en el espacio n-dimensional, representado internamente como un cubo de volumen cero |
( | Igual que arriba |
( | Un intervalo unidimensional que comienza en x y termina en y o viceversa; el
orden no importa
|
[( | Igual que arriba |
( | Un cubo n-dimensional representado por un par de sus esquinas diagonalmente opuestas |
[( | Igual que arriba |
No importa en qué orden se ingresen las esquinas opuestas de un cubo.
Las funciones de cube intercambian automáticamente los valores si es necesario
para crear una representación interna uniforme de “inferior izquierda — superior derecha”.
Cuando las esquinas coinciden, cube almacena solo una esquina
junto con una bandera “is point” (es punto) para evitar desperdiciar espacio.
Los espacios en blanco se ignoran en la entrada, por lo que
[( es lo mismo que
x),(y)][ ( .
x ), ( y ) ]
Los valores se almacenan internamente como números de punto flotante de 64 bits. Esto significa que los números con más de aproximadamente 16 dígitos significativos serán truncados.
La Table F.2 muestra los operadores especializados
proporcionados para el tipo cube.
Table F.2. Operadores de cube
Operador Descripción |
|---|
¿Se superponen los cubos? |
¿Contiene el primer cubo al segundo? |
¿Está el primer cubo contenido en el segundo? |
Extrae la |
Extrae la |
Calcula la distancia euclidiana entre los dos cubos. |
Calcula la distancia de Manhattan (métrica L-1) entre los dos cubos. |
Calcula la distancia de Chebyshev (métrica L-inf) entre los dos cubos. |
Además de los operadores anteriores, los operadores de comparación habituales
mostrados en la Table 9.1 están
disponibles para el tipo cube. Estos
operadores comparan primero las primeras coordenadas, y si son iguales,
comparan las segundas coordenadas, etc. Existen principalmente para dar soporte a la
clase de operadores de índice b-tree para cube, lo que puede ser útil,
por ejemplo, si quieres una restricción UNIQUE en una columna de tipo cube.
De lo contrario, este ordenamiento no tiene mucha utilidad práctica.
El módulo cube también proporciona una clase de operadores de índice GiST para
valores de tipo cube.
Se puede utilizar un índice GiST de cube para buscar valores utilizando los
operadores =, &&, @> y
<@ en cláusulas WHERE.
Además, se puede utilizar un índice GiST de cube para buscar los vecinos más cercanos
utilizando los operadores métricos
<->, <#> y
<=> en cláusulas ORDER BY.
Por ejemplo, el vecino más cercano del punto 3D (0.5, 0.5, 0.5)
se podría encontrar eficientemente con:
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
El operador ~> también se puede usar de esta manera para
recuperar de forma eficiente los primeros valores ordenados por una coordenada seleccionada.
Por ejemplo, para obtener los primeros cubos ordenados por la primera coordenada
(esquina inferior izquierda) de forma ascendente, se podría usar la siguiente consulta:
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
Y para obtener cubos 2D ordenados por la primera coordenada de la esquina superior derecha de forma descendente:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
La Table F.3 muestra las funciones disponibles.
Table F.3. Funciones de cube
Función Descripción Ejemplo(s) |
|---|
Crea un cubo unidimensional con ambas coordenadas iguales.
|
Crea un cubo unidimensional.
|
Crea un cubo de volumen cero utilizando las coordenadas definidas por el array.
|
Crea un cubo con las coordenadas superior derecha e inferior izquierda definidas por los dos arrays, que deben tener la misma longitud.
|
Crea un nuevo cubo agregando una dimensión a un cubo existente, con los mismos valores para ambos extremos de la nueva coordenada. Esto es útil para construir cubos pieza por pieza a partir de valores calculados.
|
Crea un nuevo cubo agregando una dimensión a un cubo existente. Esto es útil para construir cubos pieza por pieza a partir de valores calculados.
|
Devuelve el número de dimensiones del cubo.
|
Devuelve el valor de la
|
Devuelve el valor de la
|
Devuelve true si el cubo es un punto, es decir, las dos esquinas definitorias son la misma.
|
Devuelve la distancia entre dos cubos. Si ambos cubos son puntos, esta es la función de distancia normal.
|
Crea un nuevo cubo a partir de un cubo existente, utilizando una lista de índices de dimensiones de un array. Se puede utilizar para extraer los extremos de una sola dimensión, o para eliminar dimensiones, o para reordenarlas según se desee.
|
Produce la unión de dos cubos.
|
Produce la intersección de dos cubos.
|
Aumenta el tamaño del cubo según el radio
|
Esta unión:
select cube_union('(0,5,2),(2,3,1)', '0');
cube_union
-------------------
(0, 0, 0),(2, 5, 2)
(1 row)
no contradice el sentido común, ni tampoco la intersección:
select cube_inter('(0,-1),(1,1)', '(-2),(2)');
cube_inter
-------------
(0, 0),(1, 0)
(1 row)
En todas las operaciones binarias sobre cubos de diferentes dimensiones, se asume que el de menor dimensión es una proyección cartesiana, es decir, que tiene ceros en lugar de las coordenadas omitidas en la representación de cadena. Los ejemplos anteriores son equivalentes a:
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
El siguiente predicado de contención utiliza la sintaxis de punto, aunque en realidad el segundo argumento está representado internamente por una caja. Esta sintaxis hace que no sea necesario definir un tipo de punto separado y funciones para los predicados (caja, punto).
select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)
Para ver ejemplos de uso, consulta el test de regresión sql/cube.sql.
Para evitar que los usuarios rompan cosas, existe un
límite de 100 en el número de dimensiones de los cubos. Esto se establece
en cubedata.h si necesitas un valor mayor.
Autor original: Gene Selkov, Jr. <[email protected]>,
División de Matemáticas y Ciencias de la Computación, Laboratorio Nacional de Argonne.
Mi agradecimiento se dirige principalmente al profesor Joe Hellerstein (https://dsf.berkeley.edu/jmh/) por aclarar la esencia de GiST (http://gist.cs.berkeley.edu/), y a su antiguo alumno Andy Dong por su ejemplo escrito para Illustra. También estoy agradecido a todos los desarrolladores de Postgres, presentes y pasados, por permitirme crear mi propio mundo y vivir en él sin ser molestado. Y me gustaría expresar mi gratitud al Laboratorio Argonne y al Departamento de Energía de los EE. UU. por los años de fiel apoyo a mi investigación sobre bases de datos.
Bruno Wolff III <[email protected]> realizó actualizaciones menores a este paquete
en agosto/septiembre de 2002. Estas incluyen
cambiar la precisión de precisión simple a precisión doble y añadir
algunas funciones nuevas.
Joshua Reich <[email protected]> realizó actualizaciones adicionales en
julio de 2006. Estas incluyen cube(float8[], float8[]) y
la limpieza del código para usar el protocolo de llamada V1 en lugar del protocolo
V0 obsoleto.