Foreach

From JRapid

(Difference between revisions)
Jump to: navigation, search
(See also:)
(Redirected page to Foreach (element))
 
Line 1: Line 1:
-
The "foreach" element is useful when you have an entity A which specifies an [[embedded inline]] [[collection]] property of an entity B and you want that collection to be automatically loaded with elements of an entity C.
+
#REDIRECT [[foreach (element)]]
-
 
+
-
A first approach to solve this requirement will be overriding the ''find()'' method of the entity A. The new ''find()'' method can query all the C elements and then '''for each''' element of the entity C, create a new element B to hold that element. Finally, return the entity A with the collection of B elements.
+
-
 
+
-
JRapid's "foreach" does the same job. You only need to provide an [[EL]] expression for querying all the C elements and specify which is the property of the B entity which will hold each element.
+
-
 
+
-
The "foreach" element is specified inside the property which is an embedded inline collection.
+
-
 
+
-
==Usage:==
+
-
 
+
-
{{Foreach spec}}
+
-
 
+
-
# select: EL expression for getting the collection of elements to be added.
+
-
# setproperty: the property of the embedded inline entity for storing the items of the collection returned by the ''select'' expression.
+
-
# property: only applicable when the ''foreach'' is inside a subset. It indicates the properties where it will be applied.
+
-
 
+
-
==Examples: ==
+
-
 
+
-
* Loading a company's additional data fields:
+
-
 
+
-
[[File:Foreachex.jpg|none|thumb|400px|"foreach" example]]
+
-
 
+
-
<pre class="brush:xml">
+
-
//Entity A
+
-
<entity label="Company" name="Company">
+
-
  ...
+
-
  <property childproperty="company" collection="sortedset" embedded="inline"
+
-
      entity="DataValue" label="Additional Info" labelposition="top" name="additionalData"
+
-
      setorder="data">
+
-
      <foreach select="Data:findAll()" setproperty="data"/>
+
-
  </property>
+
-
  ...
+
-
</entity>
+
-
</pre>
+
-
 
+
-
<pre class="brush:xml">
+
-
//Entity B
+
-
<entity label="AdditionalInfoRow" name="AdditionalInfoRow">
+
-
  <property entity="Company" label="Empresa" name="company"/> //Connects entity A with B
+
-
  <property display="primary" entity="Data" label="Data" name="data"/> //Connects entity B with C
+
-
  <property display="secondary" label="Value" name="value"/>
+
-
</entity>
+
-
</pre>
+
-
 
+
-
<pre class="brush:xml">
+
-
//Entity C
+
-
<entity label="Data" name="Data">
+
-
  <property display="primary" label="Data" name="data"/>
+
-
</entity>
+
-
</pre>
+
-
 
+
-
Generated find() method in CompanyServicesAbstract.java:
+
-
 
+
-
<pre class="brush:java">
+
-
    // code for find
+
-
    public Company find(String id) throws ELException {
+
-
        Company obj = null;
+
-
       
+
-
        // step 1: build map
+
-
        ExpressionVariableResolver evr = new ExpressionVariableResolver();
+
-
        FunctionMapper fm = new FunctionMapper();
+
-
        Session session = Session.getMySession();
+
-
           
+
-
        if (id.equals("0")) {   
+
-
            // step 2: new object
+
-
            obj = new Company();
+
-
           
+
-
            // step 3: setvalues             
+
-
            obj.setComments((String)el.evaluate("${'Comments for this company...'}",
+
-
            String.class, evr, fm));
+
-
        } else {
+
-
            obj = Company.DAO().findById(id);
+
-
        }
+
-
       
+
-
        // step 4: locking
+
-
        long time = new java.util.Date().getTime();
+
-
       
+
-
        obj.setReadLastUser(session.getUsername());
+
-
        obj.setReadTimestamp(time);
+
-
       
+
-
        // step 5: foreach
+
-
        for (Object o:((Iterable)el.evaluate("${Data:findAll()}", Object.class, evr, fm))) {
+
-
            if (!obj.containsAdditionalData(o)) {
+
-
                DataValue newObject = new DataValue();
+
-
                newObject.setData((Data)o);
+
-
                newObject.setCompany(obj);
+
-
                obj.getAdditionalData().add(newObject);
+
-
            }
+
-
        }
+
-
         
+
-
        // step 6: return
+
-
        return obj;
+
-
    }
+
-
</pre>
+
-
 
+
-
* DailyCurrenyRates example:
+
-
 
+
-
[[File:Foreachex2.jpg|none|thumb|400px|"foreach" example]]
+
-
 
+
-
<pre class="brush:xml">
+
-
    <entity label="Currency" name="Currency">
+
-
        <property display="primary" label="Name" name="name"/>
+
-
    </entity>
+
-
 
+
-
    <entity label="CurrencyValue" name="CurrencyValue">
+
-
        <property entity="Currency" fixed="fixed" label="Currency"
+
-
          name="currency"/>
+
-
        <property label="Value" name="value" type="double"/>
+
-
        <property entity="DailyCurrencyRates" label="Daily Currency Rates"
+
-
          name="dailyCurrencyRates"/>
+
-
    </entity>
+
-
 
+
-
    <entity label="Daily Currency Rates" name="DailyCurrencyRates">
+
-
        <property default="now" label="Date" name="rateDate" type="date"/>
+
-
        <property childproperty="dailyCurrencyRates" collection="sortedset"
+
-
        embedded="inline" entity="CurrencyValue" label="Values"
+
-
        labelposition="fieldset" name="currencyValues" setorder="currency">
+
-
            <foreach select="Currency:findAll()" setproperty="currency"/>
+
-
        </property>
+
-
    </entity>
+
-
</pre>
+
-
 
+
-
==See also:==
+
-
 
+
-
* Related article: [http://jrapid.ning.com/profiles/blogs/the-foreach-element The for each element]
+
-
* [[embedded]]
+
-
* [[dynamicforeach]]
+
-
 
+
-
[[Category:Embedded inline]][[Category:Collection]]
+

Current revision as of 18:59, 8 October 2010

  1. REDIRECT foreach (element)
Personal tools