Filtrer
Objectif
Le module filter restreint un jeu de données aux lignes qui satisfont un ensemble de règles. Il est interne au pipeline (voir /docs/fr/concepts/pipeline-orchestration) : il consomme le CSV produit par un nœud amont et émet un sous-ensemble strict, avec les mêmes colonnes. Aucune nouvelle donnée n'est récupérée et aucune colonne n'est ajoutée. Filtrer tôt économise le budget sur les étapes d'enrichissement coûteuses qui suivent.
Entrées
Les règles sont lues depuis l'objet config du nœud et appliquées ligne par ligne dans un ordre fixe. Chaque clé est optionnelle ; une règle vide est sans effet.
Règles standard
| Clé | Type | Comportement |
|---|---|---|
require_phone |
bool |
Garde les lignes où telephone est non vide. |
require_site |
bool |
Garde les lignes où site_web est non vide. |
require_email |
bool |
Garde les lignes où email est non vide. |
exclude_aggregators |
bool |
Écarte les lignes dont site_web pointe vers un domaine d'agrégateur connu. |
alive_only |
bool |
Garde les lignes dont le status de dead-check est alive ou stale. |
has_personal_email |
bool |
Garde les lignes où au moins une adresse dans email est une boîte personnelle (non basée sur un rôle). |
rating_min |
float |
Garde les lignes où note >= rating_min. |
reviews_min |
int |
Garde les lignes où nb_avis >= reviews_min. |
Règles avancées
| Clé | Forme | Comportement |
|---|---|---|
phone_prefix |
{ column?, prefixes[], prefix_unparseable_keep? } |
Garde les lignes dont la colonne téléphone commence par l'un des prefixes (par ex. 06, +33). Nécessite la bibliothèque phonenumbers sur le worker — sinon la règle est journalisée et ignorée. |
email_domain |
{ column?, include[], exclude[], reject_disposable? } |
Garde les lignes dont le domaine d'email est dans include (si défini) et pas dans exclude. reject_disposable écarte les fournisseurs jetables connus. |
category |
{ column, values[] } |
Garde les lignes dont la valeur de column est contenue dans values. |
dedup_column |
string |
Fusionne les lignes partageant la même valeur sur cette colonne (la première ligne l'emporte). |
Échantillonnage
| Clé | Type | Comportement |
|---|---|---|
sample_type |
"n" \| "pct" \| "" |
Sélectionne le mode d'échantillonnage appliqué après les règles ci-dessus. |
sample_n |
int |
Garde les n premières lignes retenues. |
sample_pct |
0..100 |
Garde un pourcentage des lignes retenues. |
sample_seed |
int |
Graine pour un échantillonnage aléatoire reproductible. |
Ordre d'application : drapeaux d'exigence → agrégateurs/alive/note/avis → email personnel → phone_prefix → email_domain → category → dedup_column → échantillonnage.
Sorties
Le module écrit un CSV avec les mêmes colonnes que le nœud amont, contenant uniquement les lignes retenues. Il ne produit pas de nouveaux champs (needs: [], produces: [], pipeline_passthrough: true).
| Champ | Valeur |
|---|---|
output_filename |
results_<label>.csv (même forme qu'amont) |
n_items |
Nombre de lignes gardées |
progress_unit |
lignes |
results_unit |
lignes gardées |
Cycle de vie
Cycle de vie de job standard — voir /docs/fr/concepts/jobs-lifecycle. Les jobs de filtrage tournent dans le pool parallel, sont créés par le runner de pipeline, et ne sont exposés ni sur le dashboard ni dans « Nouveau job ».
Pipeline
| Attribut | Valeur |
|---|---|
category |
process |
pipelinable |
true |
pipeline_passthrough |
true |
needs |
[] (fonctionne sur tout type amont) |
produces |
[] |
hidden_from_new_job |
true |
hidden_from_dashboard |
true |
filter accepte tout module amont. L'UI n'expose que les règles avancées dont le champ cible est effectivement présent dans la sortie amont — par exemple, le bloc phone_prefix n'est affiché que si un nœud amont produit un champ phone.
Endpoints
filter est un type de job interne au pipeline (voir /docs/fr/concepts/pipeline-orchestration). Il n'a pas d'endpoint public POST /api/jobs/filter : les jobs de filtrage sont créés par le runner de pipeline et configurés via la définition du pipeline.
Deux endpoints sont exposés aux utilisateurs :
Aperçu de filtre
POST /api/pipelines/{pipeline_id}/nodes/{node_id}/filter-preview
Applique un ensemble de règles au CSV du nœud amont en mémoire et renvoie le nombre de lignes qui correspondraient — sans créer de job. Utilisé par l'éditeur pour un retour en direct pendant l'édition des règles.
Requête :
{
"rules": {
"require_email": true,
"phone_prefix": { "column": "telephone", "prefixes": ["06", "+33"] },
"sample_type": "pct",
"sample_pct": 25
}
}
Réponse :
| Champ | Type | Notes |
|---|---|---|
total |
int |
Lignes lues depuis le CSV amont. |
matched |
int |
Lignes gardées après les règles. |
samples |
array |
Jusqu'à 5 lignes retenues, colonnes vides retirées. |
predecessor_job_id |
string |
Job dont le CSV a été prévisualisé. |
fieldnames |
string[] |
Colonnes du CSV amont. |
capped |
bool |
true si la lecture a atteint la limite de lignes (voir Limites). |
reason |
string |
Présent uniquement quand total = 0 : no_predecessor, no_data_yet, ou no_csv_found. |
Erreurs : 404 si le pipeline ou le nœud est absent, 403 si l'appelant n'est pas propriétaire du pipeline, 400 si le nœud n'est pas de type filter, 400 si les règles sont mal formées.
Items du job de pipeline
Une fois le pipeline arrivé au nœud de filtrage, le CSV résultant est servi par les endpoints génériques de jobs :
GET /api/jobs/{job_id}/itemsGET /api/jobs/{job_id}/output-columnsGET /api/jobs/{job_id}/download
Limites
Limites globales — voir /docs/fr/concepts/limits. Spécifiques au module :
| Limite | Valeur |
|---|---|
| Plafond de lignes d'aperçu | 5000 lignes (_PREVIEW_ROWS_LIMIT). Quand le CSV amont dépasse, l'aperçu lit les 5000 premières lignes et positionne capped: true. Le job de filtrage complet, à l'exécution, applique les règles à chaque ligne. |
Dépendance phone_prefix |
Nécessite le paquet phonenumbers sur le worker. S'il manque, la règle est journalisée et ignorée — les autres règles continuent de s'appliquer. |
Erreurs
| Code | Cause |
|---|---|
400 |
Le nœud référencé par l'aperçu n'est pas un nœud filter, ou rules n'est pas un objet valide. |
403 |
Le pipeline n'appartient pas à l'appelant et l'appelant n'est pas admin. |
404 |
Le pipeline ou le nœud n'existe pas. |
500 |
Le CSV amont n'a pas pu être lu (fichier corrompu, absent du disque). |
Un job de filtrage ne tombe en échec que si le CSV amont est illisible ; les valeurs de règles invalides sont ramenées à des no-ops plutôt que de lever une erreur.