Ce module code le type de données cube
pour
représenter des cubes à plusieurs dimensions.
Ce module est considéré comme « trusted », ce qui signifie qu'il
peut être installé par des utilisateurs simples (sans attribut
SUPERUSER
) et qui ont l'attribut CREATE
sur la base de données courante.
Tableau F.2 affiche les représentations externes
valides pour le type cube
. x
,
y
, etc. dénotent des nombres flottants.
Tableau F.2. Représentations externes d'un cube
Syntaxe externe | Signification |
---|---|
| point uni-dimensionnel (ou interval unidimensionnel de longueur nulle) |
( | Identique à ci-dessus |
| Un point dans un espace à n dimensions, représenté en interne comme un cube de volume nul |
( | Identique à ci-dessus |
( | Interval uni-dimensionnel débutant à
x et finissant à
y ou vice-versa ; l'ordre n'importe pas
|
[( | Identique à ci-dessus |
( | Cube à n dimensions représenté par paires de coins diagonalement opposés |
[( | Identique à ci-dessus |
L'ordre de saisie des coins opposés d'un cube n'a aucune importance. Les
fonctions cube
s'occupent de la bascule nécessaire à
l'obtention d'une représentation uniforme « bas gauche, haut
droit ». Quand les coins coincident, le type cube
enregistre un coin ainsi que le drapeau « is point » pour éviter
de perdre de l'espace.
Les espaces sont ignorées,
[(
est donc identique à
x
),(y
)][ (
.
x
), ( y
) ]
Les valeurs sont enregistrées en interne sous la forme de nombres en virgule flottante. Cela signifie que les nombres avec plus de 16 chiffres significatifs sont tronqués.
Tableau F.3 affiche les opérateurs spécialisés
fournis par le type cube
.
Tableau F.3. Opérateurs pour cube
Opérateur Description |
---|
Est-ce que les cubes se superposent ? |
Est-ce que le premier cube contient le second ? |
Est-ce que le premier cube est contenu dans le second ? |
Extrait les |
Extrait les |
Calcule la distance Euclidienne entre deux cubes. |
Calcule la distance taxicab (métrique L-1) entre deux cubes. |
Calcule la distance Chebyshev (métrique L-inf) entre deux cubes. |
(Avant PostgreSQL 8.2, les opérateurs de contenance @>
et <@
étaient appelés respectivement
@
et ~
. Ces noms sont toujours
disponibles mais sont déclarés obsolètes et seront supprimés un jour. Les
anciens noms sont inversés par rapport à la convention suivie par les types
de données géométriques !)
En plus des opérateurs ci-dessus, les opérateurs de comparaison usuels
indiqués dans Tableau 9.1 sont disponibles
pour le type cube
. Ces opérateurs comparent tout d'abord les
premiers coordonnées et, si ces derniers sont égaux, comparent les
deuxièmes coordonnées. Ils existent principalement pour supporter la classe
d'opérateur d'index b-tree pour cube
, qui peut seulement être
utile par exemple si vous souhaitez une contrainte UNIQUE sur une colonne
cube
.
Autrement, l'ordonnancement n'a pas d'usage concret.
Le module cube
fournit aussi une classe d'opérateur
pour index GiST pour les valeurs cube
. Un index GiST peut être
utilisé sur le type cube
pour chercher des valeurs en
utilisant les opérateurs =
,
&&
, @>
et
<@
dans les clauses WHERE
.
De plus, un index GiST cube
peut être utilisé pour trouver
les plus proches voisins en utilisant les opérateurs de métriques
<->
, <#>
et
<=>
dans les clauses ORDER BY
.
Par exemple, le plus proche voisin du point 3-D (0.5, 0.5, 0.5) peut
être trouvé de façon efficace avec :
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
L'opérateur ~>
peut aussi être utilisé de cette façon
pour récupérer efficacement les premières valeurs triées par une coordonnée
sélectionnée. Par exemple, pour obtenir les quelques premiers cubes triés
par la première coordonnée (coin bas gauche) ascendante, il est possible
d'utiliser la requête suivante :
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
Et pour obtenir des cubes 2-D triés par la première coordonnée du coin haut droit descendant :
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
Tableau F.4 indique les fonctions disponibles.
Tableau F.4. Fonctions cube
Fonction Description Exemple(s) |
---|
Crée un cube uni-dimensionnel de coordonnées identiques.
|
Crée un cube uni-dimensionnel.
|
Crée un cube de volume nul en utilisant les coordonnées définies par le tableau.
|
Crée un cube avec les coordonnées haut droit et bas gauche définies par deux tableaux de flottants, obligatoirement de même taille.
|
Crée un nouveau cube en ajoutant une dimension à un cube existant, avec les mêmes valeurs pour les deux points finaux de la nouvelle coordonnée. Ceci est utile pour construire des cubes pièce par pièce à partir de valeurs calculées.
|
Crée un nouveau cube en ajoutant une dimension à un cube existant. Ceci est utile pour construire des cubes pièce par pièce à partir de valeurs calculées.
|
Renvoie le nombe de dimensions du cube.
|
Renvoie la
|
Renvoie la
|
Renvoie true si le cube est un point, autrement dit si les deux coins de définition sont identiques.
|
Renvoie la distance entre deux cubes. Si les deux cubes sont des points, il s'agit de la fonction de distance habituelle.
|
Crée un nouveau cube à partir d'un cube existant, en utilisant une liste d'index de dimension à partir d'un tableau. Peut être utilisé pour extraire les points finaux d'une seule dimension ou pour supprimer les dimensions, ou pour les réordonner comme souhaité.
|
Produit l'union de deux cubes.
|
Produit l'intersection de deux cubes.
|
Augmente la taille du cube suivant le radius
|
Le développeur pense que l'union :
select cube_union('(0,5,2),(2,3,1)', '0'); cube_union ------------------- (0, 0, 0),(2, 5, 2) (1 row)
n'est pas en contradiction avec le bon sens. Pas plus que l'intersection
select cube_inter('(0,-1),(1,1)', '(-2),(2)'); cube_inter ------------- (0, 0),(1, 0) (1 row)
Dans toutes les opérations binaires sur des boîtes de tailles différentes, l'auteur suppose que la plus petite est une projection cartésienne, c'est-à-dire qu'il y a des zéros à la place des coordonnées omises dans la représentation sous forme de chaîne. Les exemples ci-dessus sont équivalents à :
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)'); cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
Le prédicat de contenance suivant utilise la syntaxe en points alors qu'en fait, le second argument est représenté en interne par une boîte. Cette syntaxe rend inutile la définition du type point et des fonctions pour les prédicats (boîte,point).
select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row)
Pour des exemples d'utilisation, voir les tests de régression
sql/cube.sql
.
Pour éviter toute mauvaise utilisation, le nombre de dimensions des cubes
est limité à 100. Cela se configure dans cubedata.h
.
Auteur d'origine : Gene Selkov, Jr. <selkovjr@mcs.anl.gov>
,
Mathematics and Computer Science Division, Argonne National Laboratory.
Mes remerciements vont tout particulièrement au professeur Joe Hellerstein (https://dsf.berkeley.edu/jmh/) qui a su extraire l'idée centrale de GiST (http://gist.cs.berkeley.edu/), et à son étudiant précédant, Andy Dong pour son exemple rédigé dans Illustra. Mes remerciements vont également aux développeurs de PostgreSQL qui m'ont permis de créer mon propre monde et de pouvoir y vivre sans être dérangé. Toute ma gratitude aussi à Argonne Lab et au département américain de l'énergie pour les années de support dans mes recherches sur les bases de données.
Des modifications mineures ont été effectuées sur ce module par Bruno Wolff
III <bruno@wolff.to>
en août/septembre 2002. Elles incluent
la modification de la précision (de simple à double) et l'ajout de
quelques nouvelles fonctions.
Des mises à jour supplémentaires ont été réalisées par Joshua Reich
<josh@root.net>
en juillet 2006. Elles concernent
l'ajout de cube(float8[], float8[])
et le nettoyage du code pour
utiliser le protocole d'appel V1 à la place de la forme V0 maintenant
obsolète.