Hay cinco operadores topológicos: superposición (&&
), contiene (@>
), es contenido (<@
), mismo (~=
) y adyacente (-|-
). Los operadores verifican la relación topológica entre los cuadros delimitadores teniendo en cuenta la dimensión de valor y/o de tiempo para todas las dimensiónes que estén presentes en ambos argumentos.
¿Se superponen los cuadros delimitadores?
box && box → boolean
SELECT tbox 'TBOXFLOAT XT((1,3),[2001-01-01,2001-01-03])' && tbox 'TBOXFLOAT XT((2,4),[2001-01-02,2001-01-04])'; -- true SELECT stbox 'STBOX XT(((1,1),(2,2)),[2001-01-01,2001-01-02])' && stbox 'STBOX XT([2001-01-02,2001-01-02])'; -- true
¿Contiene el primer cuadro delimitador el segundo?
box @> box → boolean
SELECT tbox 'TBOXFLOAT XT((1,4),[2001-01-01,2001-01-04])' @> tbox 'TBOXFLOAT XT((2,3),[2001-01-01,2001-01-02])'; -- true SELECT stbox 'STBOX Z((1,1,1),(3,3,3))' @> stbox 'STBOX XT(((1,1),(2,2)),[2001-01-01,2001-01-02])'; -- true
¿Está el primer cuadro delimitador contenido en el segundo?
box <@ box → boolean
SELECT tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])' <@ tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])'; -- true SELECT stbox 'STBOX XT(((1,1),(2,2)),[2001-01-01,2001-01-02)' <@ stbox 'STBOX ZT(((1,1,1),(2,2,2)),[2001-01-01,2001-01-02])'; -- true
¿Son los cuadros delimitadores iguales en sus dimensiónes comunes?
box ~= box → boolean
SELECT tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])' ~= tbox 'TBOXFLOAT XT([2001-01-01,2001-01-02])'; -- true SELECT stbox 'STBOX XT(((1,1),(3,3)),[2001-01-01,2001-01-03])' ~= stbox 'STBOX Z((1,1,1),(3,3,3))'; -- true
¿Son los cuadros delimitadores adyacentes?
box -|- box → boolean
Dos cuadros delimitadores son adyacentes si comparten n dimensiónes y si su intersección tiene como máximo n-1 dimensiónes.
SELECT tbox 'TBOXINT XT([1,2),[2001-01-01,2001-01-02])' -|- tbox 'TBOXINT XT([2,3),[2001-01-02,2001-01-03])'; -- true SELECT tbox 'TBOXFLOAT XT((1,2)[2001-01-01,2001-01-02])' -|- tbox 'TBOX T([2001-01-02,2001-01-03])'; -- true SELECT stbox 'STBOX XT(((1,1),(3,3)),[2001-01-01,2001-01-03])' -|- stbox 'STBOX XT(((2,2),(4,4)),[2001-01-03,2001-01-04])'; -- true
Los operadores de posición consideran la posición relativa de los cuadros delimitadores. Los operadores <<
, >>
, &<
y &>
consideran el valor X para el tipo tbox
y las coordenadas X para el tipo stbox
, los operadores <<|
, |>>
, &<|
y |&>
consideran las coordenadas Y para el tipo stbox
, los operadores <</
, />>
, &</
y /&>
consideran las coordenadas Z para el tipo stbox
y los operadores <<#
, #>>
, #&<
y #&>
consideran la dimensión de tiempo para los tipos tbox
y stbox
. Los operadores generan un error si ambos cuadros delimitadores no tienen la dimensión requerida.
Los operadores para la dimensión numérica del tipo tbox
se dan a continuación.
¿Son los valores X/Y/Z/T del primer cuadro delimitador estrictamente menores que los del segundo?
box << box → boolean
stbox <<| stbox → boolean
stbox <</ stbox → boolean
box <<# box → boolean
SELECT tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])' << tbox 'TBOXFLOAT XT((3,4),[2001-01-03,2001-01-04])'; -- true SELECT tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])' << tbox 'TBOXFLOAT XT([2001-01-03,2001-01-04])'; -- ERROR: The box must have value dimension SELECT stbox 'STBOX Z((1,1,1),(2,2,2))' << stbox 'STBOX Z((3,3,3),(4,4,4))'; -- true SELECT stbox 'STBOX Z((1,1,1),(2,2,2))' <<| stbox 'STBOX Z((3,3,3),(4,4,4))'; -- true SELECT stbox 'STBOX Z((1,1,1),(2,2,2))' <</ stbox 'STBOX Z((3,3,3),(4,4,4))'; -- true SELECT tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])' <<# tbox 'TBOXFLOAT XT((3,4),[2001-01-03,2001-01-04])'; -- true
¿Son los valores X/Y/Z/T del primer cuadro delimitador estrictamente mayores que los del segundo?
box >> box → boolean
stbox |>> stbox → boolean
stbox />> stbox → boolean
box #>> box → boolean
SELECT tbox 'TBOXFLOAT XT((3,4),[2001-01-03,2001-01-04])' >> tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])'; -- true SELECT stbox 'STBOX Z((3,3,3),(4,4,4))' >> stbox 'STBOX Z((1,1,1),(2,2,2))'; -- true SELECT stbox 'STBOX Z((3,3,3),(4,4,4))' |>> stbox 'STBOX Z((1,1,1),(2,2,2))'; -- true SELECT stbox 'STBOX Z((3,3,3),(4,4,4))' />> stbox 'STBOX Z((1,1,1),(2,2,2))'; -- true SELECT stbox 'STBOX XT((4,4),[2001-01-03,2001-01-04],((3,3)))' #>> stbox 'STBOX XT(((1,1),(2,2)),[2001-01-01,2001-01-02])'; -- true
¿No son los valores X/Y/Z/T del primer cuadro delimitador mayores que los del segundo?
box &< box → boolean
stbox &<| stbox → boolean
stbox &</ stbox → boolean
box &<# box → boolean
SELECT tbox 'TBOXFLOAT XT((1,4),[2001-01-01,2001-01-04])' &< tbox 'TBOXFLOAT XT((3,4),[2001-01-03,2001-01-04])'; -- true SELECT stbox 'STBOX Z((1,1,1),(4,4,4))' &< stbox 'STBOX Z((3,3,3),(4,4,4))'; -- true SELECT stbox 'STBOX Z((1,1,1),(4,4,4))' &<| stbox 'STBOX Z((3,3,3),(4,4,4))'; -- true SELECT stbox 'STBOX Z((1,1,1),(4,4,4))' &</ stbox 'STBOX Z((3,3,3),(4,4,4))'; -- true SELECT tbox 'TBOXFLOAT XT((1,4),[2001-01-01,2001-01-04])' &<# tbox 'TBOXFLOAT XT((3,4),[2001-01-03,2001-01-04])'; -- true
¿No son los valores X/Y/Z/T del primer cuadro delimitador menores que los del segundo?
box &> box → boolean
stbox |&> stbox → boolean
stbox /&> stbox → boolean
box #&> box → boolean
SELECT tbox 'TBOXFLOAT XT((1,2),[2001-01-01,2001-01-02])' &> tbox 'TBOXFLOAT XT((1,4),[2001-01-01,2001-01-04])'; -- true SELECT stbox 'STBOX Z((3,3,3),(4,4,4))' &> stbox 'STBOX Z((1,1,1),(2,2,2))'; -- true SELECT stbox 'STBOX Z((3,3,3),(4,4,4))' |&> stbox 'STBOX Z((1,1,1),(2,2,2))'; -- false SELECT stbox 'STBOX Z((3,3,3),(4,4,4))' /&> stbox 'STBOX Z((1,1,1),(2,2,2))'; -- true SELECT stbox 'STBOX XT(((1,1),(2,2)),[2001-01-01,2001-01-02])' #&> stbox 'STBOX XT(((1,1),(4,4)),[2001-01-01,2001-01-04])'; -- true