[rules-users] inconsistency with 'collect' and the '||' operator

Adrian Cowham adrian.cowham at gmail.com
Wed Nov 7 14:19:06 EST 2007


I'm running into an issue where the || operator embedded in a collect isn't
working as expected. My collect statement is as follows...

        $request : AccessRequest($name : username, $ID : sessionID, $loc :
accessLocation, $day : dayOfAccess)
        $locationRules : ArrayList(size > 0) from
            collect (AccessRule((allowedLocation == "ANY" || allowedLocation
== $loc))
            from $group.getRules())

I don't get comilation or runtime errors but I don't the expected behavior
either. That is, I don't get the intersection of AccessRules that have
allowedLocation equal to ANY or allowedLocation equal to the bound $loc
variable. Instead, the empty set is returned.

When I modify the rule to look like

        $request : AccessRequest($name : username, $ID : sessionID, $loc :
accessLocation, $day : dayOfAccess)
        $locationRules : ArrayList(size > 0) from
            collect (AccessRule(allowedLocation == $loc))
            from $group.getRules())

I get the expected output.

However, when I modify the rule to look like

        $request : AccessRequest($name : username, $ID : sessionID, $loc :
accessLocation, $day : dayOfAccess)
        $locationRules : ArrayList(size > 0) from
            collect (AccessRule((allowedLocation == "ANY"))
            from $group.getRules())

...it returns the empty set even though there are rules that have
allowedLocation set to "ANY" (i confirmed this by debugging my java code). I
haven't seen any documentation that uses the collect statement this way but
according to my understanding of the grammer this should work. For some
reason the allowedLocation == "ANY" embedded in the collect isn't working.
What's interesting to note is that the following rule works flawlessly
(notice the absence of the collect statement)...

rule "test"
    when
        # does the user that just requested access exist in a group
        $request : AccessRequest($name : username, $ID : sessionID, $loc :
accessLocation, $day : dayOfAccess)
        $rule : AccessRule(allowedLocation == "ANY" || allowedLocation ==
$loc, allowAccess == "true")
    then
        System.out.println("Test passed");
end

Any help on the matter would be greatly appreciated. Thanks.

a
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20071107/50610e36/attachment.html 


More information about the rules-users mailing list