Erreur lors de la vérification des clés fonctionnelles d'un objet lié si la clé contient des espaces devant / ou un champ null

Problem description

Bonjour,

Je constate les deux anomalies suivantes au niveau de la vérification des clés fonctionnelles en v5 pour les objets liés :

  • Anomalie 1 : si un attribut de la clé fonctionnelle de l’objet lié est vide (attribut non obligatoire) la vérification ne fonctionne pas.
  • Anomalie 2 : si un attribut de la clé fonctionnelle de l’objet lié contient des espaces au début ou à la fin la vérification ne fonctionne pas (en v4 il n’y avait pas de trim, lorsqu’on passe en v5 en conservant les données créées en v4 on peut donc tomber dans ce cas).

Steps to reproduce

  1. Sur une instance Simplicité v4.0.P25 (2022-11-10 00:35) j’ai créé les deux objets métiers suivants :

Remarque : la clé fonctionnelle de FgaCountry est fgaCouName qui est obligatoire et fgaCouCode qui est non obligatoire.

  1. J’ai créé plusieurs pays :

Le pays « None » n’a pas de code et le nom du pays « space » contient un espace au début et à la fin :

image

  1. J’ouvre le formulaire de création d’une ville, je sélectionne le pays « None » et je mets « N » dans le champ « City » et j’enregistre. L’enregistrement se fait sans erreurs.

  1. J’ouvre le formulaire de création d’une ville, je sélectionne le pays « space » et je mets « S » dans le champ « City » et j’enregistre. L’enregistrement se fait sans erreurs.

  1. J’arrête mon conteneur Simplicité, je modifie mon docker-compose pour passer de Simplicité v4 à Simplicité v5 et je reconstruis le conteneur Simplicité :

image

  1. Une fois la migration terminée, je me reconnecte à l’application.
  2. Les données que j’avais créé en v4 sont toujours présentes :


  1. J’ouvre le formulaire de création d’une ville, je sélectionne le pays « None » et je mets « N2 » dans le champ « City » et j’enregistre. [Anomalie 1] Une erreur s’affiche bloquant la création :

  1. J’ouvre le formulaire de création d’une ville, je sélectionne le pays « space » et je mets « S2 » dans le champ « City » et j’enregistre. [Anomalie 2] Une erreur s’affiche bloquant la création :

  1. J’ouvre le formulaire de création d’une ville, je sélectionne le pays « France / FR » et je mets « F » dans le champ « City » et j’enregistre. L’enregistrement se fait sans erreurs.

Si besoin, voici le module :

https://fts.capgemini.com/pubpwd/58652778811050123264/FgaDemo-0.2.zip link valid until 2022-12-27 9:00 UTC (public access with local password)

Additional credentials, to enter in specific popup box when prompted for authentication.

username: qfpnkhobi

Password: Mq2XFtAf8N

Technical information

Instance /health

[Platform]
Status=OK
Version=5.2.26
BuiltOn=2022-12-20 22:00
Git=5.2/032e02559b23adcd0564356a4dc0444dddc989d3
Encoding=UTF-8
EndpointIP=
EndpointURL=
TimeZone=UTC
SystemDate=2022-12-22 08:25:14

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=
ActiveSessions=0
TotalUsers=3
EnabledUsers=1
LastLoginDate=2022-12-22 08:13:13

[Server]
ServerInfo=Apache Tomcat/9.0.70
ServerType=WEB
ServerActiveSessions=1
ServerSessionTimeout=30

[OS]
Name=Linux
Architecture=amd64
Version=5.10.16.3-microsoft-standard-WSL2
DockerImageName=centos7
SystemEncoding=UTF-8

[JavaVM]
Version=17.0.5
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.5+8
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=395216
HeapSize=614400
HeapMaxSize=3131392
TotalFreeSize=2912208

[Cache]
ObjectCache=151
ObjectCacheMax=10000
ObjectCacheRatio=1
ProcessCache=11
ProcessCacheMax=10000
ProcessCacheRatio=0
APIGrantCache=0
APIGrantCacheMax=1000
APIGrantRatio=0

