Expression groovy
Expressions pour calculer ou transformer des valeurs de composantes
Les expressions Groovy dans votre application sont utilisées pour calculer des valeurs par défaut, tester les valeurs de components ou effectuer des computations en utilisant des données fournies.
Expression groovy
Les expressions Groovy dans votre application sont utilisées pour calculer des valeurs par défaut, tester les valeurs de components ou effectuer des computations en utilisant des données fournies. Ce contexte est généralement une map contenant :
- les données d’entrée de la ligne (datum)
- Les valeurs enregistrées des types de données déclarés (OA_references) en même temps que l’expression (OA_expression) (references et referencesValues)
- pour le dépôt avec versionnement (OA_strategy: OA_VERSIONING) le contexte de versionnement (binaryFile)
- l’internationalisation du data (dataI18n)
- la description du data (dataDescription)
- l’identificateur du data (dataName)
- la configuration de l’application (application)
- l’identificateur de l’application (applicationName)
- les lignes d’en-tête du fichier (preHeaderRow, headerRow, postHeaderRow)
- la ligne courante (currentRow)
- le numéro de ligne (currentRowNumber)
Les valeurs enregistrées des types de données déclarés (OA_references) en même temps que l’expression (OA_expression) (references et referencesValues), et des fonctions utilitaires. Les expressions sont évaluées dans ce contexte pour produire un résultat ou déclencher des exceptions personnalisées en cas d’erreur.
Le contexte met aussi des expressions pour simplifier l’écriture du groovy ainsi que pour générer des exceptions personalisées.
Exemples de scripts groovy
def numbers = [1, 2, 3, 4, 5]
def firstEven = numbers.find { it % 2 == 0 }
println(firstEven) // Affiche: 2
Exemples de scripts groovy
def names = ['Alice', 'Bob', 'Charlie']
def upperNames = names.collect { it.toUpperCase() }
println(upperNames) // Affiche: [ALICE, BOB, CHARLIE]
def numbers = [1, 2, 3, 4, 5]
def evenNumbers = numbers.findAll { it % 2 == 0 }
println(evenNumbers) // Affiche: [2, 4]
def sales = [
[product: 'A', amount: 100],
[product: 'B', amount: 200],
[product: 'A', amount: 150]
]
def totalSales = sales.sum { it.amount }
println(totalSales) // Affiche: 450
def transactions = [
[product: 'A', amount: 100],
[product: 'B', amount: 200],
[product: 'A', amount: 150],
[product: 'C', amount: 300]
]
def salesByProduct = transactions.groupBy { it.product }
.collect { product, sales ->
[product: product, total: sales.sum { it.amount }]
}
println(salesByProduct)
// Affiche: [[product:A, total:250], [product:B, total:200], [product:C, total:300]]
def people = [
[name: 'Alice', age: 25],
[name: 'Bob', age: 30],
[name: 'Charlie', age: 35],
[name: 'David', age: 28]
]
def namesOfPeopleOver30 = people.findAll { it.age > 30 }
.collect { it.name }
println(namesOfPeopleOver30) // Affiche: [Charlie]
Expressions Prédéfinies
Le contexte inclut des expressions prédéfinies pour simplifier l’écriture des scripts Groovy et générer des exceptions personnalisées :
OA_naturalKeyBuilder
Construit des clés naturelles à partir de multiples critères. Exemple :
.forDatumField("agroecosystem").onDataName("tr_agroecosystem_agr").forKey("agr_key").withException("MISSING_AGROECOSYSTEM") .forDatumField("site").onDataName("tr_site_sit").forKey("sit_key").withException("MISSING_SITE") .naturalKey() groovy OA_naturalKeyBuilder
Ici on construit une clé naturelle en se basant sur les colonnes agroecosystem et site, que l’on compare auw valeurs des composants agr_key de tr_agroecosystem_agr et sit_key de tr_site_sit. Si l’une de ces valeurs est manquante, on renverra une groovyException avec le nom MISSING_AGROECOSYSTEM ou MISSING_SITE.
Il est à votre charge de compléter l’expression de la section OA_expression par une section d’internationalisation de ces exceptions.
Voici un exemple d’une telle section :
OA_computation:
OA_expression: >
OA_naturalKeyBuilder
.forDatumField("flx_site_name")
.onDataName("tr_sites_sit")
.forKey("sit_site_key")
.withException("MISSING_SITE")
.forDatumField("flx_parcelle_name")
.onDataName("tr_parcelles_par")
.forKey("par_parcelle_key")
.withException("MISSING_PARCELLE")
.naturalKey() OA_references:
- tr_sites_sit
- tr_parcelles_par
OA_groovyExceptions: #optional
MISSING_SITE:
- fr: le site {value} n'existe pas. Les sites connus sont {knownValues}
- en: site {value} doesn't exists. Knowns sites are {knownValues}
MISSING_PARCELLE:
- fr: la parcelle {value} n'existe pas. Les parcelles connues pour le site [parents[0]} connus sont ${knownValues}
- en: plot {value} doesn't exists. Knowns plots for site {parents[0]} are ${knownValues}
OA_escapeLabel
Permet d’échapper un texte pour qu’il puisse être utilisé dans une clef naturelle
OA_escapeLabel("Une chaîne à échapper")
valeur de retour: une_chaine_a_echapper
OA_buildException
Permet de créer une exception dans un script groovy
throw OA_buildException(
"MISSING_SITE", s
Map.of(
"site", datum.site,s
"knownSites", references.tr_site_sit.refValues.collect{it.sit_key}
)
)
N’oublier pas de déclarer l’internationalisation de votre exception dans une section OA_groovyExceptions
OA_computation:
OA_expression: >
throw OA_buildException(
"MISSING_SITE", s
Map.of(
"site", datum.site,s
"knownSites", references.tr_site_sit.refValues.collect{it.sit_key}
)
)
OA_groovyExceptions: #optional
MISSING_SITE:
- fr: le site {site} n'existe pas. Les sites connus sont {knownSites}
- en: site {site} doesn't exists. Knowns sites are {knownSites}
OA_buildCompositeKey
Créé une clé composite à partir des valeurs de plusieurs composants
OA_buildCompositeKey(['agroecosystem', 'site', 'plot'])
Exemple de réponse : agroecosysteme_1__site_experimental_1__parcelle_2
Si vous voulez construire une liste de clé composite à partir de component MANY, on utilisera OA_buildManyCompositeKey
OA_buildManyCompositeKey(['agroecosystem', 'site', 'plot'])
Exemple de réponse : agroecosysteme_1__site_experimental_1__parcelle_1,agroecosysteme_2__site_experimental_1__parcelle_2
Objets du contexte
datum
Ce sont les valeurs de la ligne.
datum:
[
"date": "01/01/2005",
"heure": "00:30:00",
"sit_loc": "paris"
]
utilisation :
OA_computation:
OA_expression: >
return datum.date + " " + datum.heure
valeur de retour: 01/01/20005 00:30:00
references et referencesValues
Ce sont les lignes enregistrées des référentiels déclarés dans la section OA_references relative à l’expression. Renvoie un tableau de lignes ou un tableau de tableau de valeurs des lignes
referenceValues:
[
"t_data_dat": [
[
"hierarchicalKey": "tr_agroecosystemes_agrKprairies_permanentes.tr_sites_sitKtheix",
"naturalKey": "theix",
"refValues": [
["key": "theix",
"date": "01/01/2005",
"name": "Theix"],
["key": "theix",
"date": "02/01/2005",
"name": "Theix"],
["key": "theix",
"date": "03/01/2005",
"name": "Theix"],
["key": "theix",
"date": "04/01/2005",
"name": "Theix"]
]
]
]
]
OA_computation:
OA_expression: >
return references.t_data_dat[0].refValues.collect { it.date } OA_references: [t_data_dat]
valeur de retour: [“01/01/2005”,“02/01/2005”,“03/01/2005”,“04/01/2005”}
OA_computation:
OA_expression: >
return references.t_data_dat[0].naturalKey OA_references: [t_data_dat]
valeur de retour: theix
A noter que referenceValues permet d’accéder aux métadonnées de la ligne. Si vous n’utilisez que les valeurs vous utiliserez la variable de contexte referenceValues
referencesValues :
[
["key": "theix",
"date": "01/01/2005",
"name": "Theix"],
["key": "theix",
"date": "02/01/2005",
"name": "Theix"],
["key": "theix",
"date": "03/01/2005",
"name": "Theix"],
["key": "theix",
"date": "04/01/2005",
"name": "Theix"]
]
OA_computation:
OA_expression: >
return referencesValues.collect{it.t_data_dat.date} OA_references: [t_data_dat]
valeur de retour: {“01/01/2005”,“02/01/2005”,“03/01/2005”,“04/01/2005”}
headerRow
La liste de la ligne d’en-tête
headerRow:
["site", "traitement","version"]
preHeaderRow et postHeaderRow
La liste des lignes avant ou après la ligne d’en-tête et avant les lignes de données
autres
- application correspond à l’objet application correspondant à la configuration chargées
- applicationName: identificateur de l’application
- dataDescription: description du data courant tel que définie dans le fichier de configuration
- dataName: identificateur du data courant
- dataI18n: valeurs d’internationalisation pour ce data
- currentRowNumber: numero de la ligne en cours
- binaryFile: objet d’information du fichier déposé ou en cours de publication
Pour plus d’information sur ces valeurs vous pouvez tester un computed component avec la valeur en retour.