XQuery Fragment Supported

 

Timber currently support most part of XQuery. The following simplified yet substantially expressive grammar represent the XQuery fragment supported by Timber.

 

<FLWOR> ::= <ForLetClause> <WhereClause>? <OrderByClause>? <ReturnClause>

<ForLetClause> ::= ( <ForClause> | <LetCLause> ) +
<ForClause> ::= "for" $var "in" <FLE>
<LetClause> ::= "let" $var ":=" <FLE>
<FLE> ::= <SP> | <MLCA> | <FLWOR>
$var ::= $variable
<SP> ::= Simple Path (includes attributes but no branching predicates)
<MLCA> ::= "timber-mlca"($var, <SP>, $var, <SP>, ... , $var, <SP>)


<WhereClause> ::= "where" <WE>
<WE> ::= <SimplePredicateExpr>
| <AggrPredExpr>
| <ValueJoin>
| <EveryExpr>
| <SomeExpr>
| <ANDExp>
| <ORExp>
<SimplePredicateExpr> ::= <SP> <Predicate> <Value>
<AggrPredExpr> ::= Aggregate(<SP>) <Predicate> <Value>
Aggregate(<SP>) ::= "count("<SP>")" | "avg("<SP>")" | "min("<SP>")" | "max("<SP>")" | "sum("<SP>")" 
<ValueJoin> ::= <SP> <Predicate> <SP>
<EveryExpr> ::= "every" $var "in" <SP> "satisfies" <SimplePredicateExpr>
<SomeExpr> ::= "some" $var "in" <SP> "satisfies" <SimplePredicateExpr>
<ANDExp> ::= <WE> "and" <WE>
<ORExp> ::= <orin> "or" <orin> ("or" <orin>)*
<orin> ::= (<SimplePredicateExpr> | <AggrPredExpr> | <EveryExpr> | <SomeExpr>)

<OrderByClause> ::= "order by" <OrderList>
<OrderList> ::= <OrderSpec> ("," <OrderList>)*
<OrderSpec> ::= <SP> <SORTMODE>? <EMPTYMODe>?
<SORTMODE> ::= "ascending" | "descending"
<EMPTYMODE> ::= "empty least" | "empty greatest"

<ReturnClause> ::= "return" <RE>
<RE> ::= <SP> 
| Aggregate(<SP>) 
| ( "<"tagname <ATTRLIST>?">" RE "</"tagname">" )
| <UpdateExpr>
| <FLWOR>
ATTRLIST ::= tagname "=" <SP> <ATTRLIST>*

<UpdateExpr> ::= 
"timber-delete"( <SP> | <SP>"/text()" )
| "timber-update"( <SP>, <Value> | <SP> | Aggregate(<SP>) )
| "timber-insertfile"( <SP>, <filename> )
| "timber-insertelement"( <SP>, ElementTag, <Value> | <SP> | Aggregate(<SP>), <AttrCont>*)
| "timber-insertattribute"( <SP>, AttributeTag, <Value> | <SP> | Aggregate(<SP>))
<AttrCont> ::= AttributeTag ( <Value> | <SP> | Aggregate(<SP>) )

<filename> ::= A string that points to a file name eg "bib.xml"
<Value> :: = string or number


// IMPORTANT NOTE: Nested FLWOR statements require a join, either structural or value with a node bound to an outer variable.
// If a variable binds to a nested FLWOR, then on the outer where part we cannot have a value join referencing this variable.