Forum und email

sqlite_create_aggregate

SQLiteDatabase->createAggregate

(No version information available, might be only in CVS)

SQLiteDatabase->createAggregate — Registra un aggregato UDF da utilizzare nelle istruzioni SQL

Descrizione

bool sqlite_create_aggregate ( resource $dbhandle , string $function_name , callback $step_func , callback $finalize_func [, int $num_args ] )

Versione ad oggetti (metodo):

SQLiteDatabase
bool createAggregate ( string $function_name , callback $step_func , callback $finalize_func [, int $num_args ] )

sqlite_create_aggregate() è simile a sqlite_create_function() tranne che le funzioni di registrazione possono essere utilizzate per calcolare un risultato aggregato da tutte le righe della query.

La differenza chiave tra questa funzione e sqlite_create_function() è che entrambe le funzioni sono necessarie per gestire gli aggregati; la funzione step_func viene richiamata per ogni riga del set di risultati. La funzione PHP personalizzata dovrebbe accumulare i dati memorizzarli nel contesto di aggregazione. Una volta che tutte le righe sono state processate, si esegue la funzione finalize_func che dovrebbe prendere i dati dal contesto di aggregazione e restituire il risultato. La funzione personalizzata deve restituire un tipo riconosciuto da SQLite (ad esempio un tipo scalare).

Elenco dei parametri

dbhandle

Risorsa SQLite Database restituita da sqlite_open () quando usato in modo procedurale. Questo parametro non è richiesto nel metodo ad oggetti.

function_name

Nome della funzione usata nell'istruzione SQL.

step_func

Funzione richiamata per ogni riga del set di risultati.

finalize_func

Funzione di callback richiamata per aggragare i dati da ogni riga.

num_args

Suggerisce al parser SQLite se la funzione di callback accetta un numero predefinito di argomenti.

Esempi

Example#1 Esempio di una funzione di aggregazione lunghezza_massima

<?php
$data 
= array(
   
'one',
   
'two',
   
'three',
   
'four',
   
'five',
   
'six',
   
'seven',
   
'eight',
   
'nine',
   
'ten',
   );
$dbhandle sqlite_open(':memory:');
sqlite_query($dbhandle"CREATE TABLE strings(a)");
foreach (
$data as $str) {
    
$str sqlite_escape_string($str);
    
sqlite_query($dbhandle"INSERT INTO strings VALUES ('$str')");
}

function 
max_len_step(&$context$string
{
    if (
strlen($string) > $context) {
        
$context strlen($string);
    }
}

function 
max_len_finalize(&$context
{
    return 
$context;
}

sqlite_create_aggregate($dbhandle'max_len''max_len_step''max_len_finalize');

var_dump(sqlite_array_query($dbhandle'SELECT max_len(a) from strings'));

?>

In questo esempio creiamo una funzione di aggregazione che calcola la lunghezza della stringa più lunga presente in una colonna della tabella. Per ciascuna riga, si esegue la funzione max_len_step nella quale viene passato il parametro context . Questo parametro è come una qualsiasi variabile PHP ed è impostata per contenere un array od un oggetto. In questo esempio, verrà utilizzata semplicemente per contenere la lunghezza massima della stringa; se la string è di lunghezza superiore al valore massimo corrente, noi aggiorneremo il contesto affinchè registri il nuovo massimo.

Quando sono state processate tutte le righe, SQLite esegue la funzione max_len_finalize per determinare il risultato aggregato. In questa funzione possiamo svolgere qualsiasi tipo di operazione basata sui dati presenti nel parametro context . Nel nostro esempio abbiamo calcolato il risultato man mano che si processava la righe, pertanto non ci resta che restituire il valore.

Nota: L'esempio precedente non avrebbe funzionato correttamente se la colonna avesse contenuto dati binari. Guardare sul manuale la pagina sqlite_udf_decode_binary() per una spiegazione del perché, e l'esempio di come questo rispetti la codifica binaria.

Suggerimento

NON si raccomanda si memorizzare nel contesto una copia dei valori di ciascuna riga, per poi processarli alla fina; questo costringe SQLite a utilizzare una grande quantità di memoria per processare la query - basta pensare a quanta memoria sarebbe necessaria se si memorizzasse un milione di righe, ciscuna contenente una stringa di 32 byte.

Suggerimento

Si può utilizzare sqlite_create_function() e sqlite_create_aggregate() per non utilizzare la funzioni SQL native di SQLite.