timelineoperation

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.

Conseil : Pour chacune des chronologies utilisées comme entrée dans votre algorithme, vous devez généralement encapsuler l'expression renvoyant la chronologie dans un élément intervalvalue, puis encapsuler le résultat total dans un élément timelineoperation.

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.

Remarque : Si un élément timelineoperation opère sur une expression qui n'est pas encapsulée par un élément intervalvalue, alors la chronologie obtenue aura toujours une valeur constante.
<?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="&lt;=">
                  <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>
Conseil : Si une expression interne renvoie une chronologie, et si vous oubliez d'encapsuler cette expression dans un élément intervalvalue, vous obtiendrez des erreurs de validation CER, telles que présentées dans cet exemple :
<!--
     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'.