Capítulo 18. Escritura de consultas portables

Tabla de contenidos

Operaciones de conjuntos
Operaciones de cuadro delimitador
Operaciones topológicas
Operaciones de posición
Operaciones de distancia
Comparaciones
Comparaciones tradicionales
Comparaciones alguna vez y siempre
Comparaciones temporales
Operaciones booleanas
Operaciones matemáticas
Operaciones JSON temporales
Valores base provistos por el anfitrión
Agregaciones
Ejecución de una consulta en Apache Spark y Apache Flink
Los nombres que poseen los motores
Lectura y escritura de valores
Funciones que devuelven filas
Ejemplo
Los rásteres de los motores
DuckDB y su extensión de rásteres
Spark y Apache Sedona

MobilityDB se usa desde varios motores SQL: PostgreSQL mediante MobilityDB mismo, DuckDB mediante MobilityDuck, Apache Spark mediante MobilitySpark y Apache Flink mediante MobilityFlink. Los tipos y las funciones son los mismos en todos ellos, pero los operadores no: PostgreSQL permite a MobilityDB definir operadores como && o <<#, mientras que los otros motores aceptan solo algunos de ellos o ninguno. DuckDB, por ejemplo, reserva # para las referencias posicionales a columnas, por lo que no acepta ningún operador que lo contenga.

Por esta razón todo operador es también una función, que ejecuta el mismo código y devuelve exactamente el mismo resultado, y una consulta escrita solo con funciones se ejecuta sin cambios en todos los motores. La superposición de cajas delimitadoras t1.trip && t2.trip, por ejemplo, se escribe stboxOverlaps(t1.trip, t2.trip), y la prueba de posición temporal p1.period <<# p2.period se escribe spanBefore(p1.period, p2.period). Las secciones siguientes dan la función de cada operador, agrupadas como las agrupan los capítulos de cada tipo.

El nombre de una función dice sobre qué opera. Una operación aritmética o de conjuntos toma el prefijo de la familia de su argumento: set, span o spanset, y t para un valor temporal, como en spanUnion o tAdd. Una prueba de posición toma el prefijo de lo que compara: set, span o spanset, o, para una caja o un valor temporal, el tipo de su caja delimitadora, tbox, stbox o tpcbox; un valor temporal booleano, de texto o JSONB se compara mediante el intervalo de tiempo que lo delimita, y toma por ello span. Estos nombres están además libres en todos los motores: left y right son funciones de Spark y Flink, por lo que las pruebas de posición se llaman spanLeft o stboxLeft, y una comparación «alguna vez» o «siempre» escribe su operación completa, como en eLessThan, porque eLt se leería como la función elt de Spark y Flink, que ignoran las mayúsculas de un nombre.

Algunas operaciones no tienen operador y se escriben de la misma manera en todas partes: las relaciones espaciales (eIntersects, aIntersects, eTouches, eDwithin, …), las restricciones (atTime, atGeometry, atValue, …) y la comparación de orden cmp(a, b), que devuelve -1, 0 o 1.

Spark y Flink piden algunos cambios más además de las funciones, que describe “Ejecución de una consulta en Apache Spark y Apache Flink”.

Operaciones de conjuntos

La unión, la intersección y la diferencia de dos conjuntos, rangos o conjuntos de rangos, y la concatenación de dos conjuntos o de dos valores temporales.

CategoríaOperadorFunción portable
Unión (set / span / span set)+setUnion / spanUnion / spansetUnion (a, b)
Intersección (set / span / span set)*setIntersection / spanIntersection / spansetIntersection (a, b)
Diferencia (set / span / span set)-setMinus / spanMinus / spansetMinus (a, b)
Concatenación (set / temporal)||setConcat / tConcat (a, b)