<?xml version="1.0"?>
<rss version="2.0">
<channel>
<link>http://helma.org/Documentation/Object-Relational+Mapping/</link>
<title>helma.org/Documentation/Object-Relational Mapping</title>
<description>Updates for Page helma.org/Documentation/Object-Relational Mapping</description>
<pubDate>Mon, 21 May 2012 20:37:45 +0000</pubDate>
<item>
<title>Version 6</title>
<link>http://helma.org/Documentation/Object-Relational+Mapping/history.diff?v=6</link>
<description>&lt;div class=&#39;diffbody&#39;&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;1&lt;/td&gt;&lt;td&gt;Helma 1 comes with its own &lt;span class=&#39;diffremoved&#39;&gt;home-grown &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;fully featured &lt;/span&gt;Object-Relational Mapping framework. &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description>
<pubDate>Mon, 21 Sep 2009 15:32:31 +0000</pubDate>
<author>hannes</author>
</item>
<item>
<title>Version 5</title>
<link>http://helma.org/Documentation/Object-Relational+Mapping/history.diff?v=5</link>
<description>&lt;div class=&#39;diffbody&#39;&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;145&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description>
<pubDate>Mon, 21 Sep 2009 15:23:45 +0000</pubDate>
<author>hannes</author>
</item>
<item>
<title>Version 4</title>
<link>http://helma.org/Documentation/Object-Relational+Mapping/history.diff?v=4</link>
<description>&lt;ul class=&#39;diffproperties&#39;&gt;&lt;li&gt;Set &lt;span class=&#39;diffpropname&#39;&gt;useMarkdown&lt;/span&gt; to &lt;span class=&#39;diffadded&#39;&gt;true&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#39;diffbody&#39;&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;3&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Overview&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;7&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_db = antville&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;8&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_table = AV_TEXT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;9&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;10&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _parent = site.stories&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;11&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _id = TEXT_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;12&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _prototype = TEXT_PROTOTYPE&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;9&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;_parent =&lt;/span&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;site.stories&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; # object references&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;10&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;_id &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  creator &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_ID&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;object (user)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;11&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;_prototype &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  creator.local &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_PROTOTYPE&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TEXT_F_USER_CREATOR&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;12&lt;/td&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&#39;diffadded&#39;&gt; creator.foreign = USER_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;13&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;# object references&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;14&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;creator =&lt;/span&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;object (user)&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; # primitive properties&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;15&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;creator.local &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  title &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_F_USER_CREATOR&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TEXT_TITLE&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;16&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;creator.foreign &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  text &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;USER_ID&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TEXT_TEXT&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;17&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; createtime = TEXT_CREATETIME&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;18&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; modifytime = TEXT_MODIFYTIME&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;11&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;# &lt;span class=&#39;diffremoved&#39;&gt;primitive properties&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;collections&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;12&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;title &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  comments &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_TITLE&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;collection (comment)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;13&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;text &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  comments.local &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_TEXT&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TEXT_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;14&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;createtime &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  comments.foreign &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_CREATETIME&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TEXT_F_TEXT_STORY&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;15&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;modifytime &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  comments.filter &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TEXT_MODIFYTIME&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TEXT_ISONLINE &amp;gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;16&lt;/td&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&#39;diffadded&#39;&gt;comments.order = TEXT_MODIFYTIME DESC&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;17&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt; # collections&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;18&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt; comments = collection (comment)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;19&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt; comments.local = TEXT_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;20&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt; comments.foreign = TEXT_F_TEXT_STORY&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;21&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt; comments.filter = TEXT_ISONLINE &amp;gt; 0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;22&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt; comments.order = TEXT_MODIFYTIME DESC&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;15&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Basic Mappings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;17&lt;/td&gt;&lt;td&gt;The &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_db&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_db` &lt;/span&gt;entry describes the database to use for storing objects of this type. &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;dbname&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`dbname` &lt;/span&gt;is the name of a database as defined in the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;db&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`db&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;properties&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;properties` &lt;/span&gt;file. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;19&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_db &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _db &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;dbname&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;dbname&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;21&lt;/td&gt;&lt;td&gt;The &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_table&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_table` &lt;/span&gt;entry tells Helma which table to use for objects of this type within the database. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;23&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_table &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _table &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;TABLENAME&amp;lt;/pre&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;TABLENAME&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;25&lt;/td&gt;&lt;td&gt;The &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_id&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_id` &lt;/span&gt;entry defines the column to use as primary key. Helma requires a single primary key with no other functionality. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;27&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_id &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _id &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;ID_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;ID_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;29&lt;/td&gt;&lt;td&gt;The optional &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_name&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_name` &lt;/span&gt;entry tells Helma which database column to use as object name. This is important for the user prototype, since it defines which column constitutes the user name. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;31&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_name &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _name &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;NAME_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;NAME_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;33&lt;/td&gt;&lt;td&gt;The &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_parent&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_parent` &lt;/span&gt;entry contains a comma-separated list of properties of objects of this type to be used as parent. Objects must know their parent in order to generate correct URLs in their &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;href()&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`href()` &lt;/span&gt;function. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;35&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_parent &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _parent &lt;/span&gt;= property1, property2.collectionX, root.&lt;span class=&#39;diffremoved&#39;&gt;collectionY&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;collectionY&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;39&lt;/td&gt;&lt;td&gt;A type can inherit its data mapping and functions from another type. This is done with the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_extends&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_extends` &lt;/span&gt;entry. Simply specify the name of the parent type:&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;41&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_extends &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _extends &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;parenttype&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;parenttype&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;43&lt;/td&gt;&lt;td&gt;Extended prototypes are usually stored in the same relational database table. Thus, Helma needs a way to tell which row in the table should be instantiated with which object prototype. This is done using the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_prototype&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_prototype` &lt;/span&gt;entry, specifying a column in the table containing the name of the prototype for each row.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;45&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_prototype &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _prototype &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;PROTO_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;PROTO_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;47&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Simple Property Mappings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;51&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop1 &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop1 &lt;/span&gt;= DB_COLUMN_1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;52&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop2 = &lt;span class=&#39;diffremoved&#39;&gt;DB_COLUMN_2&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;DB_COLUMN_2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;55&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop1&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop1&lt;/span&gt;.readonly = &lt;span class=&#39;diffremoved&#39;&gt;true&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;true&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;59&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop1&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop1&lt;/span&gt;.private = &lt;span class=&#39;diffremoved&#39;&gt;true&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;true&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;61&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Object Reference Mappings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;65&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop3 &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop3 &lt;/span&gt;= object (protoype) &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;66&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop3.local = LOCAL_DB_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;67&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop3.foreign = &lt;span class=&#39;diffremoved&#39;&gt;FOREIGN_DB_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;FOREIGN_DB_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;67&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop3&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop3&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;local&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;local` &lt;/span&gt;specifies the part of the reference in the local database-table, &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop3&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop3&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;foreign&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;foreign` &lt;/span&gt;the column in the table where objects of the referenced prototype are stored. By executing the assignment &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;obj&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`obj&lt;/span&gt;.prop3 = &lt;span class=&#39;diffremoved&#39;&gt;someObject&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;someObject`&lt;/span&gt;, the database-column specified by &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop3&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop3&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;local&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;local` &lt;/span&gt;will be set to the value of &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;FOREIGN_DB_COLUMN&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`FOREIGN_DB_COLUMN`&lt;/span&gt;, or &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`null` &lt;/span&gt;if &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;someObject &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`someObject &lt;/span&gt;== &lt;span class=&#39;diffremoved&#39;&gt;null&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;null`&lt;/span&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;69&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Collection Mappings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;71&lt;/td&gt;&lt;td&gt;The following section describes the entries used to define collections of objects. There are two kinds of collections: First, every object can itself act as a collection, and second, it can define additional properties to be used as collections. Direct descendents are defined with entries starting with &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;_children&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`_children`&lt;/span&gt;, while additional collections are defined using their property name. Otherwise the syntax for the two is the same. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;73&lt;/td&gt;&lt;td&gt;The following are examples for simple collection mappings for both the direct descendants and those contained in a collection-property called &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop4&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop4`&lt;/span&gt;. The &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;foreign&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;foreign` &lt;/span&gt;entry is used in both cases to specify a column in the foreign table used to collect the objects. Exactly those objects will be collected whose &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;FOREIGN_DB_COLUMN&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`FOREIGN_DB_COLUMN` &lt;/span&gt;value equals the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;LOCAL_DB_COLUMN&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`LOCAL_DB_COLUMN` &lt;/span&gt;value of the object holding the collection. Leaving away &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;local&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;local` &lt;/span&gt;and &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;foreign&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;foreign` &lt;/span&gt;creates a collection of all available objects of the specified prototype. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;75&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;_children &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; _children &lt;/span&gt;= collection (protoype) &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;76&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_children.local = LOCAL_DB_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;77&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_children.foreign = FOREIGN_DB_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;77&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4 = collection (protoype) &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;78&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.local = LOCAL_DB_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;79&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.foreign = &lt;span class=&#39;diffremoved&#39;&gt;FOREIGN_DB_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;FOREIGN_DB_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;79&lt;/td&gt;&lt;td&gt;By executing &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;obj&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`obj&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;add(otherObj)&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;add(otherObj)` &lt;/span&gt;resp. &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;obj&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`obj&lt;/span&gt;.prop4.&lt;span class=&#39;diffremoved&#39;&gt;add(otherObj)&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;add(otherObj)`&lt;/span&gt;, the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;FOREIGN_DB_COLUMN&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`FOREIGN_DB_COLUMN` &lt;/span&gt;will be set to the value of &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;LOCAL_DB_COLUMN&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`LOCAL_DB_COLUMN`&lt;/span&gt;. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;81&lt;/td&gt;&lt;td&gt;By default, child objects can be accessed from the containing parent object through their index-position or &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;ID&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`ID` &lt;/span&gt;value. Additionally the entry &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;accessname&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;accessname` &lt;/span&gt;can be used to specify a database column in the child table. The value of this column will be used as name of the objects contained in this collection. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;83&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop4&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop4&lt;/span&gt;.accessname = &lt;span class=&#39;diffremoved&#39;&gt;DB_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;DB_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;85&lt;/td&gt;&lt;td&gt;With the above mapping, an object contained in the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop4&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop4` &lt;/span&gt;collection with a &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;DB_COLUMN&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`DB_COLUMN` &lt;/span&gt;value of &amp;quot;xyz&amp;quot; would be reachable as &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;this&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`this&lt;/span&gt;.prop4.&lt;span class=&#39;diffremoved&#39;&gt;xyz&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;xyz` &lt;/span&gt;from the containing object. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;87&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`filter` &lt;/span&gt;can be used to add an additional condition for the selection of objects which is not dependent on the object holding the collection. &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;order&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`order` &lt;/span&gt;contains the sorting to be applied to the child objects. &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;group&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`group` &lt;/span&gt;tells Helma to group the objects in the collection according to the value in &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;DB_GROUPCOLUMN&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`DB_GROUPCOLUMN`&lt;/span&gt;. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;89&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop4&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop4&lt;/span&gt;.filter = DB_FILTERCOLUMN is not null &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;90&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.order = DB_ORDERCOLUMN desc &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;91&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.group = DB_GROUPCOLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;92&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.group.order = DB_GROUPORDERCOLUMN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;93&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.group.prototype = &lt;span class=&#39;diffremoved&#39;&gt;SomePrototype&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;SomePrototype&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;91&lt;/td&gt;&lt;td&gt;Notice the two appearences of &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;order&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`order` &lt;/span&gt;above. The first one, &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop4&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop4&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;order&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;order` &lt;/span&gt;sorts the objects, the second, &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop4&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop4&lt;/span&gt;.group.&lt;span class=&#39;diffremoved&#39;&gt;order&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;order` &lt;/span&gt;sorts the grouped objects, that Helma will create as a result of the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;group&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`group` &lt;/span&gt;entry. With this it&#39;s also possible to sort the grouped objects ascending, but the contents of the grouped objects descending.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;93&lt;/td&gt;&lt;td&gt;The &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;prop4&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`prop4&lt;/span&gt;.group.&lt;span class=&#39;diffremoved&#39;&gt;prototype&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;prototype` &lt;/span&gt;property sets the Prototype to be used for the group objects generated by Helma.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;95&lt;/td&gt;&lt;td&gt;Filters can contain references to the values of the current object&#39;s database entry fields. This is the syntax for these variables: &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;${FIELD_NAME}&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`${FIELD_NAME}`&lt;/span&gt;. The variables are then replaced by the actual values of the fields before the query is executed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;97&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop4 = collection (protoype) &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;98&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;prop4.filter = FOREIGN_DB_COLUMN = ${LOCAL_DB_COLUMN}&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;99&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;filter.additionalTables&amp;lt;/tt&amp;gt; allows adding additional tables to the query,&lt;/span&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;so that their fields can be used in the condition of the filter as well.&lt;/span&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;The table of the collection&#39;s prototype is allways the first table in the query.&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; prop4 = collection (protoype) &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;100&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;Table references can be aliased using &amp;lt;tt&amp;gt;TABLE_NAME AS ALIAS_NAME&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TABLE_NAME ALIAS_NAME&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop4&lt;/span&gt;.&lt;span class=&#39;diffadded&#39;&gt;filter = FOREIGN_DB_COLUMN = ${LOCAL_DB_COLUMN}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;101&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;#Node is stored &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`filter.additionalTables` allows adding additional tables to the query, so that their fields can be used &lt;/span&gt;in &lt;span class=&#39;diffremoved&#39;&gt;in &lt;/span&gt;the &lt;span class=&#39;diffremoved&#39;&gt;database &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;condition of the filter as well. The &lt;/span&gt;table &lt;span class=&#39;diffremoved&#39;&gt;NODE&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;of the collection&#39;s prototype is allways the first table in the query. Table references can be aliased using `TABLE_NAME AS ALIAS_NAME` or `TABLE_NAME ALIAS_NAME`.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;103&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;#subChildren &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; #Node &lt;/span&gt;is &lt;span class=&#39;diffremoved&#39;&gt;a collection containing all &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;stored in in &lt;/span&gt;the &lt;span class=&#39;diffremoved&#39;&gt;Node&#39;s children&#39;s children:&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;database table NODE&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;104&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;subChildren =&lt;/span&gt;&amp;nbsp;&lt;span class=&#39;diffremoved&#39;&gt;collection(Node)&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;  #subChildren is a collection containing all the Node&#39;s children&#39;s children:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;105&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;subChildren.filter.additionalTables &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; subChildren &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;NODE AS CHILDREN&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;collection(Node)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;106&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;subChildren.&lt;span class=&#39;diffremoved&#39;&gt;filter = NODE&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;filter&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;FOREIGN_DB_COLUMN &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;additionalTables &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;${LOCAL_DB_COLUMN} AND NODE.LOCAL_DB_COLUMN = &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;NODE AS &lt;/span&gt;CHILDREN&lt;span class=&#39;diffremoved&#39;&gt;.FOREIGN_DB_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;107&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; subChildren.filter = NODE.FOREIGN_DB_COLUMN = ${LOCAL_DB_COLUMN} AND NODE.LOCAL_DB_COLUMN = CHILDREN.FOREIGN_DB_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;105&lt;/td&gt;&lt;td&gt;Another example: Short arrays of objects of which the sequence can be changed without using a position field for each object can be created with the SQL statements &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;ID_FIELD &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`ID_FIELD &lt;/span&gt;IN &lt;span class=&#39;diffremoved&#39;&gt;(ID_LIST)&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;(ID_LIST)` &lt;/span&gt;and &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;FIND_IN_SET(ID_FIELD&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`FIND_IN_SET(ID_FIELD&lt;/span&gt;, &lt;span class=&#39;diffremoved&#39;&gt;ID_LIST)&amp;lt;/tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;ID_LIST)`&lt;/span&gt;, &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;ID_LIST&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`ID_LIST` &lt;/span&gt;being a string field that contains the IDs seperated by commas. This comes in handy when the objects are used in more than one such array and the objects stored in such a way should know about all their referencing objects.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;107&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;#Object1/type&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;**Object1/type&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;properties&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;properties**:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;109&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;#the id list string containing a comma seperated list of OBJECT2 ids:&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;110&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;strObject2Ids = OBJECT2_IDS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;111&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;#object2s lists the Object2 objects as referenced by strObject2Ids:&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;112&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;object2s = collection(Object2)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;113&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;object2s.filter = OBJECT2.ID IN (${OBJECT1.OBJECT2_IDS})&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;113&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;#Object2/type&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;**Object2/type&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;properties&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;properties**:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;115&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;#object1s lista all Object1 objects that are referencing this Object2 through their object2s collection:&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;116&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;object1s = collection(Object1)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;117&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;object1s.filter.additionalTables = OBJECT2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;118&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;object1s.filter = OBJECT2.ID = ${ID} AND FIND_IN_SET(OBJECT2.ID, OBJECT1.&lt;span class=&#39;diffremoved&#39;&gt;OBJECT2_IDS)&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;OBJECT2_IDS)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;117&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Additional Join Conditions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;121&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;prop4&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; prop4&lt;/span&gt;.local.1 = FIRST_LOCAL_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;122&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.foreign.1 = FIRST_FOREIGN_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;123&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.local.2 = SECOND_LOCAL_COLUMN &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;124&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;prop4.foreign.2 = &lt;span class=&#39;diffremoved&#39;&gt;SECOND_FOREIGN_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;SECOND_FOREIGN_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;123&lt;/td&gt;&lt;td&gt;Whenever one specifies more than one restraint, the use of &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;[Number]&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;number suffix &lt;/span&gt;is mandatory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;125&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Mountpoint Mappings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;127&lt;/td&gt;&lt;td&gt;Mountpoints provide a simple way to directly attach a prototype to the URL path. If the path contains the name of a mountpoint the prototype&#39;s objects are accessible simply by adding their id (or a property defined by &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;_accessname&amp;lt;/tt&amp;gt;) &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;_accessname`) &lt;/span&gt;to the URL string.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;129&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;pre&amp;gt;myMountpoint &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp; &amp;nbsp; myMountpoint &lt;/span&gt;= &lt;span class=&#39;diffremoved&#39;&gt;mountpoint(myProto)&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;mountpoint(myProto)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;131&lt;/td&gt;&lt;td&gt;In the example above, the path &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;/myMountpoint/23/test&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`/myMountpoint/23/test` &lt;/span&gt;refers to the action &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;test&lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`test&lt;/span&gt;.&lt;span class=&#39;diffremoved&#39;&gt;hac&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;hac` &lt;/span&gt;of the object with id 23, which is derived from the &lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;tt&amp;gt;myProto&amp;lt;/tt&amp;gt; &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;`myProto` &lt;/span&gt;prototype.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;133&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;=== &lt;/span&gt;&lt;span class=&#39;diffadded&#39;&gt;### &lt;/span&gt;Advanced Settings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;140&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;144&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;150&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;151&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;154&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffremoved&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description>
<pubDate>Mon, 21 Sep 2009 15:21:14 +0000</pubDate>
<author>hannes</author>
</item>
<item>
<title>Version 3</title>
<link>http://helma.org/Documentation/Object-Relational+Mapping/history.diff?v=3</link>
<description>&lt;ul class=&#39;diffproperties&#39;&gt;&lt;li&gt;Changed &lt;span class=&#39;diffpropname&#39;&gt;tags&lt;/span&gt; to &lt;span class=&#39;diffadded&#39;&gt;hopobject, ORM, Documentation&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;</description>
<pubDate>Wed, 18 Feb 2009 17:43:37 +0000</pubDate>
<author>hannes</author>
</item>
<item>
<title>Version 2</title>
<link>http://helma.org/Documentation/Object-Relational+Mapping/history.diff?v=2</link>
<description>&lt;ul class=&#39;diffproperties&#39;&gt;&lt;li&gt;Set &lt;span class=&#39;diffpropname&#39;&gt;tags&lt;/span&gt; to &lt;span class=&#39;diffadded&#39;&gt;hopobject, ORM&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#39;diffbody&#39;&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;36&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The &amp;lt;tt&amp;gt;_db&amp;lt;/tt&amp;gt; entry describes the database to use for storing objects of this type. &amp;lt;tt&amp;gt;dbname&amp;lt;/tt&amp;gt; is the name of a database as defined in the &amp;lt;tt&amp;gt;db.properties&amp;lt;/tt&amp;gt; file. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;37&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;38&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_db = dbname&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;39&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;40&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The &amp;lt;tt&amp;gt;_table&amp;lt;/tt&amp;gt; entry tells Helma which table to use for objects of this type within the database. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;41&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;42&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_table = TABLENAME&amp;lt;/pre&amp;gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;43&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;44&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The &amp;lt;tt&amp;gt;_id&amp;lt;/tt&amp;gt; entry defines the column to use as primary key. Helma requires a single primary key with no other functionality. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;45&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;46&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_id = ID_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;47&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;48&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The optional &amp;lt;tt&amp;gt;_name&amp;lt;/tt&amp;gt; entry tells Helma which database column to use as object name. This is important for the user prototype, since it defines which column constitutes the user name. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;49&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;50&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_name = NAME_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;51&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;52&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The &amp;lt;tt&amp;gt;_parent&amp;lt;/tt&amp;gt; entry contains a comma-separated list of properties of objects of this type to be used as parent. Objects must know their parent in order to generate correct URLs in their &amp;lt;tt&amp;gt;href()&amp;lt;/tt&amp;gt; function. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;53&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;54&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_parent = property1, property2.collectionX, root.collectionY&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;55&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;56&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;If an entry in the _parent item does not contain a dot, it is interpreted as an object property of the current object that acts as the object&#39;s parent. If an entry contains a dot character, the part after the dot is interpreted as a collection in the parent object in which the current object is contained. If the _parent is specified as &amp;quot;root&amp;quot;, it is not interpreted as a property of the current object. Instead, the application&#39;s root object is used as parent object.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;57&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;58&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;A type can inherit its data mapping and functions from another type. This is done with the &amp;lt;tt&amp;gt;_extends&amp;lt;/tt&amp;gt; entry. Simply specify the name of the parent type:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;59&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;60&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_extends = parenttype&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;61&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;62&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Extended prototypes are usually stored in the same relational database table. Thus, Helma needs a way to tell which row in the table should be instantiated with which object prototype. This is done using the &amp;lt;tt&amp;gt;_prototype&amp;lt;/tt&amp;gt; entry, specifying a column in the table containing the name of the prototype for each row.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;63&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;64&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_prototype = PROTO_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;65&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;39&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The mappings for simple properties (versus properties that are objects containing further properties) simply map a property name of the specified object type to a column of the relational database table. The type of the property or column need not be specified. Helma does all necessary conversion when reading or writing a property value. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;40&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;41&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop1 = DB_COLUMN_1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;42&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop2 = DB_COLUMN_2&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;43&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;44&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;To prevent a property from being overwritten by the application it can be made readonly.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;45&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;46&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop1.readonly = true&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;47&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;48&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;In a similar manner marking a property as private will prevent any corresponding collection or reference from being updated but still perform all necessary updates in the database.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;49&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;50&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop1.private = true&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;51&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;42&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Properties that contain other objects are defined by the object keyword and the prototype name of the referenced object in brackets. The object reference is resolved via two entries: &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;43&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;44&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop3 = object (protoype) &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;45&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop3.local = LOCAL_DB_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;46&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop3.foreign = FOREIGN_DB_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;47&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;48&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;tt&amp;gt;prop3.local&amp;lt;/tt&amp;gt; specifies the part of the reference in the local database-table, &amp;lt;tt&amp;gt;prop3.foreign&amp;lt;/tt&amp;gt; the column in the table where objects of the referenced prototype are stored. By executing the assignment &amp;lt;tt&amp;gt;obj.prop3 = someObject&amp;lt;/tt&amp;gt;, the database-column specified by &amp;lt;tt&amp;gt;prop3.local&amp;lt;/tt&amp;gt; will be set to the value of &amp;lt;tt&amp;gt;FOREIGN_DB_COLUMN&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; if &amp;lt;tt&amp;gt;someObject == null&amp;lt;/tt&amp;gt;.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;49&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;45&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The following section describes the entries used to define collections of objects. There are two kinds of collections: First, every object can itself act as a collection, and second, it can define additional properties to be used as collections. Direct descendents are defined with entries starting with &amp;lt;tt&amp;gt;_children&amp;lt;/tt&amp;gt;, while additional collections are defined using their property name. Otherwise the syntax for the two is the same. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;46&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;47&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The following are examples for simple collection mappings for both the direct descendants and those contained in a collection-property called &amp;lt;tt&amp;gt;prop4&amp;lt;/tt&amp;gt;. The &amp;lt;tt&amp;gt;.foreign&amp;lt;/tt&amp;gt; entry is used in both cases to specify a column in the foreign table used to collect the objects. Exactly those objects will be collected whose &amp;lt;tt&amp;gt;FOREIGN_DB_COLUMN&amp;lt;/tt&amp;gt; value equals the &amp;lt;tt&amp;gt;LOCAL_DB_COLUMN&amp;lt;/tt&amp;gt; value of the object holding the collection. Leaving away &amp;lt;tt&amp;gt;.local&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.foreign&amp;lt;/tt&amp;gt; creates a collection of all available objects of the specified prototype. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;48&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;49&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;_children = collection (protoype) &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;50&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;_children.local = LOCAL_DB_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;51&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;_children.foreign = FOREIGN_DB_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;52&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;53&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4 = collection (protoype) &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;54&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.local = LOCAL_DB_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;55&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.foreign = FOREIGN_DB_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;56&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;57&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;By executing &amp;lt;tt&amp;gt;obj.add(otherObj)&amp;lt;/tt&amp;gt; resp. &amp;lt;tt&amp;gt;obj.prop4.add(otherObj)&amp;lt;/tt&amp;gt;, the &amp;lt;tt&amp;gt;FOREIGN_DB_COLUMN&amp;lt;/tt&amp;gt; will be set to the value of &amp;lt;tt&amp;gt;LOCAL_DB_COLUMN&amp;lt;/tt&amp;gt;. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;58&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;59&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;By default, child objects can be accessed from the containing parent object through their index-position or &amp;lt;tt&amp;gt;ID&amp;lt;/tt&amp;gt; value. Additionally the entry &amp;lt;tt&amp;gt;.accessname&amp;lt;/tt&amp;gt; can be used to specify a database column in the child table. The value of this column will be used as name of the objects contained in this collection. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;60&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;61&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop4.accessname = DB_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;62&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;63&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;With the above mapping, an object contained in the &amp;lt;tt&amp;gt;prop4&amp;lt;/tt&amp;gt; collection with a &amp;lt;tt&amp;gt;DB_COLUMN&amp;lt;/tt&amp;gt; value of &amp;quot;xyz&amp;quot; would be reachable as &amp;lt;tt&amp;gt;this.prop4.xyz&amp;lt;/tt&amp;gt; from the containing object. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;64&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;65&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt; can be used to add an additional condition for the selection of objects which is not dependent on the object holding the collection. &amp;lt;tt&amp;gt;order&amp;lt;/tt&amp;gt; contains the sorting to be applied to the child objects. &amp;lt;tt&amp;gt;group&amp;lt;/tt&amp;gt; tells Helma to group the objects in the collection according to the value in &amp;lt;tt&amp;gt;DB_GROUPCOLUMN&amp;lt;/tt&amp;gt;. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;66&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;67&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop4.filter = DB_FILTERCOLUMN is not null &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;68&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.order = DB_ORDERCOLUMN desc &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;69&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.group = DB_GROUPCOLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;70&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.group.order = DB_GROUPORDERCOLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;71&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.group.prototype = SomePrototype&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;72&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;73&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Notice the two appearences of &amp;lt;tt&amp;gt;order&amp;lt;/tt&amp;gt; above. The first one, &amp;lt;tt&amp;gt;prop4.order&amp;lt;/tt&amp;gt; sorts the objects, the second, &amp;lt;tt&amp;gt;prop4.group.order&amp;lt;/tt&amp;gt; sorts the grouped objects, that Helma will create as a result of the &amp;lt;tt&amp;gt;group&amp;lt;/tt&amp;gt; entry. With this it&#39;s also possible to sort the grouped objects ascending, but the contents of the grouped objects descending.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;74&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;75&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The &amp;lt;tt&amp;gt;prop4.group.prototype&amp;lt;/tt&amp;gt; property sets the Prototype to be used for the group objects generated by Helma.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;76&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;77&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Filters can contain references to the values of the current object&#39;s database entry fields. This is the syntax for these variables: &amp;lt;tt&amp;gt;${FIELD_NAME}&amp;lt;/tt&amp;gt;. The variables are then replaced by the actual values of the fields before the query is executed.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;78&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;With these variables, the above collection could also be described like this:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;79&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop4 = collection (protoype) &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;80&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.filter = FOREIGN_DB_COLUMN = ${LOCAL_DB_COLUMN}&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;81&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;82&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;tt&amp;gt;filter.additionalTables&amp;lt;/tt&amp;gt; allows adding additional tables to the query, so that their fields can be used in the condition of the filter as well. The table of the collection&#39;s prototype is allways the first table in the query.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;83&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Table references can be aliased using &amp;lt;tt&amp;gt;TABLE_NAME AS ALIAS_NAME&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;TABLE_NAME ALIAS_NAME&amp;lt;/tt&amp;gt;.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;84&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;85&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;#Node is stored in in the database table NODE&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;86&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;87&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;#subChildren is a collection containing all the Node&#39;s children&#39;s children:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;88&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;subChildren = collection(Node)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;89&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;subChildren.filter.additionalTables = NODE AS CHILDREN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;90&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;subChildren.filter = NODE.FOREIGN_DB_COLUMN = ${LOCAL_DB_COLUMN} AND NODE.LOCAL_DB_COLUMN = CHILDREN.FOREIGN_DB_COLUMN&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;91&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;92&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;93&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Another example: Short arrays of objects of which the sequence can be changed without using a position field for each object can be created with the SQL statements &amp;lt;tt&amp;gt;ID_FIELD IN (ID_LIST)&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;FIND_IN_SET(ID_FIELD, ID_LIST)&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ID_LIST&amp;lt;/tt&amp;gt; being a string field that contains the IDs seperated by commas. This comes in handy when the objects are used in more than one such array and the objects stored in such a way should know about all their referencing objects.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;94&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;95&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;#Object1/type.properties&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;96&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;97&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;#the id list string containing a comma seperated list of OBJECT2 ids:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;98&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;strObject2Ids = OBJECT2_IDS&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;99&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;100&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;#object2s lists the Object2 objects as referenced by strObject2Ids:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;101&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;object2s = collection(Object2)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;102&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;object2s.filter = OBJECT2.ID IN (${OBJECT1.OBJECT2_IDS})&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;103&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;104&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;#Object2/type.properties&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;105&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;106&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;#object1s lista all Object1 objects that are referencing this Object2 through their object2s collection:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;107&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;object1s = collection(Object1)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;108&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;object1s.filter.additionalTables = OBJECT2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;109&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;object1s.filter = OBJECT2.ID = ${ID} AND FIND_IN_SET(OBJECT2.ID, OBJECT1.OBJECT2_IDS)&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;110&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;48&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;For both object and collection mappings, it is possible to provide any number of additional restraints used to join the local with the other table to further limit the selected objects. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;49&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;50&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;prop4.local.1 = FIRST_LOCAL_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;51&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.foreign.1 = FIRST_FOREIGN_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;52&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.local.2 = SECOND_LOCAL_COLUMN &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;53&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;prop4.foreign.2 = SECOND_FOREIGN_COLUMN&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;54&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;55&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Whenever one specifies more than one restraint, the use of &amp;lt;tt&amp;gt;.[Number]&amp;lt;/tt&amp;gt; is mandatory.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;56&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;51&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Mountpoints provide a simple way to directly attach a prototype to the URL path. If the path contains the name of a mountpoint the prototype&#39;s objects are accessible simply by adding their id (or a property defined by &amp;lt;tt&amp;gt;._accessname&amp;lt;/tt&amp;gt;) to the URL string.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;52&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;53&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;pre&amp;gt;myMountpoint = mountpoint(myProto)&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;54&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;55&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;In the example above, the path &amp;lt;tt&amp;gt;/myMountpoint/23/test&amp;lt;/tt&amp;gt; refers to the action &amp;lt;tt&amp;gt;test.hac&amp;lt;/tt&amp;gt; of the object with id 23, which is derived from the &amp;lt;tt&amp;gt;myProto&amp;lt;/tt&amp;gt; prototype.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;56&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;54&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Some techniques to optimize Helma&#39;s strategy for managing objects from a relational table.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;56&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;_children.loadmode=aggressive&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;57&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dd&amp;gt;When this is set for _children or a virtual node, all child objects will be fetched in one query. The default way is to just fetch an index of children consisting of the object&#39;s keys, and then fetch the objects on demand, which allows the Hop to scale to large child collections where only few of the objects are actually accessed.&amp;lt;/dd&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;58&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;59&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;60&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;_children.cachemode=aggressive&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;61&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dd&amp;gt;By default, Hop refreshes a children index when any object with the prototype contained in the subnodes was modified since the last access. By setting this flag on _children or a virtual node, children will only be refreshed when an object is added to or removed from the child collection itself, or an object already contained in it is modified.&amp;lt;/dd&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;62&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;63&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;64&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;_children.maxsize=XX&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;65&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dd&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;66&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;When specifying children (either directly or within a virtual container) an optional maxsize property can be used to limit the number of objects contained. A setting of e.g. 100 would cause the collection to contain maximally 100 objects, regardless of how many (matching) rows the database table contains.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;67&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;/dd&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;68&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;69&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;70&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;71&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;propname.readonly=true&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;72&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dd&amp;gt;Use the readonly flag to tell the Hop never to update this column in the database. Actually the column won&#39;t be updated if the property is not modified, but this is like an extra layer of security.&amp;lt;/dd&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;73&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;74&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;75&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;propname.private=true&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;76&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;dd&amp;gt;The readonly flag tells Hop to update this column in the database only, but to prevent any collections containing or any other object referring to the very object with that property.&amp;lt;/dd&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;77&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;lt;/dl&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description>
<pubDate>Tue, 17 Feb 2009 22:23:02 +0000</pubDate>
<author>hannes</author>
</item>
<item>
<title>Version 1</title>
<link>http://helma.org/Documentation/Object-Relational+Mapping/history.diff?v=1</link>
<description>&lt;ul class=&#39;diffproperties&#39;&gt;&lt;li&gt;Set &lt;span class=&#39;diffpropname&#39;&gt;tags&lt;/span&gt; to &lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#39;diffbody&#39;&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;1&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Helma 1 comes with its own home-grown Object-Relational Mapping framework. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;2&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;3&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Overview&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;4&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;5&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;Helma O/R maps rows from relational tables against JavaScript host objects called *HopObjects*. HopObjects are defined by prototype directories, which contain the JavaScript code and templates (called *skins* in Helma lingo) to be applied to them. The object-relational mapping itself is defined in a type.properties file, which may look like this:&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;6&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;7&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; _db = antville&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;8&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; _table = AV_TEXT&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;9&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;10&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; _parent = site.stories&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;11&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; _id = TEXT_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;12&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; _prototype = TEXT_PROTOTYPE&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;13&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;14&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; # object references&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;15&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; creator = object (user)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;16&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; creator.local = TEXT_F_USER_CREATOR&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;17&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; creator.foreign = USER_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;18&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;19&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; # primitive properties&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;20&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; title = TEXT_TITLE&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;21&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; text = TEXT_TEXT&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;22&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; createtime = TEXT_CREATETIME&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;23&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; modifytime = TEXT_MODIFYTIME&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;24&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;25&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; # collections&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;26&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; comments = collection (comment)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;27&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; comments.local = TEXT_ID&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;28&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; comments.foreign = TEXT_F_TEXT_STORY&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;29&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; comments.filter = TEXT_ISONLINE &amp;gt; 0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;30&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt; comments.order = TEXT_MODIFYTIME DESC&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;31&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;32&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;The different kinds of entries and their use are described below.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;33&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;34&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Basic Mappings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;35&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;36&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Simple Property Mappings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;37&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;38&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Object Reference Mappings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;39&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;40&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Collection Mappings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;41&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;42&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Additional Join Conditions&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;43&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;44&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Mountpoint Mappings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;45&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;46&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;=== Advanced Settings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:2em; color:#999;&quot;&gt;47&lt;/td&gt;&lt;td&gt;&lt;span class=&#39;diffadded&#39;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description>
<pubDate>Tue, 17 Feb 2009 22:17:58 +0000</pubDate>
<author>hannes</author>
</item>
</channel>
</rss>

