El comportamiento de DataStoreRuleObjectCreator se explica mejor mediante un ejemplo. Este ejemplo se basa en el módulo de Acceso universal.
Un script IEG puede capturar datos de ingresos para una unidad familiar. La unidad familiar puede contener cualquier número de personas y cada persona puede tener cualquier número de detalles de ingresos.
A continuación se muestra una vista simplificada de la estructura del esquema de almacén de datos:
- Application:
- Person (0..n):
- firstName (Serie)
- lastName (Serie)
- Income (0..n):
- type (Código de la tabla de códigos IncomeType)
- amount (Número)
Un ciudadano (Juan) realiza una autoevaluación y registra pruebas para su unidad familiar (sólo Juan y su esposa María) y detalles de ingresos (Juan está desempleado, María tiene dos trabajos a tiempo parcial). Las pruebas de Juan se almacenan como registros en el Almacén de datos:
- Application #1234:
- Person #1235:
- firstName: Juan
- lastName: Herrero
- Income: <sin registros>
- Person #1236:
- firstName: María
- lastName: Herrero
- Income #1237:
- type: A tiempo parcial
- amount: 25
- Income #1238:
- type: A tiempo parcial
- amount: 30
El conjunto de reglas CER configurado para utilizarse con este tipo de evaluación contiene algunas clases de regla, como se indica a continuación (NB no se muestran clases de regla de programa):
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="DataStoreMappingExample" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <!-- NB ninguna clase de regla para el tipo de entidad CDS "Application"; los atributos almacenados directamente en una aplicación no son necesarios para las reglas, por lo que no es necesario crear un objeto de regla que no se utilizará. --> <!-- El nombre de esta clase de regla coincide con el de un tipo de entidad de CDS --> <Class name="Person"> <!-- El nombre de este atributo de regla coincide con el de un atributo en el tipo de entidad CDS y, por lo tanto, su valor se especificará automáticamente mediante DataStoreRuleObjectRetriever. --> <Attribute name="firstName"> <!-- El tipo del atributo de regla debe coincidir con el tipo de atributo CDS, de lo contrario CER emitirá un error de tiempo de ejecución.--> <type> <javaclass name="String"/> </type> <derivation> <specified/> </derivation> </Attribute> <!-- NB ningún atributo de regla para el atributo CDS para lastName. --> <!-- Los atributos de regla que coincidan con el patrón "childEntities_<nombre de clase de regla>" recibirán un trato especial de DataStoreRuleObjectRetriever. DataStoreRuleObjectRetriever especificará que el valor de este atributo sea todos los objetos de regla creados desde los registros de Ingresos hijo que pertenecen al registro de esta persona en el CDS. --> <Attribute name="childEntities_Income"> <!-- El tipo debe ser una lista de objetos de regla de ingresos --> <type> <javaclass name="List"> <ruleclass name="Income"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> </Class> <!-- El nombre de esta clase de regla no coincide con ningún tipo de entidad CDS, por lo tanto DataStoreRuleObjectRetriever no creará ningún objeto de regla para esta clase de regla. --> <Class name="Benefit"> <Attribute name="amount"> <type> <javaclass name="Number"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> <Class name="Income"> <!-- Un atributo de regla denominado "parentEntity" recibirá un trato especial de DataStoreRuleObjectRetriever. DataStoreRuleObjectRetriever especificará que el valor de este atributo sea el objeto de regla creado desde el registro de persona que es el padre de este registro de ingresos en el CDS. --> <Attribute name="parentEntity"> <!-- El tipo debe ser un solo objeto de regla de persona --> <type> <ruleclass name="Person"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="type"> <type> <!-- El tipo de este atributo debe especificar la tabla de códigos correcta, coincidiendo con la definición de dominio de CDS. --> <codetableentry table="IncomeType"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="amount"> <type> <javaclass name="Number"/> </type> <derivation> <!-- Esta derivación no se ejecutará nunca, porque DataStoreRuleObjectRetriever "especificará" automáticamente el valor del correspondiente al del registro CDS; una vez que se ha especificado un valor CER no intenta calcularlo. En general, los atributos que esperan llenarse mediante DataStoreRuleObjectRetriever se deben marcar como <specified/> para evitar cualquier confusión entre las pruebas autónomas de los conjuntos de reglas y las pruebas con DataStoreRuleObjectRetriever. --> <Number value="123"/> </derivation> </Attribute> <!-- Este atributo no está presente en el tipo de entidad de CDS, por lo que no se llenará. Esto es exactamente lo que deseamos, porque su valor se obtiene de otros atributos de regla de la forma CER normal --> <Attribute name="isCountable"> <type> <javaclass name="Boolean"/> </type> <derivation> <choose> <type> <javaclass name="Boolean"/> </type> <test> <reference attribute="type"/> </test> <when> <condition> <Code table="IncomeType"> <String value="Full-time"/> </Code> </condition> <value> <true/> </value> </when> <when> <condition> <Code table="IncomeType"> <String value="Part-time"/> </Code> </condition> <value> <true/> </value> </when> <otherwise> <value> <false/> </value> </otherwise> </choose> </derivation> </Attribute> <!-- Este atributo de regla no se calcula ni corresponde a un atributo en el tipo de entidad de CDS. Si se hace referencia al valor de este atributo en el tiempo de ejecución, CER informará de un error de tiempo de ejecución: "El valor debe especificarse antes de utilizarse (no se puede calcular)." --> <Attribute name="employerName"> <type> <javaclass name="String"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> </RuleSet>
Cuando Juan completa su autoevaluación, el módulo de acceso universal carga el conjunto de reglas CER anterior y crea una sesión CER.
El Módulo de acceso universal llama a DataStoreRuleObjectCreator y especifica el registro del almacén de datos raíz (Application #1234).
DataStoreRuleObjectCreator recupera todos los registros de descendente de Application #1234 y los procesa de la manera siguiente:
Se omite, porque no hay ninguna clase de regla denominada "Application" en el conjunto de reglas;
crea una instancia de objeto de regla de la clase de regla Person, con:
Se especifica que sea "Juan";
Se omite, porque no hay ningún atributo de regla denominado "lastName" en la clase de regla Person;
Se especifica que sea una lista vacía, porque no hay ningún registro de ingresos para el registro de Person #1235;
crea una instancia de objeto de regla de la clase de regla Person, con:
Se especifica que sea "María";
Se omite;
Se especifica que sea una lista que contenga dos objetos de regla de ingresos de María (creados más abajo);
crea una instancia de objeto de regla de la clase de regla Income, con:
Se especifica que sea el objeto de regla Person creado (más arriba) para María desde el registro de Person #1236;
Se especifica que sea el código "Part-time";
Se especifica que sea el número "25";
No se especifica, porque no hay ningún atributo denominado "employerName" en la entidad de almacén de datos;
crea una instancia de objeto de regla de la clase de regla Income, con:
Se especifica que sea el objeto de regla Person creado (más arriba) para María desde el registro de Person #1236;
Se especifica que sea el código "Part-time" y
Se especifica que sea el número "30".
Por último, el Módulo de acceso universal hace las preguntas al conjunto de reglas las preguntas estándares sobre los programas, la elegibilidad y explicación; las clases de reglas para los programas (no se muestran en el ejemplo anterior) acceden a los objetos de regla (creados por DataStoreRuleObjectCreator) al responder a estas preguntas.
Para obtener más información sobre el almacén de datos de la aplicación y sus esquemas, consulte la guía Creación de esquemas de almacén de datos.