6.3.
Appendix
Up one level
This appendix contains information about the query language ooXmlQL
ooXmlQL Specification
The following EBNF grammar specifies sound ooXmlQL queries. Remark: A strange behaviour can be observed when using variables where one variable is a prefix of another variable, e.g. $ref and $refAlias. It seems there is a bug in the XQuery processor. Therefore this variable setting should be avoided.
ooXmlQuery = query.
query = ‘<query>’ ( queryelements ) ( declareNS )* ‘</query>’
queryelements = ( select )?
from
( declareVar )*
( restriction )?
( where )?.
select = ‘<select>’ ( ‘*’ | xpath expression+ ) ‘</select>’.
declareNS = ‘<declare name=“’name’”>’ namespace ‘</declare>’.
from = ‘<from as=“’var‘”>’ ( class | setOperation ) ( join )? ‘</from>’.
setOperation = ‘<union>’ ( class | setOperation )+ ‘</union>’ |
‘<intersect>’ ( class | setOperation )+ ‘</intersect>’ |
‘<except>’ ( class | setOperation )+ ‘</except>’.
class = ‘<class name=“’classname’”/>.
join = ‘<join on=“’relation’” as=“’var’” class=“’class’”>’
( restriction )? ( join )?
‘</join>.
declareVar = ‘<declare var=“’var’”>’ declaration ‘</declare>’.
where = ‘<where>’ xpath or xquery expression ‘</where>’.
restriction = subquery | and | or | not.
subquery = ‘<query return=“’relationship’”>’
queryelements
‘</query>’.
and = ‘<and>’ restriction+ ‘</and>’
or = ‘<or>’ restriction+ ‘</or>’.
not = ‘<not>’ restriction ‘</not>’.
Variables can be used in
- where clause
- declare variable clause
- select clause
Example ooXmlQL query:
<query>
<select>$sla</select>
<declare name="ns1">http://it-innovation.soton.ac.uk/2005/grid</declare>
<declare name="ns2">http://www.w3.org/2005/08/addressing</declare>
<from as="$sla">
<class name="Sla"/>
<join on="provides" as="$res" class="Resource"/>
</from>
<declare var="$min">fn:min($sla//cpu)</declare>
<declare var="$max">fn:max($sla//cpu)</declare>
<query return="providedBy">
<from class="Resource" as="$res"/>
<declare var="$avg">fn:avg($res//cpu)</declare>
<where>
$res//ns2:Metadata/ns1:type =
"uk.ac.soton.ecs.iam.grid.comms.client.RemoteDataService"
</where>
</query>
<where>$sla//cpu = $min or $sla//cpu = $max</where>
</query>
