A rule has to ascertain that all elements in a List<ElemBoxStatus>in a
Collector occur in the matching BoxResponse's Set<ElemBoxStatus>. There is
just one BoxResponse per Collector.
This here works fine:
rule matchCollectorResponse
when
$c : Collector( $ebsList : elemBoxStatusList, $gsSet : globalStatusSet )
$b : BoxResponse( collector == $c, globalStatusSet == $gsSet, $ebsSet : elemBoxStatusSet )
forall( $ebs : ElemBoxStatus() from $ebsList
BoxResponse( collector == $c, elemBoxStatusSet contains $ebs ) )
then
...
end
Thinking that $ebs is already available from the second pattern ($b:...), I tried
rule matchCollectorResponse
when
$c : Collector( $ms : message, $ebsList : elemBoxStatusList, $gsSet : globalStatusSet )
$b : BoxResponse( collector == $c, globalStatusSet == $gsSet, $ebsSet : elemBoxStatusSet )
forall( $ebs : ElemBoxStatus() from $ebsList
eval( $ebsSet.contains( $ebs ) ) )
then
...
end
but the compiler came back with
Line ...:55 no viable alternative at input '$ebs' in rule matchCollectorResponse in pattern eval
Defining a suitable function isIn(...) and using this within eval() produces the same result. This
and other experiments seems to indicate that bindings in the first pattern of forall() are not
passed in to an eval() later in the forall.
JIRA?
-W