[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: [wsbpel] Issue - 147 - Proposal For Vote
As we are approaching the f2f meeting, we now have proposals for the complete 147(.x) family of issues. The general requirement for the introduction of a foreach activity, in particular its parallel flavor, has been made before and is not repeated here. After "iterating" over the resolution proposals that have been provided for Issue 147, we are convinced that a foreach using iterator variables (this was also part of an earlier proposal) is more appropriate for WS-BPEL users dealing with XML data. ===> Important Note: I am sending this as a counter proposal. However, any other mode is fine with me as well - amendment etc. I would like to make sure all options are fully explored at the TC before we go to a vote on either iterator variable or counter variable approach. The iterator variable approach reflects XML data in a much more natural way than any approach using counter variables. Indexing a variable is a low-level programming exercise that can easily be left to an implementation. There is no known use case that justifies throwing square brackets and index variables into the end user's face when BPEL variables outside of the foreach are accessed. The aliasing approach is not more or less dangerous as the one used in properties; the probability of encountering a selectionFailure is the same. A single iterator variable is not sufficient. A single "set variable" that contains input AND output of a foreach is hard to use when a subsequent foreach takes its input from an earlier foreach's output. Moreover, if data is combined from multiple sources, it is convenient to use multiple iterator variables (same for producing multiple output sets). This proposal follows the paradigm "Make the simple things easy and the complicated things possible". ======================================================================== Specification ======================================================================== A foreach activity is used to iterate over a set of element information items (EIIs), either serially or in parallel. <foreach parallel="yes|no" standard-attributes> standard-elements <iteratorVariables loopVariable="ncname"? > <iteratorVariable name="ncname" type="qname"> + <query queryLanguage="anyURI">...</query> </iteratorVariable> </iteratorVariables> activity </foreach> The "parallel" attribute is used to determine whether the iterations of the contained activity are to be executed in parallel or serially. The default is "no". The <iteratorVariables> section defines one or more iterator variables that can be used in the contained activity. Its "loopVariable" attribute designates one iterator variable which determines the number of iterations. If only one iterator variable is present, then this is the loop variable, in this case, the "loopVariable" attribute can be omitted. Each iterator variable has a query that identifies a set of EIIs. In the n-th iteration, each iterator variable acts as an alias for the n-th EII in its associated set of EIIs. If an aliased EII does not exist then a bpws:selectionFailure MUST be thrown. As a result the previous rule, note that each set of EIIs MUST contain AT LEAST as many EIIs as the set identified by the designated loop variable's query. Example: ======== The following foreach activity takes a set of integer numbers from variable "aSet" and stores the calculated results into output variable "bSet". <foreach> <iteratorVariables loopVariable="input"> <iteratorVariable name="input" type="xsd:int"> <query>$aSet/aElem</query> </iteratorVariable> <iteratorVariable name="output" type="xsd:int"> <query>$bSet/bElem</query> </iteratorVariable> </iteratorVariables> <assign> <copy> <from>$input*$input</from> <to>$output<to> </copy> </assign> </foreach> Variables aSet and bSet BEFORE foreach: <aSet> <aElem>11</aElem> <aElem>12</aElem> <aElem>13</aElem> </aSet> <bSet> <bElem>0</bElem> <bElem>0</bElem> <bElem>0</bElem> <bElem>0</bElem> </bSet> Variables aSet and bSet AFTER foreach: <aSet> <aElem>11</aElem> <aElem>12</aElem> <aElem>13</aElem> </aSet> <bSet> <bElem>121</bElem> <bElem>144</bElem> <bElem>169</bElem> <bElem>0</bElem> </bSet> ========================================================================
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]