Ejemplo

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:

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.