Manuel PHP
Précédent |  | Suivant

# sqlite_create_aggregate

(PHP 5)

sqlite_create_aggregate -- Enregistre une UDF agregeante pour les requêtes SQLite

## Description

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

sqlite_create_aggregate() est similaire à sqlite_create_function(), car elle enregistre une fonction qui sera utilisée pour calculer un résultat agrégé sur plusieurs lignes d'une requête.

La différence principale entre cette fonction et sqlite_create_function() est que deux fonctions sont nécessaires pour gérer les agrégations : `step_func` est appelée pour chaque ligne du résultat. Votre fonction `PHP` doit accumuler le résultat, et le stocker dans le contexte d'agrégation. Une fois que toutes les lignes ont été appelées, `finalize_func` sera appelée, et elle doit alors lire les données dans ce contexte d'agrégation, et en retourner le résultat.

Exemple 1. Exemple d'UDF SQLite : taille maximale de chaîne

`<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten'
);
$db = sqlite_open(':memory:');
sqlite_query($db, "CREATE TABLE strings(a)");
foreach ($data as $str) {
$str = sqlite_escape_string($str);
sqlite_query($db, "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($db, 'max_len', 'max_len_step', 'max_len_finalize');
var_dump(sqlite_array_query($db, 'SELECT max_len(a) from strings'));
?>`

Dans cet exemple, nous créons une fonction d'agrégation qui va calculer la taille de la plus longue chaîne dans l'une des colonnes de la table. Pour chaque ligne, la fonction `max_len_step` est appelée, et reçoit le paramètre `context`. Le contexte est une autre variable `PHP`, et il peut contenir un tableau ou même un objet. Dans notre exemple, nous l'utilisons pour stocker la taille maximale de la colonne courante. Si `string` est plus grand que la valeur maximale que nous avons enregistré, nous modifions notre contexte en conséquence.

Une fois que toutes les lignes ont été traitées, SQLite appelle la fonction `max_len_finalize` pour déterminer le résultat de l'agrégation. Nous pourrions alors effectuer plusieurs calculs en fonction des données que nous avons récolté dans `context`. Dans notre exemple simple, nous avons calculé le résultat au fur et à mesure de la progression de la requête, ce qui nous permet de n'avoir qu'à retourner la valeur de notre contexte.

> Note : L'exemple ci-dessus ne fonctionnera pas correctement si une colonne contient une donnée binaire. Reportez-vous à la fonction sqlite_udf_decode_binary() pour plus de détails, et d'un exemple pour travailler avec des chaînes binaires.

> Tuyau : Il n'est pas recommandé de stocker une copie des valeurs dans le contexte, puis de les traiter à la fin, car cela conduirait SQLite à consommer beaucoup de mémoire : imaginez simplement la quantité de mémoire que prendrons vos millions de lignes de 32 caractères en fin de requête.

> Tuyau : Vous pouvez utiliser sqlite_create_function() et sqlite_create_aggregate() pour remplacer des fonctions natives SQLite.

Voir aussi sqlite_create_function(), sqlite_udf_encode_binary() et sqlite_udf_decode_binary().

Précédent | Sommaire | Suivant
sqlite_column | Niveau supérieur | sqlite_create_function