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.
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.
<?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="<=">
<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>
<!--
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'.