Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

datasourcedataconnection

Properties

Name

Type

Required

Description

datasource

ref urn:com.cohga.server.datasource.jdbc#1.0:datasource

yes

reference to the data source that this data definition should use to generate its data

table

string

yes

The name of the table that provides the data

key

string

no

If this data definition is generating data relating to an entity then this is the column name that contains the entities id

prefix

string

no

The prefix value will be inserted into the generated SQL statement immediately after the SELECT, for example DISTINCT

trim

boolean

no

If true the generated SQL will ensure that the id's are compared against a trimmed version of the id stored in the database.
This helps with systems like Pathway, where some tables store padded id's

...

keytable

Name

string

Type

Cardinality

parameter

urn:com.cohga.server.data.database#1.0:parameter

0..n

cache

urn:com.cohga.server.cache#1.0:cache

0..1

Content

None

Notes

  • The cache settings are only used for data source data connections that have a key specified, since it's the key that's used as the cache index
  • If no cache tag is specified then the data will still be cached, but it will use the default cache configuration, to disable caching you need to set disable to true inside the cache definition
  • If no parameters are specified then the server will generate parameters based on the columns in the underlying table, in this case you should also not include any from tags since joins are not supported, where tags are ok though.

...

parameter

Properties

Name

Type

Required

Description

column

string

yes

The name of the column within the table that this parameter references (can be an sql function also)

type

'string', 'numeric', 'date' or 'url'

no (default 'string')

An indicator of how the data should be displayed on the client

name

string

no (default lowercase value of column)

A unique identifier for the parameter

label

string

no (default 'pretty' value of column)

A user displayable label for the column

text

string

no

Only when type is 'url'. Specifies text to be displayed to the user instead of the actual url contents

textcolumn

string

no

Only when type is 'url'. Specifies the column that contains text to be displayed to the user instead of the actual url contents

Sub-tags

Name

Type

Cardinality

from

urn:com.

no

An optional database table that will be used to store entity keys temporarily when performing the required SQL to generate the data for this data connection. If this option isn't set then the SQL used to generate the data will create the data in batches, which can cause issues with sorting, optionally you can create a simple two column table, with an index on the userid column, and set this value to the name of this table, then Weave will insert the entity id's into this table temporarily and use this table in a SQL join when generating the data. This will resolve any sorting issues, and is more important if caching is also disabled for the data connection.

keycolumn

string

no

The column in keytable that contains the entity id, default is key

usercolumn

string

no

The column in keytable that contains the userid, default is userid

Sub-tags

Content

None

Notes

  • If no label

    The cache settings are only used for data source data connections that have a key specified, since it's the key that's used as the cache index

  • If no cache tag is specified then

    it

    the data will still be

    generated by formatting the name, unless no name is supplied, then it will be generated by formatting the column
  • Formatting involves converting any _'s to spaces, converting the first letter and any letter after a space to upper case and converting every other letter to lower case, e.g. "BOMB_DISPOSAL_METHOD" becomes "Bomb Disposal Method"
  • Only one of text or textcolumn should be specified when type is 'url'

...

from

Properties

Name

Type

Required

Description

table

string

yes

An additional table to include in the generated SQL

Sub-tags

None

Content

None

...

