Aller au contenu

Critères

phil/listings

Un critère est un nom que définit l'application (des segments ASCII minuscules d'au plus 64 octets) et une valeur de l'un de trois types :

TypeConstruit parContientCorrespond à un critère recherché de même nom et de même type quand
ChoixCriterion::choice($name, $choices)de 1 à 32 valeurs distinctes d'au plus 64 lettres ASCII, chiffres, ., _, : ou -, dans l'ordre donnéils partagent au moins une valeur
PlageCriterion::range($name, $min, $max)deux entiers, bornes comprises, $min n'étant pas supérieur à $maxils partagent au moins un entier
IndicateurCriterion::flag($name, $flag)oui ou nonils sont égaux

Les valeurs d'un choix sont des clés, pas des libellés : l'application les traduit, et la même clé veut dire la même chose dans toutes les langues. Une plage contient des nombres entiers : une fourchette de salaire en unités entières, un nombre de joueurs, une tranche d'âge. Les champs qu'un type n'utilise pas sont vides : un choix n'a pas de bornes, une plage n'a pas de choix.

use Phil\Listings\Criteria;
use Phil\Listings\Criterion;

$listing = Criteria::of([
    Criterion::choice('day', ['sat', 'sun']),
    Criterion::range('players', 3, 5),
    Criterion::flag('beginners', true),
]);

$search = Criteria::of([Criterion::choice('day', ['sun']), Criterion::range('players', 4, 8)]);

$listing->meets($search);   // true: Sunday is shared, and 4 or 5 players fit both

Criteria::of() garde au plus 32 critères, un par nom. Les critères d'une annonce correspondent à ceux d'une recherche quand chaque critère que veut la recherche correspond au critère de même nom de l'annonce : une annonce qui n'indique pas un critère ne correspond pas à une recherche qui le veut, et une recherche qui ne veut rien correspond à toutes les annonces.

meets() est la règle, pas la recherche : une application qui a beaucoup d'annonces les filtre d'abord dans son stockage ou son moteur de recherche, puis applique meets() à ce qu'elle lit, ou indexe la même règle. Son coût est borné par les 32 critères et les 32 valeurs de chaque côté.