[DFDL-WG] public comment "Non-deterministic outcome of setVariable evaluations"

Steve Hanson smh at uk.ibm.com
Tue Oct 1 08:16:27 EDT 2013


I think this leaves us in a strange halfway house where the spec says 
which order annotations on the same annotation point are executed, but 
does not say in which order annotations on different annotation points are 
executed. To my mind, we either have a predictable order or we don't.

Regards

Steve Hanson
Architect, IBM Data Format Description Language (DFDL)
Co-Chair, OGF DFDL Working Group
IBM SWG, Hursley, UK
smh at uk.ibm.com
tel:+44-1962-815848



From:   Mike Beckerle <mbeckerle.dfdl at gmail.com>
To:     "dfdl-wg at ogf.org" <dfdl-wg at ogf.org>, 
Date:   30/09/2013 23:12
Subject:        [DFDL-WG] public comment "Non-deterministic outcome of 
setVariable     evaluations"
Sent by:        dfdl-wg-bounces at ogf.org



Some email discussion before posting to the public comment forum may be 
helpful for this issue.

Right now the rules say that all dfdl:newVariableInstance annotations for 
a schema component are always executed before any setVariable annotations. 
This is ok. One can introduce an extra sequence in order to allow a 
setVariable to occur before a newVariableInstance. 

(Personally: I would like to get a warning from my DFDL implementation if 
I write statement annotations at one annotation point that are not in the 
canonical order described in Errata 3.25)

The problem is that the order of execution of multiple setVariable 
statements at one annotation point, or similarly, of multiple 
newVariableInstance at one annotation point, is not specified. This is 
what will get users into trouble. 

If there are multiple newVariableInstance annotations, then the order is 
important to understanding when exactly a new instance comes into scope, 
and whether the prior-scope's value for that variable can be read as part 
of the default value expressions. Consider this:

<dfdl:newVariableInstance ref="save">{ $delim }</dfdl:newVariableInstance>
<dfdl:newVariableInstance ref="delim">{  ../hdr/d 
}</dfdl:newVariableInstance>

We need to specify whether $delim in the first annotation is referring to 
that variable before the new instance is created, or after. I suggest that 
before is more intuitive, as that is lexical order. Note however, that 
this means:

<dfdl:newVariableInstance ref="prefix">{  fn:concat($prefix, "_", 
fn:name()) }</dfdl:newVariableInstance>

is allowed and is not recursion. The expression is referring to $prefix 
from the enclosing scope, and then initializing a new instance of $prefix 
for the scope contained by this schema component. 

The same logic applies to dfdl:setVariable annotations. The order needs to 
be controlled by the user.

I suggest the fix for this issue is as follows:

Errata 3.20, 3.21, and Errata 3.25 must be modified (and the corresponding 
sections of the spec)

For errata 3.20, and errata 3.21 the sentence:

 "However, the order of execution among them is not specified. Schema 
authors can insert sequences to control the timing of evaluation of 
statements more precisely." 

is replaced by:

"The order of execution is specified in errata 3.25."

Errata 3.25 is modified.

Numbered item 3 of both the first list and second list is replaced by:

3. dfdl:setVariable(s) - in lexical order

Numbered item 2 of the second list is replaced by:

2. dfdl:newVariableInstance(s) - in lexical order

These two paragraphs are added below the numbered lists to clarify what 
'lexical order' means. 

The dfdl:setVariable annotations at any one annotation point of the schema 
are always executed in lexical order. However, dfdl:setVariable 
annotations can also be found in different annotation points that are 
combined into the resolved set of annotations for one schema component. In 
this case, the order of execution of the dfdl:setVariable statements from 
any one annotation point remains lexical, but it is unspecified what the 
order of execution is across dfdl:setVariable statements coming from 
different annotation points.   

The dfdl:newVariableInstance annotations at any one annotation point of 
the schema are always executed in lexical order. However, 
dfdl:newVariableInstance annotations can also be found in different 
annotation points that are combined into the resolved set of annotations 
for one schema component. In this case, the order of execution of the 
dfdl:newVariableInstance statements from any one annotation point remains 
lexical, but it is unspecified what the order of execution is across 
dfdl:newVariableInstance statements coming from different annotation 
points.


----------------------

Mike Beckerle | OGF DFDL Workgroup Co-Chair | Tresys Technology | 
www.tresys.com
Please note: Contributions to the DFDL Workgroup's email discussions are 
subject to the OGF Intellectual Property Policy
--
  dfdl-wg mailing list
  dfdl-wg at ogf.org
  https://www.ogf.org/mailman/listinfo/dfdl-wg

Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ogf.org/pipermail/dfdl-wg/attachments/20131001/7cef1c75/attachment-0001.html>


More information about the dfdl-wg mailing list