Assemble une chronologie (voir Gestion des données variables au fil du temps) à partir d'appels répétés à une expression enfant. En général timelineoperation est utilisé avec intervalvalue, et ces deux expressions permettent aux autres expressions d'opérer sur des valeurs des chronologies comme s'il s'agissait de valeurs primitives, puis de rassembler les données obtenues dans une chronologie.
Une brève description de la manière dont timelineoperation se comporte au moment de l'évaluation est présentée ci-dessous :
Le comportement décrit ci-dessus signifie que les expressions internes ne doivent jamais savoir qu'elles font partie du traitement impliquant les chronologies. De plus, le traitement est efficace car les expressions sont uniquement appelées pour les dates auxquelles les chronologies d'entrée modifient la valeur.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_timelineoperation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <!-- true au cours de la vie d'une personne ; false avant la date de naissance, et false après la date de décès (le cas échéant) --> <Attribute name="isAliveTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Boolean"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Les actifs que possède la personne, à un moment ou à un autre. Chaque valeur d'actif peut varier au fil du temps. --> <Attribute name="ownedAssets"> <type> <javaclass name="List"> <ruleclass name="Asset"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- La valeur totale des actifs d'une personne (ou faisant partie de l'héritage d'une personne, si celle-ci est décédée). --> <Attribute name="totalAssetValueTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </type> <derivation> <!-- Totalise la valeur de tous les actifs que possède une personne. La valeur de chaque actif peut changer au fil du temps. --> <!-- <timelineoperation> crée une chronologie à partir des séries de calculs <sum> effectuées dans celle-ci. Chaque exécution de <sum> permet de calculer le total d'une journée spécifique ; <timelineoperation> assemble ces totaux quotidiens dans une chronologie de nombres. --> <timelineoperation> <sum> <!-- Pour chaque actif que possède une personne, obtient sa chronologie de valeurs comptables. --> <dynamiclist> <list> <reference attribute="ownedAssets"/> </list> <listitemexpression> <!-- Encapsule la chronologie renvoyée par countableValueTimeline, de manière à ce que <sum> pense qu'il opère sur une liste de nombres, et non une liste de chronologies. --> <intervalvalue> <reference attribute="countableValueTimeline"> <current/> </reference> </intervalvalue> </listitemexpression> </dynamiclist> </sum> </timelineoperation> </derivation> </Attribute> <!-- Le point limite pour être autorisé à bénéficier de prestations. Les personnes dont les actifs sont supérieurs à ce seuil variable ne peuvent bénéficier de prestations. --> <Attribute name="maximumAssetsThreshold"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </type> <derivation> <!-- Dans une implémentation réelle, cette valeur tend à varier au fil du temps (par exemple, à partir d'une table de taux). Toutefois, à titre d'exemple, cette implémentation utilise un <timelineoperation> SANS <intervalvalue> imbriqué pour créer une chronologie dont la valeur reste toujours constante. Cette utilisation de <timelineoperation> peut souvent s'avérer utile pour les implémentations factices tôt dans le processus de développement du jeu de règles. --> <timelineoperation> <!-- Une valeur toujours constante codée en dur - à remplacer par une valeur variable ultérieurement au cours du processus de développement de règles. --> <Number value="10000"/> </timelineoperation> </derivation> </Attribute> <!-- La personne autorisée à bénéficier de prestations si (quel que soit le jour) elle est en vie et la valeur totale des actifs de cette personne ne dépasse pas le seuil maximal des actifs. --> <Attribute name="qualifiesForBenefitTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Boolean"/> </javaclass> </type> <derivation> <timelineoperation> <all> <fixedlist> <listof> <javaclass name="Boolean"/> </listof> <members> <!-- opère sur les chronologies comme s'il s'agissait de valeurs primitives --> <intervalvalue> <reference attribute="isAliveTimeline"/> </intervalvalue> <compare comparison="<="> <intervalvalue> <reference attribute="totalAssetValueTimeline"/> </intervalvalue> <intervalvalue> <reference attribute="maximumAssetsThreshold"/> </intervalvalue> </compare> </members> </fixedlist> </all> </timelineoperation> </derivation> </Attribute> </Class> <!-- Un actif, que possède une personne à un moment où à un autre. Chaque actif est acheté, et peut ensuite être vendu. La valeur d'un actif varie au fil du temps ; l'actif possède toujours une valeur même avant ou après avoir appartenu à une personne ; toutefois, la _valeur_ comptable est égale à zéro en dehors de la période d'appartenance. --> <Class name="Asset"> <Attribute name="boughtDate"> <type> <javaclass name="curam.util.type.Date"/> </type> <derivation> <specified/> </derivation> </Attribute> <!-- sera égal à null si l'actif n'a pas été vendu --> <Attribute name="soldDate"> <type> <javaclass name="curam.util.type.Date"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="isOwnedTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Boolean"/> </javaclass> </type> <derivation> <existencetimeline> <intervaltype> <javaclass name="Boolean"/> </intervaltype> <intervalfromdate> <reference attribute="boughtDate"/> </intervalfromdate> <intervaltodate> <reference attribute="soldDate"/> </intervaltodate> <preExistenceValue> <false/> </preExistenceValue> <existenceValue> <true/> </existenceValue> <postExistenceValue> <false/> </postExistenceValue> </existencetimeline> </derivation> </Attribute> <!-- la valeur variable de l'actif, qu'il appartienne ou non à la personne à ce moment-là --> <Attribute name="valueTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- La valeur prise en compte pour les actifs de la personne - autrement dit, la valeur de l'actif au cours de la période, lorsqu'il appartient à une personne, ou 0 dans le cas contraire. --> <Attribute name="countableValueTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </type> <derivation> <!-- rassemble les résultats de chaque appel <choose> dans une chronologie --> <timelineoperation> <choose> <type> <javaclass name="Number"/> </type> <when> <condition> <!-- opère sur chacun des intervalles d'une propriété constante --> <intervalvalue> <reference attribute="isOwnedTimeline"/> </intervalvalue> </condition> <value> <!-- s'il concerne une date spécifique, l'actif appartient à une personne, puis sa valeur comptable à cette date correspond simplement à sa valeur --> <intervalvalue> <reference attribute="valueTimeline"/> </intervalvalue> </value> </when> <otherwise> <value> <!-- s'il concerne une date spécifique, l'actif appartient à une personne, puis sa valeur comptable à cette date est égale à zéro --> <Number value="0"/> </value> </otherwise> </choose> </timelineoperation> </derivation> </Attribute> </Class> </RuleSet>
<!-- La valeur prise en compte pour les actifs de la personne - autrement dit, la valeur de l'actif au cours de la période, lorsqu'il appartient à une personne, ou 0 dans le cas contraire. --> <Attribute name="countableValueTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </type> <derivation> <!-- rassemble les résultats de chaque appel <choose> dans une chronologie --> <timelineoperation> <choose> <type> <javaclass name="Number"/> </type> <when> <condition> <!-- opère sur chacun des intervalles d'une propriété constante --> <!-- **** Vous avez oublié d'encapsuler la chronologie renvoyée dans <intervalvalue> **** --> <reference attribute="isOwnedTimeline"/> </condition> <value> <!-- s'il concerne une date spécifique, l'actif appartient à une personne, puis sa valeur comptable à cette date correspond simplement à sa valeur --> <intervalvalue> <reference attribute="valueTimeline"/> </intervalvalue> </value> </when> <otherwise> <value> <!-- s'il concerne une date spécifique, l'actif appartient à une personne, puis sa valeur comptable à cette date est égale à zéro --> <Number value="0"/> </value> </otherwise> </choose> </timelineoperation> </derivation> </Attribute>
ERROR ... Example_timelineoperation.xml(276, 19) AbstractRuleItem:INVALID_CHILD_RETURN_TYPE: Child 'condition' returns 'curam.creole.value.Timeline<? extends java.lang.Boolean>', but this item requires a 'java.lang.Boolean'.