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'.