openadom
  • Accueil
  • Installation
  • Fichier d'example
  • Lexique
  • A propos
  1. Fichiers d'échange
  2. Données (OA_data)
  3. Components
  4. Pattern Components
  • Introduction
    • Introduction
    • Vocabulaire
    • Fichier d'échange
  • Fichiers d'échange
    • Aide fichier
    • Application (OA_application)
    • Etiquettes (OA_tags)
    • Données (OA_data)
      • Components
        • introduction
        • Basic Components
        • Computed Components
        • Dynamic Components
        • Constant Components
        • Pattern Components
        • Paramétrage des composants
        • Verificateurs
        • Validations
        • Dépôt de fichier (OA_submission)
        • Autorisations (OA_autorisations)
      • Fichier additionnels
      • Formulaire de demande de droits
  • Pour aller plus loin
    • Glossaire
    • Authorization
    • Component Qualifiers
    • Expression Groovy
    • Internationalisation i18n
    • Submission
  • Base de données
    • Introduction
  • En réflexion
    • Verificateurs
    • Clefs étrangères
  • Exemples
    • Fichier de configuration minimale
    • Composantes
      • Example d'utilisation des composants
      • Example d'utilisation des composantes dynamiques(sites)
      • Example d'utilisation des composantes dynamiques (taxons)
      • Example d'utilisation des composantes basiques

Sur cette page

  • Principe
  • Exemple de déclaration de section OA_patternComponents:
  • Modifier cette page
  • Voir la source
  • Faire part d'un problème
  1. Fichiers d'échange
  2. Données (OA_data)
  3. Components
  4. Pattern Components

Colonnes avec pattern

OA_patternComponents

Date de publication

07 mai 2025

Résumé

On peut utiliser OA_patternComponent pour rechercher des colonnes répondant à un pattern (OA_patternForComponents).

Les groupes capturés de l’expression régulière deviendront des sous composants (OA_componentQualifiers) du composant OA_patternComponent.

Il sera possible de capturer les valeurs des colonnes adjacentes répondant à un pattern défini (OA_importHeaderPattern) qui deviendront des sous composants (OA_componentAdjacents).

Il y aura une verticalisation des colonnes (OA_patternComponents). Chaque colonne capturée sera enregistrée dans une nouvelle ligne.

Sections attendues

Sections obligatoires

  • OA_patternForComponents

Sections facultatives

  • OA_componentQualifiers
  • OA_componentAdjacents
  • OA_tags
  • OA_exportHeader
  • OA_required
  • OA_checker
  • OA_defaultValue
  • OA_langRestrictions

Principe

Le principe de pattern component est de rechercher des colonnes répondant à un pattern (expression régulière).

  • s’il y a des groupes de capture dans l’expression régulière, il pourront être récupérés dans des qualifierComponents.
  • il est possible de définir des pattern pour rechercher des adjacentComponents. Ces pattern pourront se baser sur les expressions des groupes de captures ($0, $1 …)
  • il va s’opérer une verticalisation de la ligne. C’est à dire q’une ligne sera créée pour chaque colonne répondant à un pattern component. La clef naturelle de la ligne + le groupe capturé ($0) formeront la clef naturelle réelle de la ligne (naturalKey + patterncolumnname dans la base de données).

Du fait de la verticalisation, il est possible de placer des droits sur des composantes récupérée dans un patternComponent. Par exemple si l’on capture des colonnes “variables” dans un qualifierComponent ‘variable’ alors on pourra mettre des droits à la variable.

En sortie, il sera possible de choisir entre un affichage verticalisé (une colonne par ligne + qualifiers+adjacents) ou horizontalizé (toutes les colonnes dans une ligne)

Données horizontalisées

Exemple de déclaration de section OA_patternComponents:

OA_data
OA_data:
    t_swc_swc:
        OA_patternComponents:
            swc_value:
                OA_patternForComponents: "SWC(@?)_(.*)_(.*)"
                OA_required: false
                OA_exportHeader:
                    OA_title:
                        fr: "valeur"
                        en: "value"
                    OA_description:
                        fr: "valeur"
                        en: "value"
                OA_componentQualifiers:
                    - swc_variable:
                        OA_exportHeader:
                            OA_title:
                                fr: "Humidité volumique du sol"
                                en: "Soil water concentration"
                            OA_description:
                                fr: "variable mesurée"
                                en: "mesured variable"
                        OA_tags: [__ORDER_1__]
                        OA_defaultValue:
                            OA_expression: "'humidite_volumique_du_sol'"  #optional
                        OA_checker:
                            OA_name: OA_reference
                            OA_params:
                                OA_reference:
                                    OA_name: tr_variables_var
                    - swc_repetition:
                        OA_exportHeader:
                            OA_title:
                                fr: "répétition"
                                en: "repetition"
                            OA_description:
                                fr: "répétition de la variable"
                                en: "variable repetition"
                        OA_tags: [__ORDER_2__]
                        OA_checker:
                            OA_name: OA_integer
                    - swc_profondeur:
                        OA_exportHeader:
                            OA_title:
                                fr: "profondeur"
                                en: "depth"
                            OA_description:
                                fr: "profondeur de la mesure"
                                en: "depth of measurement"
                        OA_tags: [__ORDER_3__]
                        OA_checker:
                            OA_name: OA_float
                OA_componentAdjacents:
                - swc_quality_class:
                    OA_importHeaderPattern: "qc"
                    OA_tags: [__ORDER_4__]
                    OA_exportHeader: 
                        OA_title: 
                            fr: Indice de qualité
                            en: Quality class
                        OA_description: 
                            fr  correcte
                            en: 0 for valid value; 2 for invalid value
                    OA_required: false 
                    OA_mandatory: false 
                    OA_checker: 
                        OA_name: OA_integer 
                        OA_params: 
                            OA_max: 2 
                            OA_min: 0 
                            OA_multiplicity: ONE

