Exemple

Pour mieux comprendre le comportement de DataStoreRuleObjectCreator, prenons un exemple. Cet exemple se base sur le module Universal Access.

Un script IEG peut capturer les données sur le revenu d'un ménage. Le ménage peut contenir un nombre de personnes, chaque personne pouvant avoir plusieurs informations relatives à ses revenus.

Voici une vue simplifiée de la structure du schéma Datastore :

- Application:
  - Person (0..n):
    - firstName (String)
    - lastName (String)
    - Income (0..n):
      - type (Code from the IncomeType code table)
      - amount (Number)

John effectue son auto-sélection et enregistre les informations relatives à son ménage (John et son épouse Mary) et ses revenus (John est sans-emploi, Mary a deux emplois à temps partiels). Les informations de John sont stockées dans Datastore :

- Application #1234:
  - Person #1235:
    - firstName: John
    - lastName: Smith
    - Income: <no records>
  - Person #1236:
    - firstName: Mary
    - lastName: Smith
    - Income #1237:
      - type: Part-time
      - amount: 25
    - Income #1238:
      - type: Part-time
      - amount: 30

Le jeu de règles CER configuré pour être utilisé avec ce type de sélection contient des classes de règles comme suit (NB/// aucune classe de règles n'est affichée) :

<?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/// aucune classe de règles pour le type d'entité CDS "Application" ;
       les attributs stockés directement sur une application ne sont
       pas requis par les règles. La création d'un objet de règle
       qui ne sera pas utilisé ne pose donc pas de problème. -->

  <!-- Le nom de cette classe de règles correspond à celui du type
       d'entité CDS -->
  <Class name="Person">
    <!-- Le nom de cet attribut de règle correspond à celui d'un
         attribut sur le type d'entité CDS. Sa valeur sera par conséquent
         spécifiée automatiquement par
         DataStoreRuleObjectRetriever. -->
    <Attribute name="firstName">
      <!-- Le type d'attribut de règle doit se conformer au
           type d'attribut CDS. Sinon, CER indique
           une erreur d'exécution. -->
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- NB/// aucun attribut de règle pour l'attribut CDS de lastName.
 -->

    <!-- Les attributs de règle correspondant au modèle <nom de la classe
 de règles childEntities_>"
         seront traités spécialement par
         DataStoreRuleObjectRetriever.
    
         DataStoreRuleObjectRetriever spécifie la valeur de
         cet attribut comme valeur de tous les objets de règle créés à partir
         des enregistrements Income enfant qui appartiennent à l'enregistrement de cette personne
         dans le fichier CDS. -->
    <Attribute name="childEntities_Income">
      <!-- Le type doit être une liste d'objets de règle Income -->
      <type>
        <javaclass name="List">
          <ruleclass name="Income"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>
  </Class>

  <!-- Le nom de cette classe de règles ne correspond pas à un type d'entité
 CDS.
       Par conséquent, DataStoreRuleObjectRetriever ne crée pas d'objets de règle
       pour cette classe de règles. -->
  <Class name="Benefit">
    <Attribute name="amount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>
  </Class>

  <Class name="Income">
    <!-- Un attribut de règle nommé "parentEntity" sera
        traité spécialement par
        DataStoreRuleObjectRetriever.
      
        DataStoreRuleObjectRetriever spécifie la valeur de
        cet attribut comme valeur de l'objet de règle créé à partir de
        l'enregistrement Person qui est le parent de cet enregistrement Income
        dans le fichier CDS. -->
    <Attribute name="parentEntity">
      <!-- Le type doit être un objet de règle Person unique -->
      <type>
        <ruleclass name="Person"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="type">
      <type>
        <!-- Le type de cet attribut doit spécifier la table de codes
             appropriée, correspondant à la définition de domaine CDS. -->
        <codetableentry table="IncomeType"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="amount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- Cette dérivation ne sera jamais exécutée, car
             DataStoreRuleObjectRetriever "spécifiera"
             automatiquement la valeur à partir de celle de l'enregistrement CDS ;
             Une fois une valeur spécifiée, CER ne tente pas de la
             calculer.
        
             En règle générale, les attributs qui s'attendent à être remplis
             par DataStoreRuleObjectRetriever doivent être marqués
             <specified/> pour éviter toute confusion entre
             le test autonome de vos jeux de règles et le test
             via DataStoreRuleObjectRetriever.
        -->
        <Number value="123"/>
      </derivation>
    </Attribute>

    <!-- Cet attribut n'est pas présent sur le type d'entité CDS,
         et ne sera donc pas renseigné.  Il s'agit exactement de ce que nous voulons
         car sa valeur est dérivée des autres
         attributs de règle obtenus via la procédure CER normale. -->
    <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>

    <!-- Cet attribut de règle n'est pas calculé et
         ne correspond pas à un attribut sur le
         type d'entité CDS.
    
         Si la valeur de cet attribut est référencée
         au moment de l'exécution, CER indique une erreur d'exécution :
         "La valeur doit être spécifiée avant son utilisation
          (elle ne peut pas être calculée)."
    -->
    <Attribute name="employerName">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>
  </Class>

</RuleSet>

Lorsque John effectue son auto-sélection, le module Universal Access charge le jeu de règles ci-dessus et crée une session CER.

Le module Universal Access appelle DataStoreRuleObjectCreator et indique l'enregistrement Datastore (Application #1234).

DataStoreRuleObjectCreator extrait tous les enregistrements descendants de l'application #1234 et les traite comme suit :

Enfin, le module Universal Access demande au jeu de règles ses questions standard sur les programmes, l'éligibilité et l'explication ; les classes de règles des programmes (non affichés dans l'exemple ci-dessus) permettent d'accéder aux objets de règle (créés par DataStoreRuleObjectCreator) lors de la réponse à ces questions.

Pour plus d'informations sur le Datastore d'application et ses schémas, voir le guide Creating Datastore Schemas.