Capítulo 18. Dialecto Portable de Funciones con Nombre

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
Portar una Aplicación a Apache Spark y Apache Flink
Los nombres que poseen los motores
Lectura y escritura de valores
Funciones que devuelven filas
Ejemplo

Todo operador de MobilityDB puede invocarse también como una función con nombre. Una consulta escrita únicamente con funciones con nombre, sin símbolos de operador, es portable: el mismo SQL se ejecuta sin cambios en todo el ecosistema MobilityDB, los motores de base de datos MobilityDB (PostgreSQL), MobilityDuck (DuckDB) y MobilitySpark (Apache Spark), y los motores de streaming, varios de los cuales no pueden registrar símbolos de operador de PostgreSQL. Las funciones con nombre forman un único dialecto SQL en estos enlaces SQL por lotes y de flujo, por lo que cada nombre debe estar además libre en todos los motores: una comparación cuantificada escribe por lo tanto su operación por completo, como en eLessThan, ya que eLt coincidiría con la función elt de Apache Spark y Apache Flink, y una prueba de posición lleva el prefijo de la clase que compara, como en spanLeft, ya que left y right son funciones de ambos motores. Cada alias con nombre reutiliza la propia implementación del operador, por lo que devuelve exactamente el mismo resultado que el operador.

Este capítulo es la referencia canónica, a nivel de todo el ecosistema, de esa correspondencia. Un motor que no acepte un operador dado puede consultarlo aquí y usar la forma de función en su lugar. Por ejemplo, DuckDB no acepta ningún operador que contenga # (reserva # para las referencias posicionales de columna), de modo que en MobilityDuck las comparaciones temporales (#=, …) se escriben tEqual, … y las pruebas de posición temporal (<<#, #>>, &<#, #&>) se escriben con el prefijo de la clase que comparan, como spanBefore, spanAfter, spanOverbefore, spanOverafter entre rangos de tiempo, mientras que los operadores que sí acepta pueden usarse directamente.

Las funciones de relación espacial (eIntersects, aIntersects, eTouches, eDwithin, …) y las funciones de restricción (atTime, atGeometry, atValue, …) son siempre funciones con nombre (no tienen operador). El comparador de ordenación de árbol B es asimismo la función con nombre cmp(a, b), que devuelve -1, 0 o 1 y no tiene operador. Cada operador se corresponde con una función con nombre de la manera siguiente; para los operadores aritméticos y de teoría de conjuntos el nombre de la función lleva el prefijo de la familia de tipos del operando (set, span o spanset, y t para los valores temporales), y para los operadores de posición el prefijo de la clase comparada: set, span o spanset para los conjuntos, rangos y conjuntos de rangos, y para un cuadro delimitador o un valor temporal el tipo de su cuadro delimitador, tbox, stbox o tpcbox, llevando span un valor temporal booleano, de texto o JSONB, el rango de tiempo que lo delimita.

Las secciones siguientes dan la función con nombre de cada operador, agrupadas como las agrupan los capítulos de cada tipo. La “Portar una Aplicación a Apache Spark y Apache Flink” indica lo que una consulta necesita además para ejecutarse en Spark y Flink.

Por ejemplo, la superposición de cajas envolventes t1.trip && t2.trip se escribe de forma portable como stboxOverlaps(t1.trip, t2.trip), y la prueba temporal «antes» p1.period <<# p2.period como spanBefore(p1.period, p2.period).

Operaciones de conjuntos

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)