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.
Por ejemplo, la superposición de cajas envolventes t1.trip && t2.trip se escribe de forma portable como overlaps(t1.trip, t2.trip), y la prueba temporal «antes» p1.period <<# p2.period como spanBefore(p1.period, p2.period).
Las funciones de agregación siguen el mismo principio y se enumeran en su propia tabla a continuación, de modo que un motor pueda localizar la maquinaria que necesita sin rastrear el texto. Una agregación SQL se compone de hasta tres funciones de la maquinaria de PostgreSQL, cada una expuesta bajo un nombre canónico formado a partir del nombre de la agregación y su rol: una función de transición <agregación>Transition (siempre presente), una función de combinación <agregación>Combine usada para la agregación en paralelo, y una función final <agregación>Final. Los roles de combinación y final son opcionales: una agregación cuyo estado de transición ya es su resultado no tiene función final (por ejemplo extent), y una agregación que no admite la agregación parcial no tiene función de combinación (por ejemplo las agregaciones de anexado). Los roles se mantienen distintos y con un nombre uniforme para que cada binding pueda reconstruir la agregación a partir del catálogo. La siguiente tabla enumera cada agregación y sus funciones de maquinaria; un guion (—) indica un rol que la agregación no define.
| Categoría | Transición | Combinación | Final |
|---|---|---|---|
| Conteo | tCountTransition | tCountCombine | tCountFinal |
wCountTransition | wCountCombine | wCountFinal | |
| Suma | tSumTransition | tSumCombine | tSumFinal |
wSumTransition | wSumCombine | wSumFinal | |
| Promedio | tAvgTransition | tAvgCombine | tAvgFinal |
wAvgTransition | wAvgCombine | wAvgFinal | |
| Mínimo / máximo | tMinTransition | tMinCombine | tMinFinal |
tMaxTransition | tMaxCombine | tMaxFinal | |
wMinTransition | wMinCombine | wMinFinal | |
wMaxTransition | wMaxCombine | wMaxFinal | |
| Booleano | tAndTransition | tAndCombine | tAndFinal |
tOrTransition | tOrCombine | tOrFinal | |
| Centroide | tCentroidTransition | tCentroidCombine | tCentroidFinal |
| Nube de puntos | tnpointsTransition | tnpointsCombine | tnpointsFinal |
tdensityTransition | tdensityCombine | tdensityFinal | |
| Caja delimitadora | extentTransition | extentCombine | — |
| Unión | setUnionTransition | setUnionCombine | setUnionFinal |
spanUnionTransition | spanUnionCombine | spanUnionFinal | |
spansetUnionTransition | spansetUnionCombine | spansetUnionFinal | |
| Fusión | mergeTransition | mergeCombine | mergeFinal |
| Anexado | appendInstantTransition | — | appendInstantFinal |
appendSequenceTransition | — | appendSequenceFinal |