timelineoperation

Ensambla una línea de tiempo (consulte Manejo de datos que cambian a lo largo del tiempo) desde llamadas repetidas a una expresión hija. Normalmente timelineoperation se utiliza conjuntamente con intervalvalue y, juntas, estas dos expresiones permiten que otras expresiones operen en valores de líneas de tiempo como si fueran valores primitivos y luego hagan que los datos resultantes se ensamblen en una línea de tiempo.

Consejo: Para cada una de las líneas de tiempo que se utilizan como entrada en el algoritmo, normalmente deberá envolver la expresión que devuelve la línea de tiempo en un intervalvalue y, a continuación, envolver el resultado global en un timelineoperation.

A continuación se proporciona una breve descripción de cómo se comporta timelineoperation en el tiempo de evaluación:

El comportamiento descrito anteriormente significa que las expresiones internas nunca tienen que saber que forman parte del proceso que incluye las líneas de tiempo. Además, el proceso es eficiente porque las expresiones sólo se invocan para fechas en las que las líneas de tiempo de entrada cambian de valor.

Nota: Si timelineoperation opera en una expresión no envuelta por un intervalvalue, la línea de tiempo resultante tendrá un valor constante todo el tiempo.
<?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 durante el tiempo de vida de una persona; false antes de la fecha de nacimiento
     y false de nuevo después de la fecha de nacimiento (si hay alguna)
      -->
    <Attribute name="isAliveTimeline">
      <type>
        <javaclass name="curam.creole.value.Timeline">
          <javaclass name="Boolean"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!--
     Los activos propiedad de la persona, en un momento u otro. El
     valor de cada activo puede variar con el tiempo.
      -->
    <Attribute name="ownedAssets">
      <type>
        <javaclass name="List">
          <ruleclass name="Asset"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>



    <!--
     El valor total de los activos que son propiedad de la persona (o de la
     herencia de la persona, si la persona ha muerto).
      -->
    <Attribute name="totalAssetValueTimeline">
      <type>
        <javaclass name="curam.creole.value.Timeline">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <!--
         Sumar el valor de todos los activos de propiedad. El valor de cada
         activo puede cambiar con el tiempo.
          -->

        <!--
         <timelineoperation> creará una línea de tiempo a partir de la serie
         de cálculos de <sum> realizados en ella.

         Cada ejecución de <sum> calculará el total de un
         día determinado; <timelineoperation> ensamblará estos
         totales diarios en una línea de tiempo de números.
          -->
        <timelineoperation>

          <sum>
            <!--
             Para cada activo de propiedad, obtener el tiempo de línea de valor contable.
              -->
            <dynamiclist>
              <list>
                <reference attribute="ownedAssets"/>
              </list>
              <listitemexpression>

                <!--
                 Envolver la línea de tiempo devuelta por
                 countableValueTimeline, para que <sum> crea
                 que está operando en una lista de números, no una
                 lista de líneas de tiempo.
                  -->
                <intervalvalue>
                  <reference attribute="countableValueTimeline">
                    <current/>
                  </reference>
                </intervalvalue>
              </listitemexpression>
            </dynamiclist>

          </sum>

        </timelineoperation>

      </derivation>
    </Attribute>


    <!--
     El punto de límite de corte para estar autorizar a la prestación. Las personas con
     activos por encima de este umbral variable no están autorizadas para la prestación.

      -->
    <Attribute name="maximumAssetsThreshold">
      <type>
        <javaclass name="curam.creole.value.Timeline">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <!--
         En una implementación real, este valor tenderá variar
         con el paso del tiempo (por ejemplo de una tabla de tasas).

         Sin embargo, para simplificar el ejemplo esta implementación utiliza
         un <timelineoperation> SIN un <intervalvalue> anidado para
         crear una línea de tiempo que tenga un valor constante todo el tiempo.

         A menudo este uso de <timelineoperation> puede ser útil para
         que las implementaciones ficticias se activen antes en el desarrollo de conjunto de reglas.
        -->

        <timelineoperation>
          <!--
           Valor de constante para siempre de codificación fija - que se deberá sustituir por un
           valor variable más adelante en el desarrollo de reglas.
            -->
          <Number value="10000"/>
        </timelineoperation>
      </derivation>
    </Attribute>

    <!--
     La persona cualificada para prestación si (en cualquier día determinado)
     la persona está viva y el valor total de los activos de la persona
     no supera el umbral máximo de activo.
      -->
    <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>
                <!--
                 operar en las líneas de tiempo como si fueran
                 valores primitivos
                  -->
                <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 activo, propiedad de una persona en un momento u otro.

   Cada activo se compra y, posteriormente, se puede vender.

   El valor de un activo varía con el tiempo; el activo todavía tiene un
   valor incluso antes o después de ser propiedad de una Persona; sin embargo,
   el valor  _countable_ es cero fuera del periodo de
   propiedad.
    -->
  <Class name="Asset">
    <Attribute name="boughtDate">
      <type>
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- será nulo si el activo no se ha vendido -->
    <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>

    <!--
     el valor variable del activo, independientemente de si es
     propiedad de la persona en ese momento
      -->
    <Attribute name="valueTimeline">
      <type>
        <javaclass name="curam.creole.value.Timeline">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!--
     El valor que cuenta para los activos de la persona - es decir, el
     valor del activo durante el periodo en el que es propiedad,
     de lo contrario 0 cuando no es propiedad.
      -->
    <Attribute name="countableValueTimeline">
      <type>
        <javaclass name="curam.creole.value.Timeline">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <!--
         volver a ensamblar las salidas de cada invocación de <choose> en una
         línea de tiempo
          -->
        <timelineoperation>
          <choose>
            <type>
              <javaclass name="Number"/>
            </type>
            <when>
              <condition>
                <!--
                 operar en cada uno de los intervalos de la
                 propiedad constante
                -->

                <intervalvalue>
                  <reference attribute="isOwnedTimeline"/>
                </intervalvalue>
              </condition>
              <value>
                <!--
                 si en una fecha determinada, el activo es propiedad, entonces
                 su valor contable en esa fecha es simplemente su
                 valor
                  -->
                <intervalvalue>
                  <reference attribute="valueTimeline"/>
                </intervalvalue>
              </value>
            </when>
            <otherwise>
              <value>
                <!--
                 si en una fecha determinada, el activo es propiedad, entonces
                 su valor contable en esa fecha es cero
                  -->
                <Number value="0"/>
              </value>
            </otherwise>
          </choose>

        </timelineoperation>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