[Database]
Vendor=3
ProductName=PostgreSQL
ProductVersion=13.9 (Debian 13.9-1.pgdg110+1)
DriverName=PostgreSQL JDBC Driver
DriverVersion=42.5.1
DBDate=2022-12-22 08:25:14
DBDateOffset=0
DBPatchLevel=5;P02;00beb770ca0f9152abac9a7448a03091
UsingBLOBs=true

[Healthcheck]
Date=2022-12-22 08:25:14
ElapsedTime=4

Bonjour,

Merci pour ce modop très détaillé.

En V5 Simplicité renforce le contrôle de la référence lors du save = en vérifiant que le row_id de la référence matche bien les valeurs de la clé référencée, il y un trim qq part qui fait que la recherche ne trouve rien.

Nous n’avons jamais rencontré ces problèmes car en général :

  • une clé fonctionnelle est obligatoire : le code devrait être seule clé fonctionnelle obligatoire (et mettre N pour None par exemple), et d’ailleurs certaines bases n’acceptent pas d’index unique null, dans le cas d’une clé composite ça se discute en effet
  • la V5 force des “trim” et du coup il ne retrouve plus la référence lors du save : ça me semble injouable de revenir en arrière : il faut plutôt faire un update de votre colonne en forçant un “trim” lors de la migration, car en soit garder des espaces sur un champ clé posera d’autres problèmes (obligé de faire des trim à la main dans toutes les publications, test d’égalité en java, doublon fonctionnel entre " a" et “a” et " a "…)

On va regarder si on peut rendre le trim “passant” au save pour que ce ne soit pas limitant dans ces 2 cas de blocage.

Mais à mon avis c’est surtout un problème de qualité de données (pourquoi avoir des espaces ?) et de modélisation (code null ?).

merci pour ta réponse rapide François.

Pour le premier point avec un champ de la clé fonctionnelle qui n’est pas obligatoire, le cas de mon exemple n’est pas parlant en effet mais on a des cas métiers où “null” dans un champ est une valeur qui a du sens.

Exemple : on a un objet contrat dont la clé fonctionnelle est composée de plusieurs champs dont le type (obligatoire), la date de début (obligatoire) et la date de fin (non obligatoire en fonction du type). Pour les contrats CDD, la date de début et de fin sont obligatoires (on ne peut pas créer 2 contrats CDD avec la même date de début et de fin pour un agent). Pour les contrats CDI, la date de début est obligatoire mais la date de fin ne l’est pas car si l’agent est toujours en poste la date sera null et s’il n’est plus en poste la date de fin sera non null.

Pour le second point, les utilisateurs ne font pas forcément attention aux espaces au début et à la fin (notamment s’ils font un copier/coller depuis word ou autre) et comme en v4 il n’y a pas de trim les espaces étaient conservées en BDD.
Je comprends tes remarques sur ce point, nous allons faire des requêtes SQL de redressement pour supprimer les espaces.

Suite à analyse dans Simplicité, on reproduit bien ces comportements. Il a fallu faire un update en base pour ajouter des espaces à ’ space ’ car on ne peut pas en V5 qui force un trim.

  • Champ clé null : historiquement Simplicité forçait en obligatoire tout champ clé fonctionnelle. Cette contrainte a été retirée pour permettre ce genre de paramétrage avec des clés composites / partiellement renseignée.

=> on va améliorer le service “populate” pour qu’il cherche bien avec un “is null” si un champ de la clé fonctionnelle est facultatif et vide. Actuellement ça remet la FK à vide (ce qui explique l’erreur de champ obligatoire côté UI).

  • Trim : là par contre c’est impossible de corriger ça, car ça impliquerait de faire une recherche non indexée sur la clé du genre where trim(colonne)='space' => il convient de faire une reprise de données pour garder de bonnes performances et éviter les doublons potentiels
    ('espace' et ' espace ' peuvent cohabiter et pour le métier c’est un doublon)
1 Like

ok, merci François :slight_smile:

L’amélioration du populate sera livrée en 5.2.27

1 Like

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.