cc @vdegove en particulier car ça nous concerne dès etalab/transport-site#5343, et @stephane-pignal @AurelienC également.
La spécification technique actuelle (v2.3.1) de id_pdc_itinerance est la suivante, et présente des soucis qu'il va être temps de traiter.
|
{ |
|
"name": "id_pdc_itinerance", |
|
"description": "L'identifiant du point de recharge délivré selon les modalités définies à l'article 10 du décret n° 2017-26 du 12 janvier 2017. Cet ID débute par FR suivi de 3 caractères délivrés par l'AFIREV, suivi de \"E\" pour l'équivalent du point de recharge en anglais EVSE - Electric Vehicule Supply Equipment (https://afirev.fr/fr/informations-generales/). Ne pas mettre de séparateur * ou -. Si le point de recharge n'est pas en itinérance, merci d'indiquer \"Non concerné\".", |
|
"example": "FRA68E680210015", |
|
"type": "string", |
|
"constraints": { |
|
"required": true, |
|
"pattern": "(?:(?:^|,)(^[A-Z]{2}[A-Z0-9]{4,33}$|Non concerné))+$" |
|
} |
|
}, |
1. Pas de contrainte d'unicité sur id_pdc_itinerance
Chaque ligne des fichiers représentant exactement 1 "pdc", id_pdc_itinerance est réputé unique (si on met de côté les Non concernés).
Or rien ne contraint cette unicité dans la spécification technique TableSchema actuellement (voir plus haut).
Je pense que l'explication est peut-être liée à ce que je perçois comme quelque chose de difficile à exprimer correctement avec TableSchema:
- il est un peu difficile en pratique de mettre en place dans TableSchema une contrainte d'unicité "sauf pour certaines lignes".
- en temps normal (= si on n'avait pas de "Non concerné"s), il suffirait d'ajouter
"primaryKey": "id_pdc_itinerance" au JSON, et ça serait réglé (voir https://specs.frictionlessdata.io/table-schema/#primary-key)
- on ne peut pas directement dire "sauf si c'est égal à
Non concerné
- on peut tenter de contourner en mettant
required: false sur id_pdc_itinerance, mais il faut alors considérer Non concerné comme une valeur manquante, et les déclarer dans missingValues (
)
- toutefois si on fait ça,
missingValues s'applique à tous les champs... et on peut donc avoir "Non concerné" n'importe où, et on devrait le considérer comme une valeur manquante, ce qui est un peu bancal
Ce n'est pas un problème théorique: certains fichiers v2 (un nombre limité actuellement) publiés sur data.gouv contiennent plusieurs lignes pour le même id_pdc_itinerance, et sont donc considérés techniquement comme valides, alors qu'ils sont fondamentalement (pour le coup, dès la clé primaire) invalides.
Donc à voir si on arrive à exprimer ça correctement dans le schéma, ou si ça doit être un custom check en amont chez nous.
2. Reste historique dans la regexp
Si on regarde bien le pattern: (?:(?:^|,)(^[A-Z]{2}[A-Z0-9]{4,33}$|Non concerné))+$, je pense qu'il y a un reste de copié-collé dedans. Ça fait croire qu'il y aurait la possibilité de séparer plusieurs identifiants par des virgules au sein d'une seule cellule, mais ça ne l'autorise pas vraiment non plus.
On pourrait nettoyer cette regexp pour y voir plus clair, à vérifier, par exemple:
^(?:[A-Z]{2}[A-Z0-9]{4,33}|Non concerné)$
3. Durcissement de la regexp
Voir #24 et autres échanges : je ne pense pas que la regexp soit nickel par ailleurs, on ferait bien avant d'élargir ou d'être tentés de s'en inspirer ailleurs (#73) de la mettre au propre.
En vérifiant bien sûr le "taux de casse".
cc @vdegove en particulier car ça nous concerne dès etalab/transport-site#5343, et @stephane-pignal @AurelienC également.
La spécification technique actuelle (
v2.3.1) deid_pdc_itineranceest la suivante, et présente des soucis qu'il va être temps de traiter.schema-irve/statique/schema-statique.json
Lines 259 to 268 in c547877
1. Pas de contrainte d'unicité sur
id_pdc_itineranceChaque ligne des fichiers représentant exactement 1 "pdc",
id_pdc_itineranceest réputé unique (si on met de côté lesNon concernés).Or rien ne contraint cette unicité dans la spécification technique TableSchema actuellement (voir plus haut).
Je pense que l'explication est peut-être liée à ce que je perçois comme quelque chose de difficile à exprimer correctement avec TableSchema:
"primaryKey": "id_pdc_itinerance"au JSON, et ça serait réglé (voir https://specs.frictionlessdata.io/table-schema/#primary-key)Non concernérequired: falsesurid_pdc_itinerance, mais il faut alors considérerNon concernécomme une valeur manquante, et les déclarer dansmissingValues(schema-irve/statique/schema-statique.json
Lines 504 to 506 in c547877
missingValuess'applique à tous les champs... et on peut donc avoir "Non concerné" n'importe où, et on devrait le considérer comme une valeur manquante, ce qui est un peu bancalCe n'est pas un problème théorique: certains fichiers v2 (un nombre limité actuellement) publiés sur data.gouv contiennent plusieurs lignes pour le même
id_pdc_itinerance, et sont donc considérés techniquement comme valides, alors qu'ils sont fondamentalement (pour le coup, dès la clé primaire) invalides.Donc à voir si on arrive à exprimer ça correctement dans le schéma, ou si ça doit être un custom check en amont chez nous.
2. Reste historique dans la regexp
Si on regarde bien le pattern:
(?:(?:^|,)(^[A-Z]{2}[A-Z0-9]{4,33}$|Non concerné))+$, je pense qu'il y a un reste de copié-collé dedans. Ça fait croire qu'il y aurait la possibilité de séparer plusieurs identifiants par des virgules au sein d'une seule cellule, mais ça ne l'autorise pas vraiment non plus.On pourrait nettoyer cette regexp pour y voir plus clair, à vérifier, par exemple:
^(?:[A-Z]{2}[A-Z0-9]{4,33}|Non concerné)$3. Durcissement de la regexp
Voir #24 et autres échanges : je ne pense pas que la regexp soit nickel par ailleurs, on ferait bien avant d'élargir ou d'être tentés de s'en inspirer ailleurs (#73) de la mettre au propre.
En vérifiant bien sûr le "taux de casse".