Consejo: Si una expresión interna devuelve una línea de tiempo y se olvida de envolver esa expresión en un intervalvalue, verá errores de validación CER como en este ejemplo:
<!--
     El valor que cuenta para los activos de la persona - es decir, el
     valor del activo durante el periodo en el que es propiedad,
     de lo contrario 0 cuando no es propiedad.
      -->
    <Attribute name="countableValueTimeline">
      <type>
        <javaclass name="curam.creole.value.Timeline">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <!--
         volver a ensamblar las salidas de cada invocación de <choose> en una
         línea de tiempo
          -->
        <timelineoperation>
          <choose>
            <type>
              <javaclass name="Number"/>
            </type>
            <when>
              <condition>
                <!--
                 operar en cada uno de los intervalos de la
                 propiedad constante
                -->

                <!--
                  **** Se ha olvidado de envolver la línea de tiempo devuelta
                  en <intervalvalue> ****
                  -->
                  <reference attribute="isOwnedTimeline"/>
              </condition>
              <value>
                <!--
                 si en una fecha determinada, el activo es propiedad, entonces
                 su valor contable en esa fecha es simplemente su
                 valor
                  -->
                <intervalvalue>
                  <reference attribute="valueTimeline"/>
                </intervalvalue>
              </value>
            </when>
            <otherwise>
              <value>
                <!--
                 si en una fecha determinada, el activo es propiedad, entonces
                 su valor contable en esa fecha es cero
                  -->
                <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'.