James,
What are the "elements" in your list? Strings?
There are a few ways of doing it. Basically they differ on what are
the elements of your list, how many you expect to find in each list,
etc. The simplest way:
when
$code : String() from lookupDAO.getLookup(...)
( SHIPMENT_MOVE(customer_code == "abc", ship_code == $code ) OR
SHIPMENT_MOVE(customer_code == "abc", deliver_code == $code ) OR
SHIPMENT_MOVE(customer_code == "abc", port_code == $code )
)
then
// consequence
end
Remember that if your list contains codes that match more than one
condition above, your consequence will fire multiple times.
If you want it to fire only once, you can use a predicate:
when
$code : String() from lookupDAO.getLookup(...)
SHIPMENT_MOVE(customer_code == "abc", $sc : ship_code,
$dc : deliver_code, $pc : port_code,
( $code.equals($sc) ||
$code.equals($dc) || $code.equals($pc) ) )
)
then
// consequence
end
If you expect your list to have a lot of objects, or if you expect to
use the same list in more than one rule, you can improve performance by
doing a rule to retrieve and assert the list of codes, based on whatever
criteria you need (customer code for instance in the bellow example):
rule "retrieving the list"
when
Customer( $custCode : customer_code )
then
List codes = lookupDAO.getLookup( $custCode );
assert( codes );
end
rule "doing something"
when
Customer( $custCode : customer_code )
$list : List()
SHIPMENT_MOVE(customer_code == $custCode, $sc : ship_code,
$dc : deliver_code, $pc : port_code,
( $list.containts($sc) ||
$list.containts($dc) || $list.containts($pc) ) )
then
// do something
end
If your DAO returns a specific class, like the one mentioned in one
of your examples bellow (LookupTableResults) and it is not a collections
implementation, you can even do things like:
when
SHIPMENT_MOVE(customer_code == "abc", $sc : ship_code,
$dc : deliver_code, $pc : port_code )
LookupTableResult( elements contains $sc | contains $dc | contains
$pc ) from lookupDAO.getLookup(...)
)
then
// consequence
end
So, I don't have your code to run, but there are many ways of
doing... test and try to find which one best suites you.
Hope it helps.
Edson
jdepaul wrote:
I'm having trouble figuring out syntax for my rules - could
someone please
steer me in the right direction - it's been a frustrating few days and no
luck. I need to check existence of various attributes from the
SHIPMENT_MOVE fact against a list of values (same list) I fetch from the
DB...
Get $valuesList from a DAO - then...
If SHIPMENT_MOVE.customer_code = "abc" and SHIPMENT_MOVE.reference_code
exists in $valuesList
OR
SHIPMENT_MOVE.customer_code = "abc" and SHIPMENT_MOVE.shipping_code exists
in $valuesList
OR
SHIPMENT_MOVE.customer_code = "abc" and SHIPMENT_MOVE.partner_code exists in
$valuesList
I have the following rule working fine:
$shipment SHIPMENT_MOVE(customer_code = "abc")
LookupTableResult ( resultValue == 1 ) from lookupDAO.getLookup(...)
But I'm having real problems with writing a rule like this:
when
SHIPMENT_MOVE(customer_code == "abc", $list contains ship_code) OR
SHIPMENT_MOVE(customer_code == "abc", $list contains deliver_code) OR
SHIPMENT_MOVE(customer_code == "abc", $list contains port_code)
Your guidance will be appreciated -
Thanks,
James
P.S.
I'm using Drools 3.1.0M1
--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3124-6000
Mobile: +55 11 9218-4151
JBoss, a division of Red Hat @
www.jboss.com