exemple

Définition du pattern (#OA_patternForComponents)

Pour des colonnes SWC_2_20 où 2 est la répétition de la mesure et 20 sa profondeur.

    OA_patternForComponents: "SWC(@?)_(.*)_(.*)"

On utilise une expression regulière pour rechercher dans l’en-tête du fichier des colonnes.

Les parenthèses correspondent à des groupes de capture. Ici (@?) est toujours une chaîne vide ce qui nous permet d’utiliser une Expression Groovy pour définir une valeur de remplacement

    OA_defaultValue:
        OA_expression: "'humidite_volumique_du_sol'"

On aurait aussi pu utiliser

    OA_patternForComponents: "(humidite_volumique_du_sol)_(.*)_(.*)"

Mais cela aurait changé nos en-tête de colonne SWC_2_20 -> humidite_volumique_du_sol_2_20

Important

- Le parseur va rechercher toutes les colonnes OA_basicComponents. On recherche dans les colonnes restantes celles qui "matchent" un OA_patternForComponents.

- Le comportement final de OA_allowUnexpectedColumns dépendra de la valeur de OA_allowUnexpectedColumns.

définition de la colonne pattern.

Comme tous les composants vous allez pouvoir définir un type un utilisant un Identificateurs

OA_data:
    t_swc_swc:
        OA_patternComponents:
            swc_value:
                OA_patternForComponents: "SWC(@?)_(.*)_(.*)"

Dans cet exemple pour un fichier t_swc_swc.csv nous capturons toutes les colonnes répondant au pattern “SWC(@?)_(.*)_(.*)“. ex: SWC_2_10. Les valeurs de la colonne capturée seront enregistrées dans la composante swc_value. Comme toute composante vous pourrez définir si la valeur est requise, définir un OA_checker…

Note

Le tag OA_mandatory est inutile puisque la définition ne cible pas une colonne mais des colonnes “matchantes”

Les qualifiants

Il s’agit ici de constantes de colonne valables pour toutes les lignes. Les groupes de capture (les parenthèse de l’expression régulières) peuvent être enregistrées dans la section OA_componentQualifiers. Il s’agit d’un tableau de component qualifiers dont le premier élément correspond à la première capture, le deuxième à la deuxième et ainsi de suite.

    OA_componentQualifiers:
        - swc_variable:
            OA_exportHeader:
                OA_title:
                    fr: "Humidité volumique du sol"
                    en: "Soil water concentration"
                OA_description:
                    fr: "variable mesurée"
                    en: "mesured variable"
            OA_tags: [__ORDER_1__]
            OA_defaultValue:
                OA_expression: "'humidite_volumique_du_sol'"  #optional
            OA_checker:
                OA_name: OA_reference
                OA_params:
                    OA_reference:
                        OA_name: tr_variables_var
        - swc_repetition:
            OA_exportHeader:
                OA_title:
                    fr: "répétition"
                    en: "repetition"
                OA_description:
                    fr: "répétition de la variable"
                    en: "variable repetition"
            OA_tags: [__ORDER_2__]
            OA_checker:
                OA_name: OA_integer
        - swc_profondeur:
            OA_exportHeader:
                OA_title:
                    fr: "profondeur"
                    en: "depth"
                OA_description:
                    fr: "profondeur de la mesure"
                    en: "depth of measurement"
            OA_tags: [__ORDER_3__]
            OA_checker:
                OA_name: OA_float

Dans notre cas le premier groupe n’ayant rien capturé, c’est la valeur par défaut qui est appliquée: ‘humidite_volumique_du_sol’ qui correspond à une clef étrangère “tr_variables_var”. On enregistre cette valeur dans la composante “swc_variable” et on la lie à “tr_variables_var” en utilisant un OA_checker référence.

colonnes calculées

Pour le moment il n’est pa possible d’utiliser des expressions calculées mais cette fonctionnalité est à venir. Dans ce cas on pourrait capturer le groupe ‘SWC’ et s’en servir pour trouver la ligne correspondante dans tr_variables_var. On aurait aussi pu avoir swc comme clef naturelle de cette ligne tr_variables_var.

Le deuxième groupe capturé est la répétition (ici 2) enregistré dans la composante “swc_repetition”. On utilise un OA_checker integer.

Le troisième groupe capturé est la profondeur (ici 20) enregistré dans la composante “v”. On utilise un OA_checker float.

clef naturelle

L’identifiant de la ligne est composé de la clef naturelle déclarée et de la valeur de l’en-tête de colonne (SWC_2_10).

On peut définir les sections des composantes (OA_tags, OA_checker, OA_mandatory, OA_required.)

les colonnes adjacentes

C’est une autre particularité des patterncComponents, celle de pouvoir regrouper des informations concernant une variable. Son écart-type, sa qualité, son unité… voir Cas complet (météorologie).

Une colonne adjacente s’entend comme colonne situé après la colonne de OA_patternForComponents et répondant à un OA_importHeaderPattern. Il peut y avoir un nombre indéfini de OA_componentAdjacents mais la recherche s’arrête dès qu’une colonne de répond pas à un OA_importHeaderPattern.

Les colonnes adjacentes sont définis dans la section OA_componentAdjacents.Il s’agit d’un tableau de composantes OA_componentAdjacent définis par un OA_importHeaderPattern. (expression régulière)

OA_importHeaderPattern

Chaque colonne adjacente est définie par une expression régulière. On peut réutiliser les résultat des groupes de capture de l’expression OA_patternForComponents en les mettant entre accolades.

expressions de OA_importHeaderPattern

Si l’expression OA_patternForComponents est (.*) et qu’elle capture la colonne “co2” dans le groupe de capture 1 (première parenthèse), on pourra rechercher la colonne co2_et avec l’expression OA_importHeaderPattern; {$1}_et; la colonne co2_sd avec l’expression OA_importHeaderPattern; {$1}_sd et ainsi de suite.

OA_componentAdjacents:
    - dat_temperature_minimale:   
        OA_tags: [__ORDER_2__]
        OA_importHeaderPattern: "{$1} minimale"  
        OA_exportHeader:   
            OA_title:   
            fr: Température minimale
            en: Minimal temperature 
        OA_required: false  
        OA_mandatory: false  
        OA_checker:
            OA_name: OA_float
            OA_params:
            OA_min: -15.0
            OA_max: 45.0
    - dat_temperature_maximale:    
        OA_tags: [__ORDER_2__] 
        OA_importHeaderPattern: "{$1} maximale"  
        OA_exportHeader:   
            OA_title:   
            fr: Température maximale
            en: Maximal temperature 
        OA_required: false  
        OA_mandatory: false  
        OA_checker:
            OA_name: OA_float
            OA_params:
            OA_min: -15.0
            OA_max: 45.0

On peut définir les sections des composantes (OA_tags, OA_checker, OA_mandatory, OA_required.)

stockage en base de données

Les composantes d’une section OA_patternComponents sont enregistrées en base de données comme un objet json avec pour clef l’Identificateurs de cette composante.

Dans cet objet json la valeur capturée est enregistrée avec la clef VALUE et chaque composante qualifiante ou adjacente avec l’Identificateurs de sa composante.

On trouve aussi sous le label “ORIGINAL_COLUMN_NAME” le nom de la colonne originelle, et sous le label “COLUMN_NAME” l’Identificateurs de la composante patternComponents.

{
  "swc_value": {
    "__VALUE__": "32.04",
    "swc_variable": "humidite_volumique_du_sol",
    "swc_profondeur": 165,
    "swc_repetition": 1,
    "__COLUMN_NAME__": "swc_value",
    "swc_quality_class": 0,
    "__ORIGINAL_COLUMN_NAME__": "SWC_1_165"
  }
}

expression groovy.

Si vous cherchez à récupérer une composante patternComponent, une composante qualifiante ou une composante adjacente, il faudra prendre en compte son stockage en base de donées:

exemple de récupération des valeurs d’un pattern component

Avec la déclaration

OA_patternComponents:
      cpr_variable_value:
        OA_tags: [__ORDER_8__]
        OA_patternForComponents: "(.*)" # définition d'un pattern pour l'en-tête de colonne
        OA_required: false
        OA_exportHeader:
            OA_title:
              fr: "Valeur de la variable"
              en: "Value of variable"
            OA_description:
              fr: "Valeur de la variable"
              en: "variable value"
        OA_checker:
            OA_name: OA_float
        OA_componentQualifiers:
            - cpr_variable_nom: # on définit le nom qui ira à la place du 1er (.*)
                OA_exportHeader:
                    OA_title:
                        fr: "Nom de la variable"
                        en: "Variable name"
                OA_tags: [__ORDER_7__ ]
                OA_required: true
                OA_checker:
                    OA_name: OA_reference
                    OA_params:
                        OA_reference:
                            OA_name: tr_variable_var 

On va pouvoir effectuer une validation:

Dans la ligne Object cpr_variable_value = datum.cpr_variable_value.__VALUE__; on récupère la valeur (VALUE) de la colonne capturée par la pattern composante cpr_variable_value

OA_validations:
      controle_coherence_ctc: #mandatory
        OA_i18n:
          fr: vérification des valeurs
        OA_components: 
        - cpr_variable_value 
        OA_checker:
          OA_name: OA_groovyExpression
          OA_params:
            OA_groovy:
              OA_references:
                - tr_control_coherence_ctc
                - tr_valeurs_qualitatives_qal
              OA_expression: >
                    String datatype = "cpr";
                    String site = datum.cpr_site.toString().replace(" ", "_");
                    String variable = datum.cpr_variable_value.cpr_variable_nom.toString().replace(" ", "_");
                    Object cpr_variable_value = datum.cpr_variable_value.__VALUE__;
                    /* Vérification des valeurs vides*/
                    if (cpr_variable_value == "" || cpr_variable_value == "null") {
                        return true;
                    };
                    /* Recherche du contrôle de cohérence*/ def checker_coherence = references.tr_control_coherence_ctc.find {
                        it.naturalKey.equals(variable + '__' + datatype + '__' + site);
                    };
                    if (checker_coherence) {
                        /* Vérification des valeurs numériques*/
                        if (cpr_variable_value.isFloat() &&
                                checker_coherence.refValues["ctc_min_value"] &&
                                checker_coherence.refValues["ctc_max_value"]) {

                            Float value = Float.parseFloat(cpr_variable_value);
                            Float min = Optional.ofNullable(checker_coherence.refValues["ctc_min_value"])
                                    .map { it.toString() }
                                    .map { Float.parseFloat(it) }
                                    .orElse(null);
                            Float max = Optional.ofNullable(checker_coherence.refValues["ctc_max_value"])
                                    .map { it.toString() }
                                    .map { Float.parseFloat(it) }
                                    .orElse(null);

                            if (min <= value && value <= max) {
                                return true;
                            } else {
                                throw OA_buildException("NO_COHERENCE", Map.of(
                                        "datatype", datatype,
                                        "variable", variable,
                                        "site", site,
                                        "value", value,
                                        "min", min,
                                        "max", max
                                ));
                            };
                        } else {
                            return true;
                        };
                    } else if (cpr_variable_value != "null" &&
                            cpr_variable_value != "" &&
                            (references.tr_valeurs_qualitatives_qal.find {
                                it.naturalKey == (variable + '__' + Optional.ofNullable(cpr_variable_value)
                                        .map { val -> val.toString().replace(" ", "_") }
                                        .orElse(""));
                            })) {
                        return true;
                    } else {
                        throw OA_buildException("NO_QUALITATIVE_VALUE",
                                Map.of("value", cpr_variable_value.toString())
                        );
                    };

              OA_groovyExceptions:   #optional
                NO_QUALITATIVE_VALUE:
                   fr: "La valeur {value} n'est pas dans la liste des variables qualitatives définies dans le fichier de référence 10-Liste des valeurs qualitatives."
                   en: "The value {value} is not defined in the list of qualitatives variables in reference file 10-Qualitative values list"
                NO_COHERENCE:
                   fr: "Pour le type de données {datatype} et le site {site}: la valeur {value} de la variable {variable} doit être comprise entre {min} et {max}"
                   en: "For dataType  {datatype} and site  {site}: the value {value} for variable {variable} must be between {min} and  {max}"




:::{#quarto-navigation-envelope .hidden}
[openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyLXRpdGxl"}
[openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXItdGl0bGU="}
[Paramétrage des composants]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uZXh0"}
[Constant Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1wcmV2"}
[Introduction]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMQ=="}
[Introduction]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9pbnRyb2R1Y3Rpb24vaW50cm9kdWN0aW9uLmh0bWxJbnRyb2R1Y3Rpb24="}
[Vocabulaire]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9pbnRyb2R1Y3Rpb24vdm9jYWJ1bGFpcmUuaHRtbFZvY2FidWxhaXJl"}
[Fichier d'échange]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9pbnRyb2R1Y3Rpb24vZmljaGllcl9jc3YuaHRtbEZpY2hpZXItZCfDqWNoYW5nZQ=="}
[Fichiers d'échange]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMg=="}
[Aide fichier]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvYWlkZV9maWNoaWVyLmh0bWxBaWRlLWZpY2hpZXI="}
[Application (OA_application)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvYXBwbGljYXRpb24uaHRtbEFwcGxpY2F0aW9uLShPQV9hcHBsaWNhdGlvbik="}
[Etiquettes (OA_tags)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZXRpcXVldHRlcy5odG1sRXRpcXVldHRlcy0oT0FfdGFncyk="}
[Données (OA_data)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9kYXRhLmh0bWxEb25uw6llcy0oT0FfZGF0YSk="}
[Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMw=="}
[introduction]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9jb21wb25lbnRzL2NvbXBvbmVudHMuaHRtbGludHJvZHVjdGlvbg=="}
[Basic Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9jb21wb25lbnRzL2Jhc2ljX2NvbXBvbmVudHMuaHRtbEJhc2ljLUNvbXBvbmVudHM="}
[Computed Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9jb21wb25lbnRzL2NvbXB1dGVkX2NvbXBvbmVudHMuaHRtbENvbXB1dGVkLUNvbXBvbmVudHM="}
[Dynamic Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9jb21wb25lbnRzL2R5bmFtaWNfY29tcG9uZW50cy5odG1sRHluYW1pYy1Db21wb25lbnRz"}
[Constant Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9jb21wb25lbnRzL2NvbnN0YW50X2NvbXBvbmVudHMuaHRtbENvbnN0YW50LUNvbXBvbmVudHM="}
[Pattern Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS9jb21wb25lbnRzL3BhdHRlcm5fY29tcG9uZW50cy5odG1sUGF0dGVybi1Db21wb25lbnRz"}
[Paramétrage des composants]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tNA=="}
[Verificateurs]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS92ZXJpZmljYXRldXJzLmh0bWxWZXJpZmljYXRldXJz"}
[Validations]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9maWNoaWVyX2VjaGFuZ2UvZGF0YS92YWxpZGF0aW9ucy5odG1sVmFsaWRhdGlvbnM="}
[Dépôt de fichier (OA_submission)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tNQ=="}
[Autorisations (OA_autorisations)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tNg=="}
[Fichier additionnels]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tNw=="}
[Formulaire de demande de droits]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tOA=="}
[Pour aller plus loin]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tOQ=="}
[Glossaire]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9hdXRyZXMvZ2xvc3NhaXJlLmh0bWxHbG9zc2FpcmU="}
[Authorization]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9wb3VyX2FsbGVyX3BsdXNfbG9pbi9hdXRob3JpemF0aW9uLmh0bWxBdXRob3JpemF0aW9u"}
[Component Qualifiers]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9wb3VyX2FsbGVyX3BsdXNfbG9pbi9jb21wb25lbnRfcXVhbGlmaWVycy5odG1sQ29tcG9uZW50LVF1YWxpZmllcnM="}
[Expression Groovy]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9wb3VyX2FsbGVyX3BsdXNfbG9pbi9leHByZXNzaW9uR3Jvb3Z5Lmh0bWxFeHByZXNzaW9uLUdyb292eQ=="}
[Internationalisation i18n]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9wb3VyX2FsbGVyX3BsdXNfbG9pbi9pbnRlcm5hdGlvbm5hbGlzYXRpb25faTE4bi5odG1sSW50ZXJuYXRpb25hbGlzYXRpb24taTE4bg=="}
[Submission]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9wb3VyX2FsbGVyX3BsdXNfbG9pbi9zdWJtaXNzaW9uLmh0bWxTdWJtaXNzaW9u"}
[Base de données]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMTA="}
[Introduction]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9hdXRyZXMvZGF0YWJhc2UuaHRtbEludHJvZHVjdGlvbg=="}
[En réflexion]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMTE="}
[Verificateurs]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9lblJlZmxleGlvbi9hX3Nhdm9pci5odG1sVmVyaWZpY2F0ZXVycw=="}
[Clefs étrangères]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9lblJlZmxleGlvbi9yZWZlcmVuY2VfY2hlY2tlci5odG1sQ2xlZnMtw6l0cmFuZ8OocmVz"}
[Exemples]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMTI="}
[Fichier de configuration minimale]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9leGFtcGxlcy9jb25maWd1cmF0aW9uX21pbi9kZXNjcmlwdGlvbi5odG1sRmljaGllci1kZS1jb25maWd1cmF0aW9uLW1pbmltYWxl"}
[Composantes]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOnF1YXJ0by1zaWRlYmFyLXNlY3Rpb24tMTM="}
[Example d'utilisation des composants]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9leGFtcGxlcy9tZXRlby9kZXNjcmlwdGlvbi5odG1sRXhhbXBsZS1kJ3V0aWxpc2F0aW9uLWRlcy1jb21wb3NhbnRz"}
[Example d'utilisation des composantes dynamiques(sites)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9leGFtcGxlcy9keW5hbWljQ29tcG9uYW50L2Rlc2NyaXB0aW9uLmh0bWxFeGFtcGxlLWQndXRpbGlzYXRpb24tZGVzLWNvbXBvc2FudGVzLWR5bmFtaXF1ZXMoc2l0ZXMp"}
[Example d'utilisation des composantes dynamiques (taxons)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9leGFtcGxlcy90YXhvbnMvZGVzY3JpcHRpb24uaHRtbEV4YW1wbGUtZCd1dGlsaXNhdGlvbi1kZXMtY29tcG9zYW50ZXMtZHluYW1pcXVlcy0odGF4b25zKQ=="}
[Example d'utilisation des composantes basiques]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1zaWRlYmFyOi9maWNoaWVycy9leGFtcGxlcy9iYXNpY0NvbXBvbmVudHMvZGVzY3JpcHRpb24uaHRtbEV4YW1wbGUtZCd1dGlsaXNhdGlvbi1kZXMtY29tcG9zYW50ZXMtYmFzaXF1ZXM="}
[Accueil]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6QWNjdWVpbA=="}
[/index.html]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6L2luZGV4Lmh0bWw="}
[Installation]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6SW5zdGFsbGF0aW9u"}
[/fichiers/readme.html]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6L2ZpY2hpZXJzL3JlYWRtZS5odG1s"}
[Fichier d'example]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6RmljaGllciBkJ2V4YW1wbGU="}
[/fichiers/schema-example.html]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6L2ZpY2hpZXJzL3NjaGVtYS1leGFtcGxlLmh0bWw="}
[Lexique]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6TGV4aXF1ZQ=="}
[/fichiers/autres/lexique_yaml.html]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6L2ZpY2hpZXJzL2F1dHJlcy9sZXhpcXVlX3lhbWwuaHRtbA=="}
[A propos]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6QSBwcm9wb3M="}
[/about.html]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6L2Fib3V0Lmh0bWw="}
[https://forgemia.inra.fr/anaee-dev/openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6aHR0cHM6Ly9mb3JnZW1pYS5pbnJhLmZyL2FuYWVlLWRldi9vcGVuYWRvbQ=="}
[https://openadom.fr]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWludC1uYXZiYXI6aHR0cHM6Ly9vcGVuYWRvbS5mcg=="}
[Fichiers d'échange]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWJyZWFkY3J1bWJzLUZpY2hpZXJzLWQnw6ljaGFuZ2U="}
[Données (OA_data)]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWJyZWFkY3J1bWJzLURvbm7DqWVzLShPQV9kYXRhKQ=="}
[Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWJyZWFkY3J1bWJzLUNvbXBvbmVudHM="}
[Pattern Components]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLWJyZWFkY3J1bWJzLVBhdHRlcm4tQ29tcG9uZW50cw=="}

:::{.hidden .quarto-markdown-envelope-contents render-id="Zm9vdGVyLWxlZnQ="}
Copyright 2025, OpenADOM
:::

:::



:::{#quarto-meta-markdown .hidden}
[Colonnes avec pattern – openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLW1ldGF0aXRsZQ=="}
[Colonnes avec pattern – openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLXR3aXR0ZXJjYXJkdGl0bGU="}
[Colonnes avec pattern – openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLW9nY2FyZHRpdGxl"}
[openadom]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLW1ldGFzaXRlbmFtZQ=="}
[<p>On peut utiliser OA_patternComponent pour rechercher des colonnes répondant à un pattern (OA_patternForComponents).
<p>Les groupes capturés de l'expression régulière deviendront des sous composants (OA_componentQualifiers) du composant OA_patternComponent.
<p>Il sera possible de capturer les valeurs des colonnes adjacentes répondant à un pattern défini (OA_importHeaderPattern) qui deviendront des sous composants (OA_componentAdjacents).
<p>Il y aura une verticalisation des colonnes (OA_patternComponents). Chaque colonne capturée sera enregistrée dans une nouvelle ligne.
]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLXR3aXR0ZXJjYXJkZGVzYw=="}
[<p>On peut utiliser OA_patternComponent pour rechercher des colonnes répondant à un pattern (OA_patternForComponents).
<p>Les groupes capturés de l'expression régulière deviendront des sous composants (OA_componentQualifiers) du composant OA_patternComponent.
<p>Il sera possible de capturer les valeurs des colonnes adjacentes répondant à un pattern défini (OA_importHeaderPattern) qui deviendront des sous composants (OA_componentAdjacents).
<p>Il y aura une verticalisation des colonnes (OA_patternComponents). Chaque colonne capturée sera enregistrée dans une nouvelle ligne.
]{.hidden .quarto-markdown-envelope-contents render-id="cXVhcnRvLW9nY2FyZGRkZXNj"}
:::




<!-- -->

::: {.quarto-embedded-source-code}
```````````````````{.markdown shortcodes="false"}
---
title: Colonnes avec pattern
subtitle: OA_patternComponents
abstract-title: >
    Verticalisation qui parse selon une regexp le nom des colonnes d'un fichier csv.
abstract: >
    <p>On peut utiliser OA_patternComponent pour rechercher des colonnes répondant à un pattern (OA_patternForComponents). 

    <p>Les groupes capturés de l'expression régulière deviendront des sous composants (OA_componentQualifiers) du composant OA_patternComponent.

    <p>Il sera possible de capturer les valeurs des colonnes adjacentes répondant à un pattern défini (OA_importHeaderPattern) qui deviendront des sous composants (OA_componentAdjacents).

    <p>Il y aura une verticalisation des colonnes (OA_patternComponents). Chaque colonne capturée sera enregistrée dans une nouvelle ligne.
sections:
  mandatory:
    - OA_patternForComponents
  optional:
    - OA_componentQualifiers
    - OA_componentAdjacents
    - OA_tags
    - OA_exportHeader
    - OA_required
    - OA_checker
    - OA_defaultValue
    - OA_langRestrictions
---

## Principe

Le principe de pattern component est de rechercher des colonnes répondant à un pattern (expression régulière).

-   s'il y a des groupes de capture dans l'expression régulière, il pourront être récupérés dans des qualifierComponents.
-   il est possible de définir des pattern pour rechercher des adjacentComponents. Ces pattern pourront se baser sur les expressions des groupes de captures (\$0, \$1 ...)
-   il va s'opérer une verticalisation de la ligne. C'est à dire q'une ligne sera créée pour chaque colonne répondant à un pattern component. La clef naturelle de la ligne + le groupe capturé (\$0) formeront la clef naturelle réelle de la ligne (naturalKey + patterncolumnname dans la base de données).

Du fait de la verticalisation, il est possible de placer des droits sur des composantes récupérée dans un patternComponent. Par exemple si l'on capture des colonnes "variables" dans un qualifierComponent 'variable' alors on pourra mettre des droits à la variable.

En sortie, il sera possible de choisir entre un affichage verticalisé (une colonne par ligne + qualifiers+adjacents) ou horizontalizé (toutes les colonnes dans une ligne)

![Données horizontalisées](images/paste-2.png)

![](images/paste-2.png)

## Exemple de déclaration de section OA_patternComponents:

::: {.callout-note title="OA_data" collapse="false"}
``` yaml
OA_data:
    t_swc_swc:
        OA_patternComponents:
            swc_value:
                OA_patternForComponents: "SWC(@?)_(.*)_(.*)"
                OA_required: false
                OA_exportHeader:
                    OA_title:
                        fr: "valeur"
                        en: "value"
                    OA_description:
                        fr: "valeur"
                        en: "value"
                OA_componentQualifiers:
                    - swc_variable:
                        OA_exportHeader:
                            OA_title:
                                fr: "Humidité volumique du sol"
                                en: "Soil water concentration"
                            OA_description:
                                fr: "variable mesurée"
                                en: "mesured variable"
                        OA_tags: [__ORDER_1__]
                        OA_defaultValue:
                            OA_expression: "'humidite_volumique_du_sol'"  #optional
                        OA_checker:
                            OA_name: OA_reference
                            OA_params:
                                OA_reference:
                                    OA_name: tr_variables_var
                    - swc_repetition:
                        OA_exportHeader:
                            OA_title:
                                fr: "répétition"
                                en: "repetition"
                            OA_description:
                                fr: "répétition de la variable"
                                en: "variable repetition"
                        OA_tags: [__ORDER_2__]
                        OA_checker:
                            OA_name: OA_integer
                    - swc_profondeur:
                        OA_exportHeader:
                            OA_title:
                                fr: "profondeur"
                                en: "depth"
                            OA_description:
                                fr: "profondeur de la mesure"
                                en: "depth of measurement"
                        OA_tags: [__ORDER_3__]
                        OA_checker:
                            OA_name: OA_float
                OA_componentAdjacents:
                - swc_quality_class:
                    OA_importHeaderPattern: "qc"
                    OA_tags: [__ORDER_4__]
                    OA_exportHeader: 
                        OA_title: 
                            fr: Indice de qualité
                            en: Quality class
                        OA_description: 
                            fr  correcte
                            en: 0 for valid value; 2 for invalid value
                    OA_required: false 
                    OA_mandatory: false 
                    OA_checker: 
                        OA_name: OA_integer 
                        OA_params: 
                            OA_max: 2 
                            OA_min: 0 
                            OA_multiplicity: ONE

exemple

Définition du pattern (#OA_patternForComponents)

Pour des colonnes SWC_2_20 où 2 est la répétition de la mesure et 20 sa profondeur.

    OA_patternForComponents: "SWC(@?)_(.*)_(.*)"

On utilise une expression regulière pour rechercher dans l’en-tête du fichier des colonnes.

Les parenthèses correspondent à des groupes de capture. Ici (@?) est toujours une chaîne vide ce qui nous permet d’utiliser une Expression Groovy pour définir une valeur de remplacement

    OA_defaultValue:
        OA_expression: "'humidite_volumique_du_sol'"

On aurait aussi pu utiliser

    OA_patternForComponents: "(humidite_volumique_du_sol)_(.*)_(.*)"

Mais cela aurait changé nos en-tête de colonne SWC_2_20 -> humidite_volumique_du_sol_2_20

Important

- Le parseur va rechercher toutes les colonnes OA_basicComponents. On recherche dans les colonnes restantes celles qui "matchent" un OA_patternForComponents.

- Le comportement final de OA_allowUnexpectedColumns dépendra de la valeur de OA_allowUnexpectedColumns.

définition de la colonne pattern.

Comme tous les composants vous allez pouvoir définir un type un utilisant un Identificateurs

OA_data:
    t_swc_swc:
        OA_patternComponents:
            swc_value:
                OA_patternForComponents: "SWC(@?)_(.*)_(.*)"

Dans cet exemple pour un fichier t_swc_swc.csv nous capturons toutes les colonnes répondant au pattern “SWC(@?)_(.*)_(.*)“. ex: SWC_2_10. Les valeurs de la colonne capturée seront enregistrées dans la composante swc_value. Comme toute composante vous pourrez définir si la valeur est requise, définir un OA_checker…

Note

Le tag OA_mandatory est inutile puisque la définition ne cible pas une colonne mais des colonnes “matchantes”

Les qualifiants

Il s’agit ici de constantes de colonne valables pour toutes les lignes. Les groupes de capture (les parenthèse de l’expression régulières) peuvent être enregistrées dans la section OA_componentQualifiers. Il s’agit d’un tableau de component qualifiers dont le premier élément correspond à la première capture, le deuxième à la deuxième et ainsi de suite.

    OA_componentQualifiers:
        - swc_variable:
            OA_exportHeader:
                OA_title:
                    fr: "Humidité volumique du sol"
                    en: "Soil water concentration"
                OA_description:
                    fr: "variable mesurée"
                    en: "mesured variable"
            OA_tags: [__ORDER_1__]
            OA_defaultValue:
                OA_expression: "'humidite_volumique_du_sol'"  #optional
            OA_checker:
                OA_name: OA_reference
                OA_params:
                    OA_reference:
                        OA_name: tr_variables_var
        - swc_repetition:
            OA_exportHeader:
                OA_title:
                    fr: "répétition"
                    en: "repetition"
                OA_description:
                    fr: "répétition de la variable"
                    en: "variable repetition"
            OA_tags: [__ORDER_2__]
            OA_checker:
                OA_name: OA_integer
        - swc_profondeur:
            OA_exportHeader:
                OA_title:
                    fr: "profondeur"
                    en: "depth"
                OA_description:
                    fr: "profondeur de la mesure"
                    en: "depth of measurement"
            OA_tags: [__ORDER_3__]
            OA_checker:
                OA_name: OA_float

Dans notre cas le premier groupe n’ayant rien capturé, c’est la valeur par défaut qui est appliquée: ‘humidite_volumique_du_sol’ qui correspond à une clef étrangère “tr_variables_var”. On enregistre cette valeur dans la composante “swc_variable” et on la lie à “tr_variables_var” en utilisant un OA_checker référence.

colonnes calculées

Pour le moment il n’est pa possible d’utiliser des expressions calculées mais cette fonctionnalité est à venir. Dans ce cas on pourrait capturer le groupe ‘SWC’ et s’en servir pour trouver la ligne correspondante dans tr_variables_var. On aurait aussi pu avoir swc comme clef naturelle de cette ligne tr_variables_var.

Le deuxième groupe capturé est la répétition (ici 2) enregistré dans la composante “swc_repetition”. On utilise un OA_checker integer.

Le troisième groupe capturé est la profondeur (ici 20) enregistré dans la composante “v”. On utilise un OA_checker float.

clef naturelle

L’identifiant de la ligne est composé de la clef naturelle déclarée et de la valeur de l’en-tête de colonne (SWC_2_10).

On peut définir les sections des composantes (OA_tags, OA_checker, OA_mandatory, OA_required.)

les colonnes adjacentes

C’est une autre particularité des patterncComponents, celle de pouvoir regrouper des informations concernant une variable. Son écart-type, sa qualité, son unité… voir Cas complet (météorologie).

Une colonne adjacente s’entend comme colonne situé après la colonne de OA_patternForComponents et répondant à un OA_importHeaderPattern. Il peut y avoir un nombre indéfini de OA_componentAdjacents mais la recherche s’arrête dès qu’une colonne de répond pas à un OA_importHeaderPattern.

Les colonnes adjacentes sont définis dans la section OA_componentAdjacents.Il s’agit d’un tableau de composantes OA_componentAdjacent définis par un OA_importHeaderPattern. (expression régulière)

OA_importHeaderPattern

Chaque colonne adjacente est définie par une expression régulière. On peut réutiliser les résultat des groupes de capture de l’expression OA_patternForComponents en les mettant entre accolades.

expressions de OA_importHeaderPattern

Si l’expression OA_patternForComponents est (.*) et qu’elle capture la colonne “co2” dans le groupe de capture 1 (première parenthèse), on pourra rechercher la colonne co2_et avec l’expression OA_importHeaderPattern; {$1}_et; la colonne co2_sd avec l’expression OA_importHeaderPattern; {$1}_sd et ainsi de suite.

OA_componentAdjacents:
    - dat_temperature_minimale:   
        OA_tags: [__ORDER_2__]
        OA_importHeaderPattern: "{$1} minimale"  
        OA_exportHeader:   
            OA_title:   
            fr: Température minimale
            en: Minimal temperature 
        OA_required: false  
        OA_mandatory: false  
        OA_checker:
            OA_name: OA_float
            OA_params:
            OA_min: -15.0
            OA_max: 45.0
    - dat_temperature_maximale:    
        OA_tags: [__ORDER_2__] 
        OA_importHeaderPattern: "{$1} maximale"  
        OA_exportHeader:   
            OA_title:   
            fr: Température maximale
            en: Maximal temperature 
        OA_required: false  
        OA_mandatory: false  
        OA_checker:
            OA_name: OA_float
            OA_params:
            OA_min: -15.0
            OA_max: 45.0

On peut définir les sections des composantes (OA_tags, OA_checker, OA_mandatory, OA_required.)

stockage en base de données

Les composantes d’une section OA_patternComponents sont enregistrées en base de données comme un objet json avec pour clef l’Identificateurs de cette composante.

Dans cet objet json la valeur capturée est enregistrée avec la clef VALUE et chaque composante qualifiante ou adjacente avec l’Identificateurs de sa composante.

On trouve aussi sous le label “ORIGINAL_COLUMN_NAME” le nom de la colonne originelle, et sous le label “COLUMN_NAME” l’Identificateurs de la composante patternComponents.

{
  "swc_value": {
    "__VALUE__": "32.04",
    "swc_variable": "humidite_volumique_du_sol",
    "swc_profondeur": 165,
    "swc_repetition": 1,
    "__COLUMN_NAME__": "swc_value",
    "swc_quality_class": 0,
    "__ORIGINAL_COLUMN_NAME__": "SWC_1_165"
  }
}

expression groovy.

Si vous cherchez à récupérer une composante patternComponent, une composante qualifiante ou une composante adjacente, il faudra prendre en compte son stockage en base de donées:

exemple de récupération des valeurs d’un pattern component

Avec la déclaration

OA_patternComponents:
      cpr_variable_value:
        OA_tags: [__ORDER_8__]
        OA_patternForComponents: "(.*)" # définition d'un pattern pour l'en-tête de colonne
        OA_required: false
        OA_exportHeader:
            OA_title:
              fr: "Valeur de la variable"
              en: "Value of variable"
            OA_description:
              fr: "Valeur de la variable"
              en: "variable value"
        OA_checker:
            OA_name: OA_float
        OA_componentQualifiers:
            - cpr_variable_nom: # on définit le nom qui ira à la place du 1er (.*)
                OA_exportHeader:
                    OA_title:
                        fr: "Nom de la variable"
                        en: "Variable name"
                OA_tags: [__ORDER_7__ ]
                OA_required: true
                OA_checker:
                    OA_name: OA_reference
                    OA_params:
                        OA_reference:
                            OA_name: tr_variable_var 

On va pouvoir effectuer une validation:

Dans la ligne Object cpr_variable_value = datum.cpr_variable_value.__VALUE__; on récupère la valeur (VALUE) de la colonne capturée par la pattern composante cpr_variable_value

OA_validations:
      controle_coherence_ctc: #mandatory
        OA_i18n:
          fr: vérification des valeurs
        OA_components: 
        - cpr_variable_value 
        OA_checker:
          OA_name: OA_groovyExpression
          OA_params:
            OA_groovy:
              OA_references:
                - tr_control_coherence_ctc
                - tr_valeurs_qualitatives_qal
              OA_expression: >
                    String datatype = "cpr";
                    String site = datum.cpr_site.toString().replace(" ", "_");
                    String variable = datum.cpr_variable_value.cpr_variable_nom.toString().replace(" ", "_");
                    Object cpr_variable_value = datum.cpr_variable_value.__VALUE__;
                    /* Vérification des valeurs vides*/
                    if (cpr_variable_value == "" || cpr_variable_value == "null") {
                        return true;
                    };
                    /* Recherche du contrôle de cohérence*/ def checker_coherence = references.tr_control_coherence_ctc.find {
                        it.naturalKey.equals(variable + '__' + datatype + '__' + site);
                    };
                    if (checker_coherence) {
                        /* Vérification des valeurs numériques*/
                        if (cpr_variable_value.isFloat() &&
                                checker_coherence.refValues["ctc_min_value"] &&
                                checker_coherence.refValues["ctc_max_value"]) {

                            Float value = Float.parseFloat(cpr_variable_value);
                            Float min = Optional.ofNullable(checker_coherence.refValues["ctc_min_value"])
                                    .map { it.toString() }
                                    .map { Float.parseFloat(it) }
                                    .orElse(null);
                            Float max = Optional.ofNullable(checker_coherence.refValues["ctc_max_value"])
                                    .map { it.toString() }
                                    .map { Float.parseFloat(it) }
                                    .orElse(null);

                            if (min <= value && value <= max) {
                                return true;
                            } else {
                                throw OA_buildException("NO_COHERENCE", Map.of(
                                        "datatype", datatype,
                                        "variable", variable,
                                        "site", site,
                                        "value", value,
                                        "min", min,
                                        "max", max
                                ));
                            };
                        } else {
                            return true;
                        };
                    } else if (cpr_variable_value != "null" &&
                            cpr_variable_value != "" &&
                            (references.tr_valeurs_qualitatives_qal.find {
                                it.naturalKey == (variable + '__' + Optional.ofNullable(cpr_variable_value)
                                        .map { val -> val.toString().replace(" ", "_") }
                                        .orElse(""));
                            })) {
                        return true;
                    } else {
                        throw OA_buildException("NO_QUALITATIVE_VALUE",
                                Map.of("value", cpr_variable_value.toString())
                        );
                    };

              OA_groovyExceptions:   #optional
                NO_QUALITATIVE_VALUE:
                   fr: "La valeur {value} n'est pas dans la liste des variables qualitatives définies dans le fichier de référence 10-Liste des valeurs qualitatives."
                   en: "The value {value} is not defined in the list of qualitatives variables in reference file 10-Qualitative values list"
                NO_COHERENCE:
                   fr: "Pour le type de données {datatype} et le site {site}: la valeur {value} de la variable {variable} doit être comprise entre {min} et {max}"
                   en: "For dataType  {datatype} and site  {site}: the value {value} for variable {variable} must be between {min} and  {max}"
Retour au sommet
Constant Components
Paramétrage des composants
Copyright 2025, OpenADOM
 
  • Modifier cette page
  • Voir la source
  • Faire part d'un problème