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 sus extensiones se encuentran en todas las dimensiones que los cuadros comparten y se tocan en un solo valor en al menos una de ellas. Una dimensión en la que los cuadros están separados los separa sea cual sea el comportamiento de las demás dimensiones.
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?
tbox {<<, <<#} tbox → boolean
stbox {<<, <<|, <</, <<#} stbox → 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?
tbox {>>, #>>} tbox → boolean
stbox {>>, |>>, />>, #>>} stbox → 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?
tbox {&<, &<#} {tbox,stbox} → boolean
stbox &<, &<|, &</, &<#} stbox → 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?
tbox {&>, #&>} tbox → boolean
stbox {&>, |&>, /&>, #&>} stbox} → 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