where

  • cached, but it will use the default cache configuration, to disable caching you need to set disable to true inside the cache definition (see example below).

  • You can completely disable the caching (for all data definitions that don't have cache setting explicitly set) by setting the startup parameter weave.cache.default to true (in startup.cmd, startup.sh and/or weave-service.conf).

  • If no parameters are specified then the server will generate parameters based on the columns in the underlying table, in this case you should also not include any from tags since joins are not currently supported, where tags are ok though.

Anchor
parameter
parameter

parameter

Properties

Name

Type

Required

Default

Description

clause

column

string

yes

An additional clause to include in the generated SQL

uppercase

boolean

no

If the clause uses parameter substitution should the value be converted to upper-case before being substituted

Sub-tags

None

Content

None

Examples

...


<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT"/>
</data:datadefinition>
Note

In the following examples the || operator is used to concatenate strings, this operator is Oracle specific, and my require using a different operator for other databases, for example +

...


<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID"/>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suffix" label="Suffix" column="RD_SUFFIX"/>
		<parameter name="type" label="Type" column="RD_TYPE"/>
		<parameter name="altname" label="Alt. Name" column="ALT_NAME"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX"/>
		<parameter name="alttype" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="class" label="Class" column="CLASS_CODE"/>
		<parameter type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<cache>
			<maxElementsInMemory>500</maxElementsInMemory>
			<eternal>false</eternal>
			<timeToIdleSeconds>60</timeToIdleSeconds>
			<timeToLiveSeconds>300</timeToLiveSeconds>
			<overflowToDisk>true</overflowToDisk>
			<maxElementsOnDisk>20000</maxElementsOnDisk>
			<diskPersistent>false</diskPersistent>
			<diskExpiryThreadIntervalSeconds>120</diskExpiryThreadIntervalSeconds>
			<memoryStoreEvictionPolicy>LRU</memoryStoreEvictionPolicy>
		</cache>
	</datasourcedataconnection>
</data:datadefinition>

...


The name of the column within the table that this parameter references (can be an sql function also)

type

'string', 'numeric', 'date' or 'url'

no

'string'

An indicator of how the data should be displayed on the client

name

string

no

lowercase value of column

A unique identifier for the parameter

label

string

no

"pretty" value of column

A user displayable label for the column

text

string

no


Only when type is 'url'. Specifies text to be displayed to the user instead of the actual url contents

textcolumn

string

no


Only when type is 'url'. Specifies the column that contains text to be displayed to the user instead of the actual url contents

format

string

no

"date", "time" or "datetime"

When the type attribute is date this value can force the value to be formatted as as specific date type.

Sub-tags

Content

None

Notes

  • If no label is specified then it will be generated by formatting the name, unless no name is supplied, then it will be generated by formatting the column

  • Formatting involves converting any _'s to spaces, converting the first letter and any letter after a space to upper case and converting every other letter to lower case, e.g. "BOMB_DISPOSAL_METHOD" becomes "Bomb Disposal Method"

  • Only one of text or textcolumn should be specified when type is 'url'

Anchor
from
from

from

Properties

Name

Type

Required

Description

table

string

yes

An additional table to include in the generated SQL

Sub-tags

None

Content

None

Anchor
where
where

where

Properties

Name

Type

Required

Description

clause

string

yes

An additional clause to include in the generated SQL

uppercase

boolean

no

If the clause uses parameter substitution should the value be converted to upper-case before being substituted

Sub-tags

None

Content

None

sort

Properties

Name

Type

Required

Description

parameter

string

yes

Name of parameter to sort on

direction

string

no

ASC or DESC, ASC is default

Sub-tags

None

Content

None

join

Only available in 2.5.11 or later

properties

Name

Type

Required

Description

table

string

yes

The table to join to

on

string

yes

The clause used to join the table

type

string

no

The type of join to use

clause

string

no

Additional clauses that can be added to the join

options

Properties

Name

Type

Required

Description

rpad

number

no

If the key value needs to be padded with spaces on the right to make it match the database, this specifies the total length of the final padded value.

For example rpad = 10 would change a key value from "value" to "value....." (where each . is a space).

lpad

number

no

If the key value needs to be padded with spaces on the left to make it match the database, this specifies the total length of the final padded value.

For example lpad = 10 would change a key value from "value" to ".....value" (where each . is a space).

trim

boolean

no

If a key value needs to be trimmed of spaces before being used setting this to true will cause that to be done.

maxrows

number

no

Limit the number of rows that will be extracted from the database when generating the data.

failOnSubstitutionError

boolean

no

If set to true, or not set at all, this flag will force the generation of the data to fail if there is an issue with performing parameter substitution.

If this is set to false then a where clause that fails parameter substitution will be ignored.

The default value for this flag if it is not set is true.

timeout

number

no

The number of milliseconds before the SQL should be cancelled. Default 120000, can be disabled by setting to 0, can be changed globally by setting the system property weave.data.timeout. Also, the system property weave.data.mimimumtimeout specifies a minimum value, currently 5000, that if the timeout is set greater than 0 but less than this value it will be increased to be this value.

Sub-tags

None

Content

None


Examples

Basic data definition where output is based on columns in the underlying table
Code Block
languagexml
<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT"/>
</data:datadefinition>


Note

In the following examples the || operator is used to concatenate strings, this operator is Oracle specific, and my require using a different operator for other databases, for example +


Sample data definition with caching parameters explicitly set
Code Block
languagexml
<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID"/>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suffix" label="Suffix" column="RD_SUFFIX"/>
		<parameter name="type" label="Type" column="RD_TYPE"/>
		<parameter name="altname" label="Alt. Name" column="ALT_NAME"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX"/>
		<parameter name="alttype" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="class" label="Class" column="CLASS_CODE"/>
		<parameter type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<cache>
			<maxElementsInMemory>500</maxElementsInMemory>
			<eternal>false</eternal>
			<timeToIdleSeconds>60</timeToIdleSeconds>
			<timeToLiveSeconds>300</timeToLiveSeconds>
			<overflowToDisk>true</overflowToDisk>
			<maxElementsOnDisk>20000</maxElementsOnDisk>
			<diskPersistent>false</diskPersistent>
			<diskExpiryThreadIntervalSeconds>120</diskExpiryThreadIntervalSeconds>
			<memoryStoreEvictionPolicy>LRU</memoryStoreEvictionPolicy>
		</cache>
	</datasourcedataconnection>
</data:datadefinition>


Sample data definition with caching disabled
Code Block
languagexml
<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID"/>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suffix" label="Suffix" column="RD_SUFFIX"/>
		<parameter name="type" label="Type" column="RD_TYPE"/>
		<parameter name="altname" label="Alt. Name" column="ALT_NAME"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX"/>
		<parameter name="alttype" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="class" label="Class" column="CLASS_CODE"/>
		<parameter type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<cache disable="true"/>
	</datasourcedataconnection>
</data:datadefinition>


Sample data definition with caching parameters supplied by a cache configuration (so the cache definition can be reused)
Code Block
languagexml
<data:cache id="test.cache">
	<maxElementsInMemory>500</maxElementsInMemory>
	<eternal>false</eternal>
	<timeToIdleSeconds>60</timeToIdleSeconds>
	<timeToLiveSeconds>300</timeToLiveSeconds>
	<overflowToDisk>true</overflowToDisk>
	<maxElementsOnDisk>20000</maxElementsOnDisk>
	<diskPersistent>false</diskPersistent>
	<diskExpiryThreadIntervalSeconds>120</diskExpiryThreadIntervalSeconds>
	<memoryStoreEvictionPolicy>LRU</memoryStoreEvictionPolicy>
</data:cache>

<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID"/>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suffix" label="Suffix" column="RD_SUFFIX"/>
		<parameter name="type" label="Type" column="RD_TYPE"/>
		<parameter name="altname" label="Alt. Name" column="ALT_NAME"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX"/>
		<parameter name="alttype" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="class" label="Class" column="CLASS_CODE"/>
		<parameter type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<cache id="test.cache"/>
	</datasourcedataconnection>
</data:datadefinition>


A data definition for supplying a list of values (no key is defined), probably for a cascading input parameter for a search
Code Block
languagexml
<data:datadefinition id="suburbRoads">
	<datasourcedataconnection datasource="datasource.main" table="PROPERTY" prefix="DISTINCT">
		<parameter name="suburb" label="Suburb" column="PRSUB_NAME"/>
		<parameter name="roadname" label="Road Name" column="PRROD_NAME"/>
	</datasourcedataconnection>
</data:datadefinition>


Another data definition for supplying a list of values, probably for a triple field cascading input parameter for a search
Code Block
languagexml
<data:datadefinition id="suburbRoadType">
	<datasourcedataconnection datasource="datasource.main" table="PROPERTY" prefix="DISTINCT">
		<parameter name="suburb" label="Suburb" column="PRSUB_NAME"/>
		<parameter name="roadname" label="Road Name" column="PRROD_NAME"/>
		<parameter name="roadtype" label="Road Type" column="PRROD_TYPE"/>
	</datasourcedataconnection>
</data:datadefinition>


Set a timeout for a data definition
Code Block
languagexml
<data:datadefinition id="suburbRoadType">
	<datasourcedataconnection datasource="datasource.main" table="PROPERTY" prefix="DISTINCT">
		<parameter name="suburb" label="Suburb" column="PRSUB_NAME"/>
		<parameter name="roadname" label="Road Name" column="PRROD_NAME"/>
		<parameter name="roadtype" label="Road Type" column="PRROD_TYPE"/>
		<options>
			<timeout>15000</timeout>
		</options>
	</datasourcedataconnection>
</data:datadefinition>

More on Caching

To disable the caching all together you'd do the following

Code Block
languagexml
<data:datadefinition id="...">
	<datasourcedataconnection ...>
		...
		<cache disable="true"/>
	</datasourcedataconnection>
</data:datadefinition>

To modify the default caching options

Code Block
languagexml
<data:datadefinition id="...">
		<datasourcedataconnection ...>
		...
		<cache>
			<setting>value</setting>
			<setting>value</setting>
			<setting>value</setting>
		</cache>
	</datasourcedataconnection>
</data:datadefinition>

Where the <settings> you can change are identified at caching

You can set the default cache settings with

Code Block
languagexml
<data:cache>
	<setting>value</setting>
	<setting>value</setting>
	<setting>value</setting>
</data:cache>

and create a cache definition that can be re-used

Code Block
languagexml
<data:cache id="test">
	<setting>value</setting>
	<setting>value</setting>
	<setting>value</setting>
</data:cache>

<data:datadefinition id="...">
	<datasourcedataconnection ...>
		...
		<cache id="test"/>
	</datasourcedataconnection>
</data:datadefinition>


Info

Note that prior to Weave 2.5.18 the default cache setting for a datasource data connection was to cache the information forever, as of 2.5.18 the data will only be cached for 5 minutes by default.

Using a temporary table

Using a temporary table
Code Block
languagexml
<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT" keytable="ROADS_SELECTION" keycolumn="RD_NAME" usercolumn="UID">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID"/>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suffix" label="Suffix" column="RD_SUFFIX"/>
		<parameter name="type" label="Type" column="RD_TYPE"/>
		<parameter name="namealtname" label="Alt. Name" column="RDALT_NAME"/>
		<parameter name="suffixaltsuffix" label=""Alt. Suffix" column="RDALT_SUFFIX"/>
		<parameter name="typealttype" label="Alt. Type" column="RDALT_TYPE"/>
		<parameter type="integer" name="altnameclass" label="Alt. NameClass" column="ALTCLASS_NAMECODE"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<parameter<cache namedisable="alttypetrue" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="class" label="Class" column="CLASS_CODE"/>
		<parameter type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<cache disable="true"/>
	</datasourcedataconnection>
</data:datadefinition>
Code Block
xmlxml
titleSample data definition with caching parameters supplied by a cache configuration (so the cache definition can be reused)
linenumberstrue

<data:cache id="test.cache">
	<maxElementsInMemory>500</maxElementsInMemory>
	<eternal>false</eternal>
	<timeToIdleSeconds>60</timeToIdleSeconds>
	<timeToLiveSeconds>300</timeToLiveSeconds>
	<overflowToDisk>true</overflowToDisk>
	<maxElementsOnDisk>20000</maxElementsOnDisk>
	<diskPersistent>false</diskPersistent>
	<diskExpiryThreadIntervalSeconds>120</diskExpiryThreadIntervalSeconds>
	<memoryStoreEvictionPolicy>LRU</memoryStoreEvictionPolicy>
</data:cache>

<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID/>
	</datasourcedataconnection>
</data:datadefinition>

This example will utilise a temporary table called ROADS_SELECTION which contains two columns RD_NAME who's data type matches the RD_NAME column in the ROADS table, and UID which is a varchar column long enough to contain 32 random characters, and there should be an non-unique index on the UID column.

Note: that "userid" and "key" are the default names for the columns in the temporary table, they can be called anything but if they're not "userid" and/or "key" then you'd need to set the keycolumn and usercolumn values in the data defintiion to match the names of the columns in the temporary table, as has been done above since the column names are actually "RD_NAME" and "UID" rather than "userid" and "key". You always need to provide the keytable parameter so there's no default for that.

Sorting data

You can add <sort> tags to specify what column(s) to sort by by default, e.g.

Code Block
languagexml
<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<from table="PLANS"/>
		<where clause="PLANS.ID=ROADS.PLAN_ID"/>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suffix" label="Suffix" column="RD_SUFFIX"/>
		<parameter name="type" label="Type" column="RD_TYPE"/>
		<parameter name="namealtname" label="Alt. Name" column="RDALT_NAME"/>
		<parameter name="suffixaltsuffix" label="Alt. Suffix" column="RDALT_SUFFIX"/>
		<parameter name="typealttype" label="Alt. Type" column="RDALT_TYPE"/>
		<parameter<sort nameparameter="altname" label="Alt. Name" column="ALT_NAME"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX"/>
		<parameter name="alttype" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="class" label="Class" column="CLASS_CODE"/>
		<parameter type="url" name="plan" label="Plan" column="'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
		<cache id="test.cache"/>
	</datasourcedataconnection>
</data:datadefinition>
Code Block
xmlxml
titleA data definition for supplying a list of values (no key is defined), probably for a cascading input parameter for a search
linenumberstrue

<data:datadefinition id="suburbRoads">
	<datasourcedataconnection datasource="datasource.main" table="PROPERTY" prefix="DISTINCT"type"/>

		<sort parameter="name"/>
	</datasourcedataconnection>
</data:datadefinition>

New Join Syntax

As of Weave 2.5.11 it's possible to specify a table join using join specific tag (rather than having to use from and where tags).

This is done with the join tag, which takes 3 parameters, table which is required and is the name of the table to join on, on which is also required and is the join clause, and finally type which isn't required and will specify the join type to use (will default to an inner join).

Note that there currently is no checking on the value specified for the type parameter, the valid specified for type will be placed directly into the generated SQL, so you should ensure that you're using a valid join type for your database ("inner", "left", "right", "full", etc).

Join syntax example
Code Block
languagexml
<data:datadefinition id="roadDetails">
	<datasourcedataconnection datasource="datasource.main" table="ROADS" key="RD_NAME" prefix="DISTINCT">
		<join type="left" table="PLANS" on="PLANS.ID=ROADS.PLAN_ID">
			<clause>PLANS.ACTIVE=TRUE</clause>
		</join>
		<parameter name="name" label="Name" column="RD_NAME"/>
		<parameter name="suburbsuffix" label="SuburbSuffix" column="PRSUBRD_NAMESUFFIX"/>
		<parameter name="roadnametype" label="Road NameType" column="PRRODRD_NAMETYPE"/>
		</datasourcedataconnection>
</data:datadefinition>
Code Block
xmlxml
titleAnother data definition for supplying a list of values, probably for a triple field cascading input parameter for a search
linenumberstrue

<data:datadefinition id="suburbRoadType">
	<datasourcedataconnection datasource="datasource.main" table="PROPERTY" prefix="DISTINCT"<parameter name="altname" label="Alt. Name" column="ALT_NAME"/>
		<parameter name="altsuffix" label="Alt. Suffix" column="ALT_SUFFIX"/>
		<parameter name="alttype" label="Alt. Type" column="ALT_TYPE"/>
		<parameter type="integer" name="suburbclass" label="SuburbClass" column="PRSUBCLASS_NAMECODE"/>
		<parameter type="url" name="roadnameplan" label="Road NamePlan" column="PRROD_NAME"/>
		<parameter name="roadtype" label="Road Type" column="PRROD_TYPE"'http://imgsvr:8080/gis/documents/plan_'||PLANS.PLAN_CODE||'.pdf'" text="Open"/>
	</datasourcedataconnection>
</data:datadefinition>

More on Caching

To disable the caching all together you'd do the following

...


<data:datadefinition id="...">
	<datasourcedataconnection ...>
		...
		<cache disable="true"/>
	</datasourcedataconnection>
</data:datadefinition>

To modify the default caching options

...


<data:datadefinition id="...">
		<datasourcedataconnection ...>
		...
		<cache>
			<setting>value</setting>
			<setting>value</setting>
			<setting>value</setting>
		</cache>
	</datasourcedataconnection>
</data:datadefinition>

Where the <settings> you can change are identified at caching

You can set the default cache settings with

...


<data:cache>
	<setting>value</setting>
	<setting>value</setting>
	<setting>value</setting>
</data:cache>

and create a cache definition that can be re-used

Code Block
xmlxml
linenumberstrue

<data:cache id="test">
	<setting>value</setting>
	<setting>value</setting>
	<setting>value</setting>
</data:cache>

<data:datadefinition id="...">
	<datasourcedataconnection ...>
		...
		<cache id="test"/>
	</datasourcedataconnection>
</data:datadefinition>

The above example shows joining the PLANS table. Using the previous version of the roadDetails data definition would not return any rows where there was not a match between the ROADS and PLANS table, using the newer syntax it's possible to generate SQL that will return rows from ROADS even if there is no match in the PLANS table.

Note that the above configuration for the plan parameter is not currently smart enough to generate a value value for column, since it does not take into account the fact that the PLANS.PLAN_CODE value will be null if there is no matching row in the PLANS table. The column attribute should be updated to use the appropriate SQL syntax for your database to check for a a null value and handle it accordingly (i.e. generate a link to a "no plan available" page).

The SQL generated for the previous version (using from and where tags) would be of the form:

Code Block
languagesql
SELECT columns
FROM primary_table, secondary_table
WHERE primary_table.column = secondary_table.column

Using a join tag (without a type specified) the SQL generated would be of the form:

Code Block
languagesql
SELECT columns
FROM primary_table JOIN secondary_table ON primary_table.column = secondary_table.column

If the type were specified as "left" then the SQL generated would be of the form:

Code Block
languagesql
SELECT columns
FROM primary_table left JOIN secondary_table ON primary_table.column = secondary_table.column