(No version information available, might be only in CVS)
SQLiteDatabase->createAggregate — Registra una FDU (función definida por el usuario) de grupo normal para su uso en sentencias SQL
Método que sigue el estilo orientado a objetos:
sqlite_create_aggregate() es similar a sqlite_create_function() salvo que registrar funciones que se emplean para calcular resultados agrupados de todas las filas del resultado de una consulta.
La diferencia principal entre esta función y sqlite_create_function() es que se requieren 2 funciones para manejar los cálculos agrupados. La función indicada en funcion_intermedia se llama para cada una de las filas del resultado. La función PHP acumula y guarda el resultado temporal en el llamado "contexto de agregación". Una vez que todas las filas han sido procesadas, se llama a la función funcion_final , que obtendrá los resultados intermedios a partir del contexto de agregación y devolverá el resultado calculado. Las funciones de callback deben devolver un tipo de datos entendido por SQLite (esto es, tipo escalar).
El recurso que identifica la base de datos SQLite (y que es el que devuelve la función sqlite_open()). Este parámetro no se requiere cuando se emplea el método orientado a objetos.
El nombre de la función a utilizar en las sentencias SQL.
La función de callback que se llama para cada una de las filas del resultado.
La función de callback que se llama para realizar los cálculos agrupados a partir de los datos temporales almacenados por la función intermedia que se ejecuta sobre cada una de las filas.
Valor destinado al parseador de SQLite si la función de callback acepta un número predeterminado de argumentos.
Example#1 Ejemplo de función de grupo llamada max_longitud
<?php
$datos = array(
'uno',
'dos',
'tres',
'cuatro',
'cinco',
'seis',
'siete',
'ocho',
'nueve',
'diez',
);
$manejador_bd = sqlite_open(':memory:');
sqlite_query($manejador_bd, "CREATE TABLE tabla_cadenas(a)");
foreach ($datos as $cadena) {
$cadena = sqlite_escape_string($cadena);
sqlite_query($manejador_bd, "INSERT INTO tabla_cadenas VALUES ('$cadena')");
}
function max_longitud_temporal(&$contexto, $cadena)
{
$cadena = sqlite_udf_decode_binary($cadena);
if (strlen($cadena) > $contexto) {
$contexto = strlen($cadena);
}
}
function max_longitud_final(&$contexto)
{
return $contexto;
}
sqlite_create_aggregate($dbhandle, 'max_longitud', 'max_longitud_temporal', 'max_longitud_final');
var_dump(sqlite_array_query($manejador_bd, 'SELECT max_longitud(a) from tabla_cadenas'));
?>
En este ejemplo, se crea una función de agregación que calcula la longitud de la cadena más larga de una de las columnas de la tabla. Para cada filam se llama a la función max_longitud_temporal y se le pasa el parámetro contexto . El parámetro contexto es como cualquier otra variable de PHP y puede contener una matriz o incluso un objeto. En el ejemplo, solamente almacena la longitud más larga hasta ese momento. Si la cadena tiene una longitud superior al máximo de ese momento, se actualiza el valor almacenado en el contexto para que contenga el nuevo valor máximo.
Una vez que todas las filas han sido procesadas, SQLite llama a la función max_longitud_final que calcula el resultado de la agregación. en esta función se pueden realizar los calculos necesarios a partir del valor de contexto . En este ejemplo tan sencillo, simplemente se devuelve el valor almacenado en contexto, porque ya contiene la longitud máxima de todas las cadenas procesadas.
Note: El ejemplo mostrado no funciona correctamente si la columna contiene datos binarios. Vea la página del manual de la función sqlite_udf_decode_binary() para una explicación detallada de este hecho y para ver un ejemplo sobre la forma de tratar los datos binarios mediante su codificación.
No se recomienda copiar todos los valores en el contexto y depuesés realizar su procesamiento al final, ya que esto provocaría que SQLite emplee mucha memoria para almacenar todos los datos. Por ejemplo, es fácil hacerse una idea del problema que puede surgir si se almacenan 1 millón de registros cada uno de ellos conteniendo 32 bytes de longitud.
Se pueden emplear las funciones sqlite_create_function() y sqlite_create_aggregate() para sobrecargar las funciones SQL nativas de SQLite.