diff --git a/documentations/openadom/_quarto.yml b/documentations/openadom/_quarto.yml index 2ffb8aed621adb694d3cc5d7608a767d24f7f00e..02c9dc26fa9afc185668986cc67590cd948b7b4b 100644 --- a/documentations/openadom/_quarto.yml +++ b/documentations/openadom/_quarto.yml @@ -31,15 +31,17 @@ website: - text: Vocabulaire href: fichiers/introduction/vocabulaire.qmd - text: Fichier d'échange - href: fichiers/introduction/yaml.qmd + href: fichiers/introduction/fichier_csv.qmd - section: Fichiers d'échange contents: - - text: Données - href: fichiers/fichier_echange/data.md - text: Aide fichier href: fichiers/fichier_echange/aide_fichier.qmd + - text: Application (OA_application) + href: fichiers/fichier_echange/application.qmd + - text: Données + href: fichiers/fichier_echange/data.qmd - text: Etiquettes - href: fichiers/fichier_echange/etiquettes.md + href: fichiers/fichier_echange/etiquettes.qmd - section: Components contents: - text: Basic Components @@ -49,11 +51,24 @@ website: - text: Dynamic Components href: fichiers/fichier_echange/data/components/dynamic_components.qmd - text: Constant Components - href: /fichiers/fichier_echange/data/components/constant_components.md + href: fichiers/fichier_echange/data/components/constant_components.md - text: Pattern Components - href: fichiers/fichier_echange/data/components/pattern_components.md + href: fichiers/fichier_echange/data/components/pattern_components.qmd + - section: + text: Paramétrage des composants + href: fichiers/fichier_echange/data/components/components_description.qmd + contents: + - text: Etiquettes (OA_tags) + href: fichiers/fichier_echange/etiquettes.qmd + - text: Verificateurs - href: fichiers/fichier_echange/verificateurs.md + href: fichiers/fichier_echange/verificateurs.qmd + - text: Validations + href: fichiers/fichier_echange/validations.qmd + - text: Dépôt de fichier (OA_submission) + href: fichiers/fichier_echange/submission.qmd + - text: Autorisations (OA_autorisations) + href: fichiers/fichier_echange/authorizations.qmd - section: Pour aller plus loin contents: - text: Authorization diff --git a/documentations/openadom/_variables.yml b/documentations/openadom/_variables.yml index 354d3bf22856cb49091e4557146fe56f3b29c435..898c7389217fc523b7ded50530745ce4b2c0e44e 100644 --- a/documentations/openadom/_variables.yml +++ b/documentations/openadom/_variables.yml @@ -37,50 +37,101 @@ page-refs: link-nk: "[clef naturelle](/fichiers/introduction/vocabulaire.qmd#clef-naturelle)" link-hk: "[clef hierarchique](/fichiers/introduction/vocabulaire.qmd#clef-hierarchique)" link-data: "[données](/fichiers/introduction/vocabulaire.qmd#referentiels)" - yaml: - href: /fichiers/introduction/yaml.qmd + link-identificateurs: "[Identificateurs](/fichiers/introduction/vocabulaire.qmd#identificateurs)" + csv: + href: /fichiers/introduction/fichier_csv.qmd text: Fichier d'échange - link: "[Fichier d'échange](/fichiers/introduction/yaml.qmd)" + link: "[Fichier d'échange](/fichiers/introduction/fichier_csv.qmd)" # Section Fichiers d'échange + application: + href: /fichiers/fichier_echange/application.qmd + text: Application (OA_application) + link: "[Application (OA_application)](/fichiers/fichier_echange/application.qmd)" + oa: "[OA_application](/fichiers/fichier_echange/application.qmd)" + oa-name: "[OA_application](/fichiers/fichier_echange/application.qmd#name)" + oa-version: "[OA_application](/fichiers/fichier_echange/application.qmd#version)" + oa-defaultLanguage: "[OA_application](/fichiers/fichier_echange/application.qmd#defaultLanguage)" + oa-comment: "[OA_application](/fichiers/fichier_echange/application.qmd#comment)" + oa-i18n: "[OA_i18n](/fichiers/fichier_echange/application.qmd#i18n)" data: - href: /fichiers/fichier_echange/data.md + href: /fichiers/fichier_echange/data.qmd text: Données - link: "[Données](/fichiers/fichier_echange/data.md)" + link: "[Données](/fichiers/fichier_echange/data.qmd)" + oa: "[OA_data](/fichiers/fichier_echange/data.qmd)" + oa-nk: "[OA_naturalKey](/fichiers/fichier_echange/data.qmd#nk)" + oa-i18n: "[OA_i18n](/fichiers/fichier_echange/data.qmd#i18n)" + oa-displayPattern: "[OA_i18nDisplayPattern](/fichiers/fichier_echange/data.qmd#displayPattern)" + oa-components: "[Components](/fichiers/fichier_echange/data.qmd#components)" + oa-headerLine: "[OA_DATA_HEADER_LINE](/fichiers/fichier_echange/data.qmd#headerLine)" + oa-firstLine: "[OA_DATA_FIRST_LINE](/fichiers/fichier_echange/data.qmd#firstLine)" + oa-unexpectedColumns: "[OA_ALLOW_UNEXPECTED_COLUMNS](/fichiers/fichier_echange/data.qmd#unexpectedColumns)" + oa-separator: "[OA_separator](/fichiers/fichier_echange/data.qmd#separator)" + oa-validations: "[OA_separator](/fichiers/fichier_echange/data.qmd#validations)" + authorizations: + href: /fichiers/fichier_echange/submission.qmd + text: Définition des composantes participant à la construction d'autorisations. + link: "[Authorizations](/fichiers/fichier_echange/authorizations.qmd)" + oa: "[OA_authorizations](/fichiers/fichier_echange/authorizations.qmd)" + submission: + href: /fichiers/fichier_echange/submission.qmd + text: Stratégie de dépôt + link: "[Stratégie de dépôt](/fichiers/fichier_echange/submission.qmd)" + oa: "[OA_submission](/fichiers/fichier_echange/submission.qmd)" + validations: + href: /fichiers/fichier_echange/validations.qmd + text: Règles de validations + link: "[Règles de validations](/fichiers/fichier_echange/validations.qmd)" + oa: "[OA_validations](/fichiers/fichier_echange/validations.qmd)" aide-fichier: href: /fichiers/fichier_echange/aide_fichier.qmd text: Aide fichier link: "[Aide fichier](/fichiers/fichier_echange/aide_fichier.qmd)" + oa-version: "[OA_validations](/fichiers/fichier_echange/aide_fichier.qmd#openadom_version)" etiquettes: - href: /fichiers/fichier_echange/etiquettes.md + href: /fichiers/fichier_echange/etiquettes.qmd text: Etiquettes - link: "[Etiquettes](/fichiers/fichier_echange/etiquettes.md)" + link: "[Etiquettes](/fichiers/fichier_echange/etiquettes.qmd)" + oa: "[OA_tags](/fichiers/fichier_echange/etiquettes.qmd)" # Components + desc-comp: + href: /home/ptcherniati/projets/backend/documentations/openadom/fichiers/fichier_echange/data/components/components_description.qmd + text: "Description des \"components\"" + link: "[Description des \"components\"](/home/ptcherniati/projets/backend/documentations/openadom/fichiers/fichier_echange/data/components/components_description.qmd)" + basic-comp: href: /fichiers/fichier_echange/data/components/basic_components.qmd text: Basic Components link: "[Basic Components](/fichiers/fichier_echange/data/components/basic_components.qmd)" + oa: "[OA_basicComponents](/fichiers/fichier_echange/data/components/basic_components.qmd)" computed-comp: href: /fichiers/fichier_echange/data/components/computed_components.md text: Computed Components link: "[Computed Components](/fichiers/fichier_echange/data/components/computed_components.md)" + oa: "[OA_computedComponents](/fichiers/fichier_echange/data/components/computed_components.md)" dynamic-comp: href: /fichiers/fichier_echange/data/components/dynamic_components.qmd text: Dynamic Components link: "[Dynamic Components](/fichiers/fichier_echange/data/components/dynamic_components.qmd)" + oa: "[OA_dynamicComponents](/fichiers/fichier_echange/data/components/dynamic_components.qmd)" constant-comp: href: /fichiers/fichier_echange/data/components/constant_components.md text: Constant Components link: "[Constant Components](/fichiers/fichier_echange/data/components/constant_components.md)" + oa: "[OA_constantComponents](/fichiers/fichier_echange/data/components/constant_components.md)" pattern-comp: - href: /fichiers/fichier_echange/data/components/pattern_components.md + href: /fichiers/fichier_echange/data/components/pattern_components.qmd text: Pattern Components - link: "[Pattern Components](/fichiers/fichier_echange/data/components/pattern_components.md)" + link: "[Pattern Components](/fichiers/fichier_echange/data/components/pattern_components.qmd)" checker: - href: /fichiers/fichier_echange/verificateurs.md + href: /fichiers/fichier_echange/verificateurs.qmd text: Vérificateurs (OA_checker) - link: "[Vérificateurs (OA_checker)](/fichiers/fichier_echange/verificateurs.md)" + link: "[Vérificateurs (OA_checker)](/fichiers/fichier_echange/verificateurs.qmd)" + link-multiplicity: "[Multiplicity (OA_multiplicity)](/fichiers/fichier_echange/verificateurs.qmd#multiplicity)" + oa-multiplicity: "[OA_multiplicity](/fichiers/fichier_echange/verificateurs.qmd#multiplicity)" + link-numericchecker: "[Vérificateur de type 'Integer' et 'Float'](/fichiers/fichier_echange/verificateurs.qmd#numericchecker)" + oa: "[OA_checker](/fichiers/fichier_echange/verificateurs.qmd)" # section pour aller plus loin authorization: text: Authorization diff --git a/documentations/openadom/fichiers/autres/database.qmd b/documentations/openadom/fichiers/autres/database.qmd index bee0deeb40c997569aac4755c1f7f33bf7143071..655d736ada6e48bd7975c52d6ed6327e5257cc9a 100644 --- a/documentations/openadom/fichiers/autres/database.qmd +++ b/documentations/openadom/fichiers/autres/database.qmd @@ -35,10 +35,9 @@ quatre roles sont créés : - **public** : ce rôle porte les droits en lecture des données des différents SI. Tout utilisateur d'openadom est placé dans cce rôle. ̀̀̀ -``` -◠+:::{.callout-warning} Un applicationCreator ne peut pas accéder aux application, ni les modifier. S'il créé une application il deviendra administrateur de cette application. S'il ne l'a pas créer, ces droits sur le SI dependront des administrateurs de cette application. -``` +::: Après le démarrage, il convient de créer les utilisateurs qui pourront permettre la création du SI. diff --git a/documentations/openadom/fichiers/autres/glossaire.qmd b/documentations/openadom/fichiers/autres/glossaire.qmd new file mode 100644 index 0000000000000000000000000000000000000000..299f0d3050abb2ec9b0945c8ed5acbfafff7bd4c --- /dev/null +++ b/documentations/openadom/fichiers/autres/glossaire.qmd @@ -0,0 +1,101 @@ +--- + title: Glossaire + abstract: Cette section reprend tout les mots clefs pré-définis du fichier de configuration +--- +# Sections OpenAdom +## {{<var page-refs.checker.oa>}} + Les vérificateurs permettent de valider et de typer les différents composants +## OA_DEFAULT_VALUE +## {{<var page-refs.data.oa-unexpectedColumns>}} +## OA_HEADER_NAME +## {{<var page-refs.etiquettes.oa>}} + Les étiquettes permettent de regrouper certains éléments (data, components) +## OA_REQUIRED +## OA_IMPORT_HEADER +## OA_IMPORT_HEADER_PATTERN +## OA_I_18_N +voir {{<var page-refs.i18n.link>}} + - pour l'application {{<var page-refs.application.oa-i18n>}} + - pour un type de données {{<var page-refs.data.oa-i18n>}} +## {{<var page-refs.data.oa-displayPattern>}} +## OA_TITLE +## OA_LANG_RESTRICTIONS +## OA_FORM_FIELDS +## OA_MIN +## OA_DURATION +## OA_PATTERN +## OA_MAX +## OA_NAME + Peut définir le nom de l'application ({{<var page-refs.application.oa-name>}}) +## OA_EXPRESSION +## OA_GROOVY_EXCEPTIONS +## OA_ADDITIONAL_FILES +## {{<var page-refs.application.oa>}} + Cette section permet de renseigner les informations et paramétrage de l'application. +## {{<var page-refs.authorizations.oa>}} +## OA_AUTHORIZATION_SCOPES +## {{<var page-refs.basic-comp.oa>}} + Les composantes basiques permettent de capturer les colonnes du fichier en entrée. +## {{<var page-refs.application.oa-comment>}} + Un commentaire libre pour le fichier de configuration +## OA_COMPONENT +## OA_COMPONENTS +## OA_COMPONENT_ADJACENTS +## OA_COMPONENT_QUALIFIERS +## OA_COMPUTATION +## {{<var page-refs.computed-comp.oa>}} + Les composantes calculées pemettent de créer de nouvelles composantes en utilisant une expression groovy. +## {{<var page-refs.constant-comp.oa>}} + Les composantes constantes pemettent de créer des constantes pour l'ensemble du fichier provenant généralement de l'en-tête du fichier ou des lignes entre l'en-tête et la première ligne de data. +## OA_CONSTANT_IMPORT_HEADER_COLUMN_NAME +## OA_CONSTANT_IMPORT_HEADER_COLUMN_NUMBER +## OA_CONSTANT_IMPORT_HEADER_ROW_NUMBER +## OA_CONSTANT_IMPORT_HEADER_TARGET +## {{<var page-refs.data.oa>}} + La section data permet de définir les types de données du domaine +## OA_DATA_FIRST_LINE +## OA_DATA_HEADER_LINE +## {{<var page-refs.application.oa-defaultLanguage>}} + Pour l'ensemble de l'application, la langue par défaut. +## OA_DESCRIPTION +## {{<var page-refs.dynamic-comp.oa>}} + Les composantes dynamiques permettent de déclarer des colonnes dont les nom sont construit sur le contenu d'une composante d'un référentiel. +## OA_END_DATE_MATCH_PATTERN +## OA_EXPORT_HEADER +## OA_FILE_NAME +## OA_FILE_PATTERN +## {{<var page-refs.data.oa-firstLine>}} +## OA_GROOVY +## {{<var page-refs.data.oa-headerLine>}} +## OA_HEADER_PREFIX +## OA_IS_PARENT +## OA_IS_RECURSIVE +## OA_IS_TRUE +## OA_MANDATORY +## OA_MATCH_PATTERN_SCOPES +## {{<var page-refs.checker.oa-multiplicity>}} + Permet de déclarer si une données est un tableau de valeur. +## {{<var page-refs.data.oa-nk>}} +## OA_PARAMS +## {{<var page-refs.pattern-comp.oa>}} + Les composantes pattern permettent de lire les données de colonnes répondant à une expression régulière. + + En plus : + - on peut extraire des données du nom de la colonne + - on peut définir et capturer les données de colonnes adjacentes + - le résultat est veritcalisé (les colonnes capturés sont enregistrées comme des lignes différentes) +## OA_PATTERN_FOR_COMPONENTS +## OA_REFERENCE +## OA_REFERENCES +## OA_REFERENCE_COMPONENT_TO_LOOK_FOR_HEADER +## OA_REFERENCE_SCOPES +## OA_RIGHTS_REQUEST +## {{<var page-refs.data.oa-separator>}} +## OA_START_DATE_MATCH_PATTERN +## OA_STRATEGY +## {{<var page-refs.validations.oa>}} +## OA_SUBMISSION_SCOPE +## OA_TIME_SCOPE +## {{<var page-refs.validations.oa>}} +## OA_VERSION + utilisé pour définir la version {{<page-refs.aide_fichier.oa-version>}} du moteur OpenADOM comme pour définir la version {{<page-refs.application.oa-version>}} du fichier de configuration de l'application. \ No newline at end of file diff --git a/documentations/openadom/fichiers/examples/configuration_min/description.qmd b/documentations/openadom/fichiers/examples/configuration_min/description.qmd index d688aeb078b3fbe750bbac89fb872be4577cbb69..4f75f49447953191c83b9a39305b2a0ad79169ae 100644 --- a/documentations/openadom/fichiers/examples/configuration_min/description.qmd +++ b/documentations/openadom/fichiers/examples/configuration_min/description.qmd @@ -2,7 +2,7 @@ Un fichier de configuration doit au moins contenir la version du moteur openADom (OA_version), ainsi que la description de l'application (OA_application) -- le nom de l'aapplication respectant le pattern <code>[a-z_]*</code> +- le nom de l'application respectant le pattern <code>[a-z_]*</code> - la version de l'application <code>(^(\\d+)\\.(\\d+)\.(\\d+)(_\\d+)?(-\\w+)?$)</code> diff --git a/documentations/openadom/fichiers/fichier_echange/aide_fichier.qmd b/documentations/openadom/fichiers/fichier_echange/aide_fichier.qmd index 033fbcd5db4b1184499c0e346c3348a553c7e563..741cd6d40a3b3a53dc5f95cdb39a3256b71d8036 100644 --- a/documentations/openadom/fichiers/fichier_echange/aide_fichier.qmd +++ b/documentations/openadom/fichiers/fichier_echange/aide_fichier.qmd @@ -26,8 +26,8 @@ soit valide. Il y a 6 parties (<span style="color: orange">sans indentation</span>) attendues dans le fichier : -* OA_version, -* [OA_application](#application), +* OA_version [#openadom_version], +* {{<var page-refs.application.link>}}, * [OA_data](#data), * [OA_tags](#tags), * [OA_additionalFiles](#additionalFiles) diff --git a/documentations/openadom/fichiers/fichier_echange/application.qmd b/documentations/openadom/fichiers/fichier_echange/application.qmd new file mode 100644 index 0000000000000000000000000000000000000000..16d3154b86c4d2d59f4fe469d505ae81fbb29ea0 --- /dev/null +++ b/documentations/openadom/fichiers/fichier_echange/application.qmd @@ -0,0 +1,114 @@ +--- +title: Section de description de l'application +subtitle: OA_application +abstract: > + Cette section définit un certain nombre d'informations et de paramètres de l'ensemble du système d'information +lightbox: + match: auto + effect: fade + desc-position: left + loop: false +--- + +# Déclaration d'une donnée + +``` yaml +OA_data: + tr_donnee_de_reference_ddr: + ... + t_donne_dat: + ... +``` +::: {.callout-caution} +Pour déclarer une donnée vous devez fournir un identificateur + + +::: {.callout-note title="example de section application" collapse="false"} +``` yaml +OA_application: + OA_defaultLanguage: fr + OA_i18n: + OA_title: + fr: "ACBB" + en: "ACBB" + OA_description: + fr: "Agroécosystèmes, Cycles Biogéochimiques et Biodiversité" + en: "Agroecosystems, Biogeochemical Cycles and Biodiversity" + OA_comment: "L'application ACBB V2" + OA_name: acbb_openadom_v2 + OA_version: 1.0.5 +``` + +::: + +Cette section doit comporter obligatoirement: + +(@) [**OA_name**](#name) le nom de l'application qui correspondra au nom du schema de la base de données. + + ``` yaml + OA_name: acbb_openadom_v2 + ``` + +Ce nom doit obligatoirement -etre en minuscules, commencer par une lettre et ne comporter que des caractères alphanumériques sans accent et l'espace souligné. (_) + +(@) [**OA_version**](#version) qui correspond à la version du fichier de configuration. Lors des mise à jour du schéma, vous incrémenterez ce numéro de version. + + ``` yaml + OA_version: 1.0.5 + ``` + +::: {.callout-note collapse="true" title="Exemple de numérotation" } + +### Versions Majeures + +- 2.4.0 +- 2.4.1 +- 2.3.5 +- 2.0.0 +- 3.0.0 +- 1.11.2 +- 1.10.0 +- 1.9.0 + +### Versions de Développement + +- 2.4.0-SNAPSHOT +- 2.3.5-SNAPSHOT +- 2.0.0-rc.3 +- 2.0.0-b.2 +- 2.0.0-a.1 + +### Versions avec Métadonnées +- 1.2.3+20231006 +- 1.2.0+build.123 + +### Versions de Maintenance +- 1.2.5 +- 1.2.3 +::: + +On peut aussi rajouter des informations facultatives: + +1. [**OA_defaultLanguage**](#defaultLanguage) qui permet de définir la langue par défaut. La langue par défaut est celle utilisée si aucune autre information de langue n'est précisée. Lors de l'internationalisation de certains champs / données, on essait de trouver la traduction dans la langue demandée; à défaut on fournit la traduction dans la langue par défaut; si aucune traduction n'est trouvée on renvoit l'indentificateur fourni en entrée. + + ``` yaml + OA_defaultLanguage: fr + ``` + + 2. **[OA_i18n]{i18n}** cette section permet d'internationaliser le nom de l'application en fournissant un titre et / ou une description à ce nom. + +``` yaml + OA_i18n: + OA_title: + fr: "ACBB" + en: "ACBB" + OA_description: + fr: "Agroécosystèmes, Cycles Biogéochimiques et Biodiversité" + en: "Agroecosystems, Biogeochemical Cycles and +``` + +{height="100" .lightbox} + +{height="100" .lightbox} + +3. [**OA_comment** ](#comment) C'est un commentaire, que vous pouvez remplir à votre guise pour vous permettre d'indiquer les modifications de version en version. \ No newline at end of file diff --git a/documentations/openadom/fichiers/fichier_echange/authorizations.qmd b/documentations/openadom/fichiers/fichier_echange/authorizations.qmd new file mode 100644 index 0000000000000000000000000000000000000000..b988b85435bb55986bfe6c117a7f096b9ea93500 --- /dev/null +++ b/documentations/openadom/fichiers/fichier_echange/authorizations.qmd @@ -0,0 +1,7 @@ +--- +title: Autorisations +subtitle: OA_authorizations +abstract: > + Cette section permet de déclarer les composantes intervenant dans les autorizations. +--- +TODO \ No newline at end of file diff --git a/documentations/openadom/fichiers/fichier_echange/data.md b/documentations/openadom/fichiers/fichier_echange/data.md deleted file mode 100644 index a03679467bd2eec44d80790f3d24457b32bc98dd..0000000000000000000000000000000000000000 --- a/documentations/openadom/fichiers/fichier_echange/data.md +++ /dev/null @@ -1,17 +0,0 @@ -### <a id="data" />Description des données (OA_Data) - -On décrit les données de références et les types de données dans la partie *OA_data*, on y liste les noms des colonnes souhaitées (dans {{< var page-refs.basic-comp.link >}}, {{< var page-refs.computed-comp.link >}}, {{< var page-refs.pattern-comp.link >}}, {{< var page-refs.pattern-comp.link >}}, {{< var page-refs.constant-comp.link >}};en précisant la liste des colonnes qui forme la {{< var page-refs.vocab.link-nk >}}. - -Pour ajouter une référence, on ajoute dans la section "*OA_data*" une description de ce référentiel. - -- un {{< var page-refs.basic-comp.link >}} - est une colonne du fichier, -- un {{< var page-refs.computed-comp.link >}} - est une colonne qui n’est pas présente dans le fichier et dont la valeur est une constante ou le résultat d'un calcul, -- un {{< var page-refs.dynamic-comp.link >}} - est un ensemble de colonnes dont la clef est la concaténation d'un préfixe et d'une valeur d'un référentiel. Par exemple s’il existe un référentiel "propriétés" avec les valeurs (couleur, catégorie, obligatoire), on pourrait avoir dans un autre référentiel (en utilisant le préfixe "pts_") pts_couleur, pts_catégorie et pts_obligatoire, en les déclarant comme {{< var page-refs.dynamic-comp.link >}} -, -- un {{< var page-refs.pattern-comp.link >}} - est un ensemble de colonnes dont le nom à un format commun et qui par conséquent répond à un pattern. Par exemple avec des colonnes dont le nom répond au pattern variable_profondeur_répétition : SWC_([0-9]*)_([0-9]*), -- un {{< var page-refs.constant-comp.link >}} est le descriptif de la cartouche du fichier csv. On précisera le nombre de lignes dans la cartouche dans rowNumber et le nombre de colonnes utiliser dans la cartouche dans columnNumber. On peut aussi choisir pour des informations sous l’en-tête de préciser le nom de l’en-tête headerName en lieu et place du numéro de colonne. - diff --git a/documentations/openadom/fichiers/fichier_echange/data.qmd b/documentations/openadom/fichiers/fichier_echange/data.qmd new file mode 100644 index 0000000000000000000000000000000000000000..d4eba92740fdb86cf5a534360b1777f583c9c4c1 --- /dev/null +++ b/documentations/openadom/fichiers/fichier_echange/data.qmd @@ -0,0 +1,207 @@ +--- + title: Description des données + subtitle: OA_Data + abstract: > + <p>Cette section permet de décrire vos données en les regroupant par type de données. + <p>Pour chaque tye de données on va décrire les données que l'on souhaite enregistrer et les modalités de dépôt et d'extraction de ces données. +--- + +# Types de données + +On appelera type de données un regroupement de données (variables) qui partage une même thématique et pouvant partager un modèle de {{<var page-refs.csv.link>}} commun. + +Les types de données sont alimentés dans la base par des fichier au format csv. + +On définit aussi des données dites de références. Ce sont des données nécessaires à la description des données expérimentales (référentiels) ou d'observation (data). Il n'y a pas de différence dans l'application pour le traitement des référentiels et des data. Les seules différences se retrouvent dans la présentation au niveau de l'interface. Pour définir un type de données "data", on ajoute dans la section {{<var page-refs.etiquettes.oa>}} un tag **__DATA__**. + +On décrit les données de références et les types de données dans la partie *OA_data*, on y liste les noms des colonnes souhaitées (dans {{< var page-refs.basic-comp.link >}}, {{< var page-refs.pattern-comp.link >}} et {{< var page-refs.pattern-comp.link >}}, des constantes extraites du cartouche {{< var page-refs.constant-comp.link >}} et des valeurs calculées {{< var page-refs.computed-comp.link >}} + +Pour ajouter une référence, on ajoute dans la section "*OA_data*" une description de ce référentiel. + +## Déclaration d'un type de données +Chaque type de donnée aura une entrée dans la section OA_data en utilisant les {{<var page-refs.vocab.link-identificateurs>}} + +::: {.callout-note title="déclaration du type de données tr_sites_sit" collapse="false"} +``` yaml +OA_data: + tr_sites_site: + .... +``` +::: + +## Clef naturelle ([OA_naturalKey]{#nk}) +Vous devrez déclarer une {{< var page-refs.vocab.link-nk >}}. + +::: {.callout-note title="OA_naturalKey" collapse="false"} +``` yaml +OA_data: + tr_sites_site: + OA_naturalKey: [sit_site_key] +``` +ou si vous préférez la notation en colonne + +``` yaml +OA_data: + tr_sites_site: + OA_naturalKey: + - sit_site_key +``` +::: + +## Internationalisation ([OA_i18n]{#i18n}) +Vous pouvez internationaliser votre type de données en rajoutant une section **OA_i18n** voir la section {{< var page-refs.i18n.link >}}. + +::: {.callout-note title="OA_i18n" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_i18n: + OA_title: + fr: référence aux sites + en: reference to sites + OA_description: + fr: sites d'etudes + en: study sites +``` +::: + +## Surcharge de la clef naturelle lors du référencement ([OA_i18nDisplayPattern]{#displayPattern}) +Lorsque dans un autre type de données vous ferez référence un ce tye de données, c'est la clef naturelle de la ligne référencée qui s'affichera. + +Vous pourrez surcharger cet affichage en déclarant un pattern d'affichage en utilisant les valeurs de la ligne référencée dans une section [**OA_i18nDisplayPattern**]{#displayPattern}. + +::: {.callout-note title="OA_i18nDisplayPattern" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_i18nDisplayPattern: #mandatory + OA_title: + fr: "{sit_site_fr} dans ({sit_agroecosystem})" + en: "{sit_site_en} in ({sit_agroecosystem})" + +``` +Ici {sit_site_fr} repésente la valeur de la colonne sit_site_fr et {sit_agroecosystem} la valeur de la colonne sit_agroecosystem. + +Si une colonne est aussi une référence, alors récursivement on calculera les inférences de OA_i18nDisplayPattern de tous ces référentiels. +::: + + + +::: {.callout-warning title="Calcul de la valeur d'affichage d'une données" collapse="false"} +Les inférences de OA_i18nDisplayPattern sont calculées au moment du dépôt de la données et stockées en base de données. S'il vous arrivait de modifier les colonnes de référentiels intervenant dans cette construction, alors vous devriez redéposer vos données pour recalculer les valeurs d'affichage. +::: + + + +## Déclaration d'un cartouche + +Par défaut la ligne 1 est la ligne d'en-tête et la ligne 2 celle de la première ligne de données. + +On peut changer ce comportement en précisant : +- [OA_DATA_HEADER_LINE]{#headerLine} la ligne d'en-tête +- [OA_DATA_FIRST_LINE]{#firstLine} la ligne d'en-tête + +::: {.callout-note title="en-tête" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_DATA_HEADER_LINE: 1 + OA_DATA_FIRST_LINE: 2 +``` +::: + +## Colonnes non signifiantes ([OA_ALLOW_UNEXPECTED_COLUMNS]{#unexpectedColumns}) + +Par défaut, toutes les colonnes présentes dans le fichier de données doivent avoir été déclarées. + +Vous pouvez cependant modifier ce comportement en précisant OA_ALLOW_UNEXPECTED_COLUMNS à true + +::: {.callout-note title="OA_ALLOW_UNEXPECTED_COLUMNS" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_ALLOW_UNEXPECTED_COLUMNS: true # défaut à false +``` +::: + +## Séparateur de champ [OA_separator]{#separator} +Par défaut le séparateur dans le fichier csv est le point-virgule (;). +Vous pouvez changer ce séparateur en précisant OA_separator + +::: {.callout-note title="OA_separator" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_separator: , # défaut à ; +``` +::: + +## Etiquettes ([OA_tags]{#tags}) +Vous pouvez étiquetter vos types de données voir {{<var page-refs.etiquettes.oa>}} +- soit pour pouvoir les filtrer dans l'interface +- soit pour ajouter un comportement +-> __DATA__ signifie que ce type de données est une données expérimentale ou d'observation. +-> __ORDER_4__ donne un numéro d'ordre dan l'affichage des types de données. + + +::: {.callout-note title="OA_separator" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_tags , [semi_horaire, flux, __REFERENCES__, __ORDER_2__] ; +``` +::: + +## Déclaration des [composantes du type de données]{#components} + +- un {{< var page-refs.basic-comp.link >}} est une colonne du fichier, +- un {{< var page-refs.computed-comp.link >}} est une colonne qui n’est pas présente dans le fichier et dont la valeur est une constante ou le résultat d'un calcul, +- un {{< var page-refs.dynamic-comp.link >}} est un ensemble de colonnes dont la clef est la concaténation d'un préfixe et d'une valeur d'un référentiel. Par exemple s’il existe un référentiel "propriétés" avec les valeurs (couleur, catégorie, obligatoire), on pourrait avoir dans un autre référentiel (en utilisant le préfixe "pts_") pts_couleur, pts_catégorie et pts_obligatoire, en les déclarant comme {{< var page-refs.dynamic-comp.link >}} +- un {{< var page-refs.pattern-comp.link >}} est un ensemble de colonnes dont le nom à un format commun et qui par conséquent répond à un pattern. Par exemple avec des colonnes dont le nom répond au pattern variable_profondeur_répétition : SWC_([0-9]*)_([0-9]*), +- un {{< var page-refs.constant-comp.link >}} est le descriptif de la cartouche du fichier csv. On précisera le nombre de lignes dans la cartouche dans rowNumber et le nombre de colonnes utiliser dans la cartouche dans columnNumber. On peut aussi choisir pour des informations sous l’en-tête de préciser le nom de l’en-tête headerName en lieu et place du numéro de colonne. + +## Validation [OA_validations]{#validations} + +Chaque composante peut contenir un vérificateur. Pour la lisibilité, il est conseiller de laisser ces vérificateurs dans la section du composant. Cependant vous pourriez vouloir croiser des informations pour effectuer une validation, ou valider un ensemble de composants de la même façon. + +En ce cas vous serez ammener à définir un certain nombre de règle dans la section + +::: {.callout-note title="OA_validations" collapse="false"} +``` yaml + +OA_data: + tr_sites_site: + OA_validations: + sit_checkDateMiseEnService: + OA_i18n: + fr: "validation de date" + OA_checker: + OA_name: OA_date + OA_params: + OA_pattern : "dd/MM/yyyy" + OA_components: [ sit_date_mise_en_service ] +``` +::: + +## {{<var page-refs.authorizations.text>}} +Cette section vous permet de définir les composantes qui permettront de construire des autorisations voir {{<var page-refs.authorizations.link>}} + + +::: {.callout-note title="OA_validations" collapse="false"} +``` yaml + +OA_data: + t_piegeage_en_montee_pem: + OA_authorizations: + OA_authorizationScope: + - projet + - chemin + OA_timeScope: date +``` +::: \ No newline at end of file diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/basic_components.qmd b/documentations/openadom/fichiers/fichier_echange/data/components/basic_components.qmd index d363a3189e379096817c3d56b096098c4750bbdc..bdf53a5bcf2c02eab75656511bcac1cc04271f32 100644 --- a/documentations/openadom/fichiers/fichier_echange/data/components/basic_components.qmd +++ b/documentations/openadom/fichiers/fichier_echange/data/components/basic_components.qmd @@ -1,5 +1,6 @@ --- - title: Description des colonnes (OA_basicComponents) + title: Description des colonnes + subtitle: (OA_basicComponents) abstract: Ce document permet de configurer la section <b>OA_data > OA_basiComponents</b> pour lier les colonnes du fichier à des composantes --- diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/components_description.qmd b/documentations/openadom/fichiers/fichier_echange/data/components/components_description.qmd new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/computed_components.md b/documentations/openadom/fichiers/fichier_echange/data/components/computed_components.md index db26d19be829b380e6f201a8af34a359e252bd81..1a8e5fca3299e18c5939501b8baf5f1341f3cbf0 100644 --- a/documentations/openadom/fichiers/fichier_echange/data/components/computed_components.md +++ b/documentations/openadom/fichiers/fichier_echange/data/components/computed_components.md @@ -1,7 +1,16 @@ +--- + title: Colonnes calculées + subtitle: OA_computedComponents + abstract: > + Une colonne calculée est une colonne qui n'est pas présente dans le fichier. Ses valeurs sont issues du résultat d'un calcul ou d'une concaténation. +--- +Par exemple on veut avoir la valeur de la date complète en concaténant la date (tds_date) et l'heure (tds_heure). -#### <a id="computedComponents" />Colonnes calculées (OA_computedComponents) +Dans l'{{< var page-refs.groovy.link >}}, les valeurs sont dans une map datum : +- datum.tds_date +- datum.tds_heure -Une colonne calculée est une colonne qui n'est pas présente dans le fichier. Ses valeurs sont issues du résultat d'un calcul ou d'une concaténation. +On définit dans le fichier de configuration la section OA_data suivante: ```yaml OA_data: @@ -12,12 +21,24 @@ OA_data: - tds_nom OA_basicComponents: tds_nom: - OA_importHeader: nom + OA_importHeader: Nom + tds_date: + OA_importHeader: Date + OA_checker: + OA_name: OA_date + OA_params: + OA_pattern: dd/MM/yyyy + tds_heure: + OA_importHeader: Heure + OA_checker: + OA_name: OA_date + OA_params: + OA_pattern: HH:mm:ss OA_computedComponents: tds_date_heure: OA_computation: OA_expression: > - return datum.date + " " + datum.heure + return datum.tds_date + " " + datum.tds_heure OA_checker: OA_name: OA_date OA_params: diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/constant_components.md b/documentations/openadom/fichiers/fichier_echange/data/components/constant_components.md index ebc94e68de7ecb63390e0799b47f3541fa46ac3d..4962f8dc32baab2e45969025224cd206942f771e 100644 --- a/documentations/openadom/fichiers/fichier_echange/data/components/constant_components.md +++ b/documentations/openadom/fichiers/fichier_echange/data/components/constant_components.md @@ -1,18 +1,20 @@ - -#### <a id="constantComponents" />Constantes du csv (OA_constantComponents) - -Les constantes permettent de déclarer les données enregistrées dans les cartouches du fichier csv. +--- + title: Constantes du csv + subtitl: OA_constantComponents + abstract: > + Les constantes permettent de déclarer les données enregistrées dans les cartouches du fichier csv. +--- Pour le fichier : __flux_journalier.csv__ ``` - ************* Début de la cartouche ************** + ************* Début du cartouche ************** 1| Site | Hesse | 2| Theme | flux | 3| Frequence | journalier | 4| Date de debut | 01/01/2008 | 5| Date de fin | 05/01/2008 | 6| Commentaire | un commentaire | - ************** Fin de la cartouche *************** + ************** Fin du cartouche *************** 7| | | | 8| Date | Carbon dioxide concentration | Water vapour concentration | |---------------|--------------------------------|----------------------------| @@ -22,7 +24,7 @@ Pour le fichier : __flux_journalier.csv__ 12| 02/01/2008 | 418,4319752083 | 3,6077222917 | ``` -On définira le yaml suivant : +On définira dans le fichier de configuration la section suivante : ```yaml OA_data: diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/dynamic_components.qmd b/documentations/openadom/fichiers/fichier_echange/data/components/dynamic_components.qmd index 8df1a99340762931281d3fb55ac4325ed5fa5a99..ee058d7ae4c531c63dacd288b93fb6229c5f0789 100644 --- a/documentations/openadom/fichiers/fichier_echange/data/components/dynamic_components.qmd +++ b/documentations/openadom/fichiers/fichier_echange/data/components/dynamic_components.qmd @@ -1,7 +1,9 @@ - -#### <a id="dynamicComponents" />Colonnes dynamiques (OA_dynamicComponents) - -Les colonnes dynamiques permettent de traduire une relation n-n entre deux référentiels. Par exemple entre un objet et ses propriétés. +--- + title: Colonnes dynamiques + subtitle: OA_dynamicComponents + abstract: > + Les colonnes dynamiques permettent de traduire une relation n-n entre deux référentiels. Par exemple entre un objet et ses propriétés. +--- ``` {mermaid} classDiagram Taxon "*" -- "*" Proprietes_de_taxon diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/importHeader.qmd b/documentations/openadom/fichiers/fichier_echange/data/components/importHeader.qmd new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/pattern_components.md b/documentations/openadom/fichiers/fichier_echange/data/components/pattern_components.md deleted file mode 100644 index ffcc56829eed1513ddb220fcd12c9ec219638879..0000000000000000000000000000000000000000 --- a/documentations/openadom/fichiers/fichier_echange/data/components/pattern_components.md +++ /dev/null @@ -1,5 +0,0 @@ -#### <a id="patternComponents" />Colonnes avec pattern (OA_patternComponents) - -Verticalisation qui parse selon une regexp le nom des colonnes d'un fichier csv - - diff --git a/documentations/openadom/fichiers/fichier_echange/data/components/pattern_components.qmd b/documentations/openadom/fichiers/fichier_echange/data/components/pattern_components.qmd new file mode 100644 index 0000000000000000000000000000000000000000..e6a2e508ad7a8103917df7c364262b8ce2a991fb --- /dev/null +++ b/documentations/openadom/fichiers/fichier_echange/data/components/pattern_components.qmd @@ -0,0 +1,125 @@ +--- + 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éfinit (OA_importHeaderPattern) qui deviendront des des sous composants (OA_componentAdjacents). + + <p>Il y aura une verticalisation des colonnes (OA_patternComponents). Chaque colonne capturé sera enregistrée dans une nouvelle ligne. +--- + +Exemple de déclaration de section OA_patternComponents: + +::: {.callout-note collapse=false title="OA_data"} + +``` 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 +``` +::: + +(@) Définition du pattern +Pour des colonnes SWC_2_20 où 2 est la répétition de la mesure et 20 sa profondeur. + +``` yaml + OA_patternForComponents: "SWC(@?)_(.*)_(.*)" +``` +On utilise une [expression regulière](https://docs.python.org/fr/3/howto/regex.html) 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 {{< var page-refs.groovy.link >}} pour définir une valeur de remplacement + + +``` yaml + OA_defaultValue: + OA_expression: "'humidite_volumique_du_sol'" +``` +On aurait aussi pu utiliser +``` yaml + 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 + + +::: {.callout-important} +<p>Le parseur va rechercher toutes les colonnes {{< var page-refs.basic-comp.oa >}}. On recherche dans les colonnes restantes celles qui "matchent" un OA_patternForComponents. + +<p>Le comportement fiOA_allowUnexpectedColumnsnal dépendra de la valeur de OA_allowUnexpectedColumns. +::: + +(@) définition de la colonne pattern. + +Comme tous les composants \ No newline at end of file diff --git a/documentations/openadom/fichiers/fichier_echange/etiquettes.md b/documentations/openadom/fichiers/fichier_echange/etiquettes.qmd similarity index 77% rename from documentations/openadom/fichiers/fichier_echange/etiquettes.md rename to documentations/openadom/fichiers/fichier_echange/etiquettes.qmd index d6aa6fd33180fd3fb6b3dd1ce7a658d811b92de4..53161a9a1544a2b3a452e9c4c638972dc6fbab35 100644 --- a/documentations/openadom/fichiers/fichier_echange/etiquettes.md +++ b/documentations/openadom/fichiers/fichier_echange/etiquettes.qmd @@ -1,10 +1,11 @@ ### <a id="tags" />Etiquettes (OA_tags) -__OA_tags__: Création d'un regroupements sous une étiquette permettant de filtré l'affichages des listes des [__OA_data__](#data). -Mais aussi les [__OA_basicComponents__](#basicComponents), les [__OA_computedComponents__](#computedComponents), les [__OA_dynamicComponents__](#dynamicComponents) d'un [__OA_data__](#data). +__OA_tags__: Création d'un regroupements sous une étiquette permettant de filtrer l'affichage des listes des {{<var page-refs.etiquettes.link>}}. +Mais aussi les {{<var page-refs.basic-comp.link>}}, les {{<var page-refs.computed-comp.link>}}, les {{<var page-refs.dynamic-comp.link>}}, les {{<var page-refs.basic-comp.link>}}, les {{<var page-refs.pattern-comp.link>}} , les {{<var page-refs.constant-comp.link>}} d'un {{<var page-refs.data.oe>}}. +::: ```yaml OA_tags: profondeur: @@ -99,15 +100,11 @@ OA_data: OA_importHeader: pheopigments chl_unit: ``` - ->  Le tag n'est pas obligatoire. -> Si vous n'en mettez pas un, un tag par défaut se mettra. -> * Pour les components -> ```no-tag``` : sans étiquette. Ce qui permettra de filtré au même titre que ceux avec une étiquette créé par vous. -> * Pour les datas -> ```__REFERENCE__```. Ce qui permettra de filtré les datas par type. -> - ->  Le nom du tag est libre. -> Cependant, pour ceux réutilisés ailleurs dans l'application, il est préférable de n'utiliser que des minuscules et -> underscores sous peine de générer des erreurs dans les requête sql ou la création des vues. +:::{.callout-caution title="Le tag n'est pas obligatoire"} +Si vous n'en mettez pas un, un tag par défaut se mettra. + * Pour les components -> ```no-tag``` : sans étiquette. Ce qui permettra de filtré au même titre que ceux avec une étiquette créé par vous. + * Pour les datas -> ```__REFERENCE__```. Ce qui permettra de filtré les datas par type. +::: + diff --git a/documentations/openadom/fichiers/fichier_echange/submission.qmd b/documentations/openadom/fichiers/fichier_echange/submission.qmd new file mode 100644 index 0000000000000000000000000000000000000000..4986b06ca9c9826bea8f25a690d924661bdd8480 --- /dev/null +++ b/documentations/openadom/fichiers/fichier_echange/submission.qmd @@ -0,0 +1,7 @@ +--- +title: Stratégie de dépôt +subtitle: OA_submission +abstract: > + Cette section permet d'explicité comment la section OA_submission permet de définir une stratégie de dépôt des données. +--- +TODO \ No newline at end of file diff --git a/documentations/openadom/fichiers/fichier_echange/validations.qmd b/documentations/openadom/fichiers/fichier_echange/validations.qmd new file mode 100644 index 0000000000000000000000000000000000000000..5a3db59e250ea9a7680ef341192aa4bd76cb6994 --- /dev/null +++ b/documentations/openadom/fichiers/fichier_echange/validations.qmd @@ -0,0 +1,8 @@ +--- +title: Validations +subtitle: OA_validations +abstract: > + Cette section vous permet de définir des règles qui s'appliquent à un ensemble de composants ou dont la règle fait intervenir plusieurs composants. +--- + +TODO \ No newline at end of file diff --git a/documentations/openadom/fichiers/fichier_echange/verificateurs.md b/documentations/openadom/fichiers/fichier_echange/verificateurs.qmd similarity index 84% rename from documentations/openadom/fichiers/fichier_echange/verificateurs.md rename to documentations/openadom/fichiers/fichier_echange/verificateurs.qmd index 422bb664d5f4366e9f3243b230d3881445d7c18a..f68b47a9e42cd4a70d90c57a6649313edf0d8b3b 100644 --- a/documentations/openadom/fichiers/fichier_echange/verificateurs.md +++ b/documentations/openadom/fichiers/fichier_echange/verificateurs.qmd @@ -1,7 +1,12 @@ +--- + title: Vérificateurs + subtitle: OA_checker + abstract: > + Les vérificateurs (checkers) permettent de vérifier l'entrée d'un "component" et éventuellement de spécifier son type (entier, valeur flottante, booolean, date, clef étrangère) +--- +On peut poser des contraintes sur les différentes composantes des données -#### On peut poser des contraintes sur les données de référence - -##### [Utilisation de vérificateurs (checker)](#dataChecker) +# [Utilisation de vérificateurs (checker)](#dataChecker) Pour chaque colonne, on peut ajouter des vérificateurs. @@ -12,6 +17,8 @@ Pour chaque colonne, on peut ajouter des vérificateurs. - déclarer une hiérarchie entre composants - vérifier la valeur en utilisant un script (le script renvoyant true) ( GroovyExpression) +::: {.callout-note title="Utilisation des vérificateurs (OA_checker)" collapse="false"} + ```yaml sites: #donnée de référence avec une clef sur une colonne @@ -53,11 +60,12 @@ Pour chaque colonne, on peut ajouter des vérificateurs. OA_name: OA_integer # la valeur attendue est un entier OA_min: 100 # la valeur minimum acceptée ``` - +::: ### <a id="dataChecker" />Paramétrage des vérificateurs On définit un vérificateur dans une section "OA_checker". Le type de vérificateur est défini par son nom (OA_name). + On peut passer des paramètres au vérificateur en renseignant la section OA_params. Les différents paramètres dépendent du type de vérificateur utilisé. @@ -65,23 +73,42 @@ du type de vérificateur utilisé. OA_checker: OA_name: OA_integer OA_params: + OA_min: 0 +``` +Lorsque l'on utilise un vérificateur, sa première fonction est de vérifier le format de la valeur en entrée. +Sa seconde fonction est de transformer cette valeur , dans le cas où cela est possible, dans une primitive acceptable dans un champ json (numeric, boolean). C'est cette valeur qui sera stockée dan le champ json en base, ou comme valeur dans les vues. + +::: {.callout-note title="enregistrement de date" collapse="true"} +La date est stockée au format texte dans un format spécifique à l'application : "date:1984-01-05T00:00:00:dd/MM/yyyy". Elle peut alors être castée en utilisant le type "composite_date" + +``` postgresql + select ('date:1984-01-05T00:00:00:dd/MM/yyyy'::text::composite_date).*; + /* + datetimestamp formatteddate + 1984-01-05 00:00:00 dd/MM/yyyy + */ + select 'date:1984-01-05T00:00:00:dd/MM/yyyy'::text::composite_date::timestamp; -- 1984-01-05 00:00:00 + select ('date:1984-01-05T00:00:00:dd/MM/yyyy'::text::composite_date)::text; --05/01/1984 ``` -Lorsque l'on utilise un vérificateur, sa première fonction est de vérifier le format de la valeur en entrée : -Sa seconde fonction est de transformer cette valeur , dans le cas où cela est possible, dans une primitive acceptable dans un champ -json (numeric, boolean). C'est cette valeur qui sera stockée dan le champ json en base, ou comme valeur dans les vues. +::: + + +::: {.callout-note title="enregistrement de clef étrangère" collapse="true"} Si le vérificateur est de type Reference, il existera en base de données une contrainte de type clef étrangère avec la ligne référencée. +::: -###### Paramètres généraux +## Paramètres généraux -- OA_multiplicity : +::: {#multiplicity} +- OA_multiplicity : {#multiplicty} - MANY : La valeur est un ensemble (tableau) de valeurs. L'entrée est une chaîne ou chaque valeur est séparée par une virgule ','. - Dans la base de donnée les valeurs de la chaîne seront enregistrées dans un tableau de valeur au format indiqué par le vérificiateur. + Dans la base de donnée les valeurs de la chaîne seront enregistrées dans un tableau de valeur au format indiqué par le vérificateur. Par exemple la chaine "2,25.3,5.8" sera traitée comme un tableau de double [2,25.3,5.8] pour un vérificateur FLoat. - ONE : (valeur par défaut) La valeur en entrée est considéré comme une valeur simple. -- [transformations](#transformations) : La fonctionalité de transformation est supprimée. Pour le moment les référentiel sont à fournir au format clef primaire. +::: -###### <a id="numericChecker" />Vérificateur de type 'Integer' et 'Float' +## Vérificateur de type 'Integer' et 'Float'{#numericchecker} Ces vérificateurs servent à vérifier que les valeurs en entrée sont des nombres (respectivement des entiers ou des nombres à valeur floattante). @@ -95,7 +122,7 @@ On peut préciser les valeurs minimum et maximum en précisant les paramètres O OA_max: 25.0 OA_multiplicity: MANY ``` -###### <a id="stringChecker" />Vérificateur de chaîne ('String') +## <a id="stringChecker" />Vérificateur de chaîne ('String') Sans vérificateur, les entrées sont traitées comme des chaînes de caractères acceptant de valeurs vide. On peut toutefois rajouter un vérificateur chaîne pour préciser des contraintes sur la chaîne. (required, multiplicity, transformation, expression régulière) @@ -112,7 +139,7 @@ Le paramètre 'OA_pattern' permet de préciser une [expression régulière](http ``` Ce vérificateur permet de vérifier que l'entrée est une liste d'adresse mail. -###### <a id="dateChecker" />Vérificateur de date. ('Date') +## <a id="dateChecker" />Vérificateur de date. ('Date') Ce vérificateur permet de vérifier que la valeur en entrée est une date au format définit par le paramètre '[OA_pattern](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)' @@ -135,7 +162,7 @@ Une durée est définie au sens SQL d'un [interval](https://www.postgresql.org/d OA_max: 31/12/2025 OA_duration: 1 DAY ``` -###### <a id="booleanChecker" />Vérificateur de Boolean. ('Boolean') +## <a id="booleanChecker" />Vérificateur de Boolean. ('Boolean') Permet de vérifier que la valeur en entrée est true ou false. @@ -146,7 +173,7 @@ Une valeur booléenne sera enregistrée dans le champ json en base de données e OA_name: OA_boolean ``` -###### <a id="referenceChecker" />Vérificateur de référentiel. ('Reference') +## <a id="referenceChecker" />Vérificateur de référentiel. ('Reference') Ce vérificateur permet de vérifier que la valeur en entrée est un '[Ltree'https://www.postgresql.org/docs/current/ltree.html]'. Cette chaîne ne peut contenir que des termes contenant des minuscules/majuscules/chiffres/caractère_souligné(_), séparés par des points (.). @@ -173,7 +200,7 @@ OA_parent -> la colonne fait référence à un référentiel parent Il faut caster les valeurs du datum avant de les utiliser. Elles sont de type Object, et il faut les caster dans le type correspondant au checker. (par défaut String) -###### <a id="groovyChecker" />Vérificateur utilisant une [expression groovy](validation). ('GroovyExpression') +## <a id="groovyChecker" />Vérificateur utilisant une [expression groovy](validation). ('GroovyExpression') L'expression définit dans le paramètre groovy → expression; L'expression doit envoyer une faleur true/false. @@ -188,7 +215,7 @@ L'expression définit dans le paramètre groovy → expression; L'expression doi On vérifie que la composante 'qualité' de la variable 'SWC' est vide ou "0" "1" ou "2". -###### <a id="transformation" />Ajout de transformation à la chaîne en entrée. +## <a id="transformation" />Ajout de transformation à la chaîne en entrée. - OA_groovy : permet de déclarer une transformation de la valeur avec une expression Groovy (qui doit retourner une chaîne de caractère) @@ -245,7 +272,7 @@ Pour les checkers GroovyExpression et les transformations Groovy, on récupère -##### [Utilisation de validations portant sur une ou plusieurs colonnes](#dataChecker) +# [Utilisation de validations portant sur une ou plusieurs colonnes](#dataChecker) Les contraintes se définissent pour chacune des données de référence. Soit dans la définition de la colonne elle-même, soit dans la section [validation](#referencesValidation). diff --git a/documentations/openadom/fichiers/introduction/yaml.qmd b/documentations/openadom/fichiers/introduction/fichier_csv.qmd similarity index 50% rename from documentations/openadom/fichiers/introduction/yaml.qmd rename to documentations/openadom/fichiers/introduction/fichier_csv.qmd index 315bc63d6bb7389161957832361dacf7e2f6fe65..b892700ccfc82b3a7dfab2fb94016d69d119ba31 100644 --- a/documentations/openadom/fichiers/introduction/yaml.qmd +++ b/documentations/openadom/fichiers/introduction/fichier_csv.qmd @@ -6,22 +6,29 @@ C'est un format tabulaire, avec des champs séparés par des points-virgules : *Example de fichier d'échange* - +::: {.callout-note title="Example de fichier d'échange" collapse="true"} + +::: Comme on peut le voir dans cet example, un fichier csv est composé de lignes composées de colonnes. -Un champ est ainsi repéré par un numéro de ligne et de colonne. -Un champ peut contenir 0, une ou plusieurs informations. +- Un champ est ainsi repéré par un numéro de ligne et de colonne. +- Un champ peut contenir 0, une ou plusieurs informations. -Dans l'application OpenAdom, nous +Dans l'application OpenAdom, nous avons la possibilité d'étendre le format csv standard en définissant un "cartouche" c'es à dire des information avant l'en-tête (pré-header) et après l'en-tête avant les données (post-header). On peut voir ainsi : + - un en-tête, généralement utilisé pour renseigner des métadonnées (cartouche) - - la zone d'étude, - - le commentaire, - - un libellé pour le contenu de chaque colonne, - - le min et le max accepté dans chaque colonne. - - ... -- les données à partir de la ligne 13. + - pre-header + - la zone d'étude, + - le commentaire, + - header + - un libellé pour le contenu de chaque colonne, + - post-header + - le min et le max accepté dans chaque colonne. + - ... + - data + - les données à partir de la ligne 13. La ligne 10 est la ligne d'en-tête de colonne. (_Date_, _SWC_1_10_) @@ -31,6 +38,6 @@ Les lignes 11 et 12 contiennent des informations spécifiques de chaque colonnes A partir de la ligne 13, on a les données proprement dîtes. _01/01/1999_ est une donnée de la colonne _Date_ -Enfin, un champs peut être vide, contenir une ou plusieurs informations. +Enfin, un champ peut être vide, contenir une ou plusieurs informations. -dans le fichier de configuration, vous devrez décrire votre format d'échange de données. \ No newline at end of file +Dans le fichier de configuration, vous devrez décrire votre format d'échange de données. \ No newline at end of file diff --git a/documentations/openadom/fichiers/introduction/vocabulaire.qmd b/documentations/openadom/fichiers/introduction/vocabulaire.qmd index 786e493637df67b745a72cbee06da9803cc75737..529c8aea1299a28feee09ada7c20d4a6673540ad 100644 --- a/documentations/openadom/fichiers/introduction/vocabulaire.qmd +++ b/documentations/openadom/fichiers/introduction/vocabulaire.qmd @@ -6,7 +6,7 @@ --- -# Clefs et code +# Clefs et code Dans un fichier, on définit une ou plusieurs colonnes qui correspondent à la clef d'idendification de la ligne. Cette clef naturelle permet lors d'une insertion / suppression de retrouver cette ligne dans la base de données et, si elle est présente, de la mettre à jour. Dans le cas contraire, une nouvelle ligne est créée. @@ -62,4 +62,37 @@ __component__ : un ensemble de valeur qui servent à décrire la donnée. CeS va __authorizationScope__ : une ou des informations contextuelles (variable-component) qui ont du sens pour limiter les autorisations. -__timeScope__ : l'information de temporalité d'une ligne ayant du sens pour limiter des authorisations à une période. \ No newline at end of file +__timeScope__ : l'information de temporalité d'une ligne ayant du sens pour limiter des authorisations à une période. + +# Identificateurs + +Lorsque l'on doit déclarer un ensemble de descriptions dans une section, on leur attribue un identificateur unique. + +Par exemple pour déclarer les descriptions des référentiels, des types de données, des colonnes… + +Comme ces identificateurs sont repris comme nom de table ou de champs dans la base de données, ils doivent respecter certaines +règles imposées par PostgreSQL. + +::: {.callout-tip title="Règle de nommage des identificateurs" collapse="false"} +Les identificateurs SQL doivent commencer avec une lettre minuscule, Les caractères suivants dans un identificateur peuvent être des lettres, des tirets bas ou des chiffres (0-9). + +De plus leur longueur ne peut dépasser 63 caractères. Il faut prendre en compte que lors de la création des vues, les identificateurs peuvent être combinés entre eux ou préfixés / suffixés. Il est donc préférable d'utiliser des noms courts. + +Vous serez informés lors du dépôt du fichier d'identificateurs incorrects. +::: + +::: {.callout-tip title="Convention de nommage des identificateurs" collapse="false"} +Il est conseillé d'utiliser une [convention de nommage](https://sqlpro.developpez.com/cours/standards/) pour choisir un identificateur. + +- pour un [référentiel](#references) le préfixe tr pour table référentiel, le nom du référentiel et un trigramme unique pour ce référentiel : tr_villes_vil +- pour une [donnée](#data) le préfixe t pour table fonctionnelle, le nom du type de données et un trigramme unique : t_meteo_met +- pour les [colonnes](#columns), on préfixe avec le trigramme de la table d'origine suivit du nom explicite de la colonne : + - vil_nom + - met_temperature + +L'utilisation de convention de nommage rendra la description de votre fichier de configuraion plus lisible, +ainsi que la compréhension des vues et tables générées automatiquement. +::: + +Ces identificateurs seront aussi les clefs pour les valeurs dans le champ JSON (refValues pour les référentiels; +dataValues pour les données ; les variables et les composantes) diff --git a/documentations/openadom/img/application-en.png b/documentations/openadom/img/application-en.png new file mode 100644 index 0000000000000000000000000000000000000000..1378b3e11a139989d125582c9bb51cd8bd2e458a Binary files /dev/null and b/documentations/openadom/img/application-en.png differ diff --git a/documentations/openadom/img/application_fr.png b/documentations/openadom/img/application_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..0270c0645a71dafef3f363256ef6fce5c07ae4aa Binary files /dev/null and b/documentations/openadom/img/application_fr.png differ diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/type/DataType.java b/src/main/java/fr/inra/oresing/domain/application/configuration/type/DataType.java index 86a25c3f587a31cc9f59b3b548287083f983a638..fbdc7a442f0aea91c7a862eead0b0e9eb0ff621c 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/type/DataType.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/type/DataType.java @@ -17,22 +17,20 @@ public record DataType(SectionBuilder sectionBuilder, Map<String, ConfigurationS new LabelDescription(ConfigurationSchemaNode.OA_ALLOW_UNEXPECTED_COLUMNS, new BooleanType(true)), new LabelDescription(ConfigurationSchemaNode.OA_SEPARATOR, StringType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_TAGS, new CollectionType.ArrayType<>(List.of(), false, true, StringType.EMPTY_INSTANCE())), - new LabelDescription(ConfigurationSchemaNode.OA_I_18_N -, TitleType - .EMPTY_INSTANCE()), + new LabelDescription(ConfigurationSchemaNode.OA_I_18_N, TitleType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_I_18_N_DISPLAY_PATTERN, TitleType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_DATA_HEADER_LINE, IntegerType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_DATA_FIRST_LINE, IntegerType.EMPTY_INSTANCE()), - new LabelDescription(ConfigurationSchemaNode.OA_AUTHORIZATION, AuthorizationType.EMPTY_INSTANCE()) + new LabelDescription(ConfigurationSchemaNode.OA_AUTHORIZATION, AuthorizationType.EMPTY_INSTANCE()), + new LabelDescription(ConfigurationSchemaNode.OA_VALIDATIONS, StaticMapType.VALIDATIONS().type), + new LabelDescription(ConfigurationSchemaNode.OA_SUBMISSION, SubmissionType.EMPTY_INSTANCE()) ) .withAnyOfMandatorySections( new LabelDescription(ConfigurationSchemaNode.OA_BASIC_COMPONENTS, BasicComponentType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_COMPUTED_COMPONENTS, ComputedComponentType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_DYNAMIC_COMPONENTS, DynamicComponentType.EMPTY_INSTANCE()), new LabelDescription(ConfigurationSchemaNode.OA_PATTERN_COMPONENTS, PatternComponentQualifierType.EMPTY_INSTANCE()), - new LabelDescription(ConfigurationSchemaNode.OA_CONSTANT_COMPONENTS, ConstantComponentType.EMPTY_INSTANCE()), - new LabelDescription(ConfigurationSchemaNode.OA_VALIDATIONS, StaticMapType.VALIDATIONS().type), - new LabelDescription(ConfigurationSchemaNode.OA_SUBMISSION, SubmissionType.EMPTY_INSTANCE()) + new LabelDescription(ConfigurationSchemaNode.OA_CONSTANT_COMPONENTS, ConstantComponentType.EMPTY_INSTANCE()) ); } public static DataType EMPTY_INSTANCE() { diff --git a/src/main/java/fr/inra/oresing/domain/checker/LineChecker.java b/src/main/java/fr/inra/oresing/domain/checker/LineChecker.java index d4568dbec580a644787777b849ea08938c47f546..d4bbc2372baf0512c442a1256df8989ebf5cfd73 100644 --- a/src/main/java/fr/inra/oresing/domain/checker/LineChecker.java +++ b/src/main/java/fr/inra/oresing/domain/checker/LineChecker.java @@ -5,16 +5,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import fr.inra.oresing.domain.application.configuration.checker.CheckerDescription; import fr.inra.oresing.domain.application.configuration.checker.GroovyExpressionChecker; -import fr.inra.oresing.domain.checker.type.BooleanType; -import fr.inra.oresing.domain.checker.type.FieldType; -import fr.inra.oresing.domain.checker.type.ListType; -import fr.inra.oresing.domain.checker.type.StringType; +import fr.inra.oresing.domain.checker.type.*; import fr.inra.oresing.domain.data.*; import fr.inra.oresing.domain.data.deposit.PublishContext; -import fr.inra.oresing.domain.data.deposit.validation.validationcheckresults.DefaultManyValidationCheckResult; -import fr.inra.oresing.domain.data.deposit.validation.validationcheckresults.CheckerValidationCheckResult; -import fr.inra.oresing.domain.data.deposit.validation.validationcheckresults.DefaultCheckerValidationCheckResult; -import fr.inra.oresing.domain.data.deposit.validation.validationcheckresults.GroovyValidationCheckResult; +import fr.inra.oresing.domain.data.deposit.validation.validationcheckresults.*; import fr.inra.oresing.domain.groovy.BooleanGroovyExpression; import fr.inra.oresing.domain.groovy.Expression; import fr.inra.oresing.domain.groovy.GroovyDecorator; @@ -332,7 +326,9 @@ public sealed interface LineChecker<FT extends FieldType> permits LineChecker.Ma DataDatum transformedReferenceDatum = transformer().transform(referenceDatum, context); DataColumn column = target(); FieldType valuesToCheck = transformedReferenceDatum.getValuesToCheck(column); - return GroovyValidationCheckResult.success(target(), valuesToCheck); + return valuesToCheck instanceof PatternType patternType ? + PatternValidationCheckResult.of(GroovyValidationCheckResult.success(target(), valuesToCheck), patternType) + : GroovyValidationCheckResult.success(target(), valuesToCheck); } catch (GroovyException groovyException) { return GroovyValidationCheckResult.error(target(), groovyException.getMessage(), ImmutableMap.copyOf(groovyException.getParams())); } diff --git a/src/main/java/fr/inra/oresing/domain/data/DataColumnPatternValue.java b/src/main/java/fr/inra/oresing/domain/data/DataColumnPatternValue.java index fef44f12f431bda7f5106dd4d55ac38f2be775a4..784bd3038c5b3affb13deb42fd2261b53b5834f4 100644 --- a/src/main/java/fr/inra/oresing/domain/data/DataColumnPatternValue.java +++ b/src/main/java/fr/inra/oresing/domain/data/DataColumnPatternValue.java @@ -3,6 +3,7 @@ package fr.inra.oresing.domain.data; import fr.inra.oresing.domain.application.configuration.Ltree; import fr.inra.oresing.domain.checker.type.*; import fr.inra.oresing.domain.data.deposit.context.DataImporterContext; +import fr.inra.oresing.domain.data.deposit.context.column.Column; import java.util.HashMap; import java.util.Map; @@ -29,6 +30,7 @@ public record DataColumnPatternValue( @Override public DataColumnPatternValue transform(final Function<FieldType, FieldType> transformation) { + transformation.apply(values().get(new DataColumn(Column.__VALUE__)).getValuesToCheck()); final Map<Ltree, String> transformedValues = null;//Maps.transformValues(values, transformation::apply); return new DataColumnPatternValue((FieldType) null); } @@ -67,4 +69,16 @@ public record DataColumnPatternValue( public void put(DataColumn secondPatternOfColumn, DataColumnValue valueToStoreInDatabase) { values().put(secondPatternOfColumn, valueToStoreInDatabase); } + + public Map<String, Object> toObjectsExposedInGroovyContext() { + Map<String, Object> result = new HashMap<>(); + for (Map.Entry<DataColumn, DataColumnValue> dataColumnDataColumnValueEntry : values.entrySet()) { + final Object valueThatMayBeNull = Optional.ofNullable(dataColumnDataColumnValueEntry.getValue()) + .map(SomethingToBeStoredAsJsonInDatabase::toJsonForDatabase) + .map(Object::toString) + .orElse(null); + result.put(dataColumnDataColumnValueEntry.getKey().toJsonForDatabase(), valueThatMayBeNull); + } + return result; + } } \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/data/DataDatum.java b/src/main/java/fr/inra/oresing/domain/data/DataDatum.java index cf607d03471929081d5726a30f3c8324558b7e20..f26fec8bd49f624197ea7566f76dc36155251724 100644 --- a/src/main/java/fr/inra/oresing/domain/data/DataDatum.java +++ b/src/main/java/fr/inra/oresing/domain/data/DataDatum.java @@ -122,11 +122,15 @@ public class DataDatum implements SomethingThatCanProvideEvaluationContext, Some public ImmutableMap<String, Object> toObjectsExposedInGroovyContext() { final Map<String, Object> map = new LinkedHashMap<>(); for (final Map.Entry<DataColumn, DataColumnValue> entry : values.entrySet()) { - final Object valueThatMayBeNull = Optional.ofNullable(entry.getValue()) - .map(SomethingToBeStoredAsJsonInDatabase::toJsonForDatabase) - .map(Object::toString) - .orElse(null); - map.put(entry.getKey().toJsonForDatabase(), valueThatMayBeNull); + if (entry.getValue() instanceof DataColumnPatternValue patternValue) { + map.put(entry.getKey().toJsonForDatabase(), patternValue.toObjectsExposedInGroovyContext()); + } else { + final Object valueThatMayBeNull = Optional.ofNullable(entry.getValue()) + .map(SomethingToBeStoredAsJsonInDatabase::toJsonForDatabase) + .map(Object::toString) + .orElse(null); + map.put(entry.getKey().toJsonForDatabase(), valueThatMayBeNull); + } } return ImmutableMap.copyOf(map); } diff --git a/src/main/java/fr/inra/oresing/domain/data/deposit/validation/validationcheckresults/GroovyValidationCheckResult.java b/src/main/java/fr/inra/oresing/domain/data/deposit/validation/validationcheckresults/GroovyValidationCheckResult.java index 533d2e5b5259e09ff94e690b80f3422738b3e8d9..0ae2f2f7863f24a36dfc5d554cb074a58f510eb7 100644 --- a/src/main/java/fr/inra/oresing/domain/data/deposit/validation/validationcheckresults/GroovyValidationCheckResult.java +++ b/src/main/java/fr/inra/oresing/domain/data/deposit/validation/validationcheckresults/GroovyValidationCheckResult.java @@ -4,9 +4,12 @@ import com.google.common.collect.ImmutableMap; import fr.inra.oresing.ValidationLevel; import fr.inra.oresing.domain.checker.CheckerTarget; import fr.inra.oresing.domain.checker.type.FieldType; +import fr.inra.oresing.domain.checker.type.PatternType; import fr.inra.oresing.domain.checker.type.StringType; +import fr.inra.oresing.domain.data.deposit.context.column.Column; import java.util.Map; +import java.util.Optional; public record GroovyValidationCheckResult( ValidationLevel level, @@ -17,6 +20,15 @@ public record GroovyValidationCheckResult( ) implements CheckerValidationCheckResult<StringType> { public static GroovyValidationCheckResult success(final CheckerTarget target, final FieldType value) { + if (value instanceof PatternType patternType) { + StringType stringTypeValue = Optional.ofNullable(patternType) + .map(PatternType::getValue) + .map(values -> values.get(Column.__VALUE__)) + .map(Object::toString) + .map(StringType::getStringTypeFromStringValue) + .orElse(StringType.getStringTypeFromStringValue("")); + return new GroovyValidationCheckResult(ValidationLevel.SUCCESS, null, null, target, stringTypeValue); + } return new GroovyValidationCheckResult(ValidationLevel.SUCCESS, null, null, target, (StringType) value.copy()); } diff --git a/src/main/resources/migration/main/V1__init_schema.sql b/src/main/resources/migration/main/V1__init_schema.sql index e2abca56d028481a33bb9591ca398ad6d5f2ebbe..c2cfce21635da96c853bdfdc697b1b91e3333bdf 100644 --- a/src/main/resources/migration/main/V1__init_schema.sql +++ b/src/main/resources/migration/main/V1__init_schema.sql @@ -202,9 +202,14 @@ AS IMMUTABLE RETURNS NULL ON NULL INPUT; CREATE CAST (COMPOSITE_DATE AS TIMESTAMP) WITH FUNCTION castCompositeDateToTimestamp(COMPOSITE_DATE) AS ASSIGNMENT; + +DROP CAST IF EXISTS (COMPOSITE_DATE AS Text); +DROP FUNCTION IF EXISTS castCompositeDateToFormattedDate(COMPOSITE_DATE); + CREATE FUNCTION castCompositeDateToFormattedDate(COMPOSITE_DATE) RETURNS Text AS -'select ($1).formattedDate;' +'select to_char(($1)::timestamp, +($1).formattedDate::text);' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT;