Función escalar en lenguaje Python
El siguiente ejemplo muestra una función escalar simple que suma un conjunto de números. Este ejemplo parte del principio para construir un AE sencillo. Utiliza el siguiente nombre de archivo: ' applyop.py
Código
- Derivar una clase de '
nzae.Ae
. La clase base se encarga de la mayor parte del trabajo, por lo que normalmente se llama a la clase 'class-method "run()"
. La función 'run()
' instancia la clase, configura el tratamiento de errores y llama a la función derivada apropiada. Para los EAs basados en UDF como éste, la función '_getFunctionResult()
' debe ser sobrescrita, ya que se llama una vez por cada fila de entrada. Guarda el siguiente código en un archivo llamado ' applyop.py:import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # OUR CUSTOM CODE WILL GO HERE. ApplyOpUdfAe.run()
- Completa el código Python personalizado. En esta UDF, se pasa un operador de cadena, que puede ser un signo más (+) para sumar o un asterisco (*) para multiplicar, así como dos enteros. El código devuelve el producto o la suma de los enteros. En SQL, una versión simple de esto puede ser llamado por cualquiera de los dos:
oSELECT applyop('+', 3, 5);
SELECT applyop('*', 3, 5);
Aunque el ejemplo mencionado sólo tiene una entrada, el sistema NPS trata con flujos de entrada. Por lo tanto, es más probable que se utilice el sistema NPS:SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;
En el primer ejemplo, el sistema NPS toma las constantes "+", 3 y 5 y las convierte en un flujo de longitud uno que contiene tres elementos. Una fila es "vista" por '
_getFunctionResult()
' con los tres elementos en ella. Internamente, todos los casos mencionados se manejan de la misma manera y se puede asumir que hay múltiples entradas al AE 'applyop
. - Introducir código personalizado para manejar una fila de entrada, ya que se necesita la entrada de manejo de bucle para entregar una fila a la función a la vez:
import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # BREAK APART OUR ROW OF INPUT. operator, leftInput, rightInput = row # HANDLE ADDITION. if operator == "+": return leftInput + rightInput # HANDLE MULTIPLICATION. if operator == "*": return leftInput * rightInput # ERROR ON ALL OTHER. self.userError("Unhandled operator to ApplyOp: '" + operator + "'.") ApplyOpUdfAe.run()
La función '
self.userError()
' informa de un error al usuario SQL. Lo que devuelva '_getFunctionResult()
' es el resultado de la operación SQL. Dado que se ejecuta como una UDF, sólo puede haber una columna en el resultado. Un ejemplo posterior muestra cómo utilizar UDTFs para mostrar múltiples columnas. Cuando el código está completo, debe desplegarse y registrarse.
Una compilación
Los EA Python no requieren compilación.
virtual
--template
" para desplegar el script en la ubicación predeterminada de la unidad de exportación compartida.$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./applyop.py --version 3
Registro
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udf --exe applyop.py --sig "applyop(varchar(1), int4, int4)" \
--return int4
En ejecución
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
_getFunctionResult()
, se llama a ' self.userError()
. El siguiente ejemplo provoca un error:SELECT applyop('-', 1, 2);
ERROR: Unhandled operator TO ApplyOp: '-'.