Generally the advice when using drools is that if you are wanting to use an array (or
other type of collection) then you should probably be normalising your data and putting
the values of the collection into the working memory as their own object (pretend that
drools is a relational database and follow the same rules as you would defining database
tables and rows). Sometimes you can't do this because of constraints on the
environment you are work within but in your case you I think you have two options:
Each room conceptually has its own sprinkler therefore each Sprinkler object contains a
single room field.
If a Sprinkler has the concept of operating over multiple rooms then have a Sprinkler
object containing its ID and status, then have multiple SprinklerHeadLocation objects
containing a reference to the Sprinkler and a single room each.
Rule " if fire in room start sprinkler if room has sprinkler"
No-loop true
when
Fire($room : room)
SprinklerHeadLocation(room == $room, $sprinklerId : sprinklerId)
$sprinkler : Sprinkler(sprinklerId == $sprinklerId, status == false)??
then
modify($sprinkler){
setStatus(true)
};
End
Thomas
From: rules-users-bounces(a)lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org] On
Behalf Of Esteban Aliverti
Sent: 09 June 2010 20:28
To: Rules Users List
Subject: Re: [rules-users] depicting array in rules
One way could be:
when
Fire($room : room)
$sprinkler : Sprinkler(room contains $room)
Room (this == $room, someField == "SomeValue")
then
modify($sprinkler){
setStatus(true)
};
End
If you dont have the Room as a Fact Type, then:
when
Fire($room : room)
$sprinkler : Sprinkler(room contains $room)
Room (someField == "SomeValue")from $room
then
modify($sprinkler){
setStatus(true)
};
End
I'm not 100% sure about this, but at least you can start from here
Best
2010/6/9 Fnu Mahalakshmi <FMahalakshmi@nyx.com<mailto:FMahalakshmi@nyx.com>>
Hi,
Is there any way I can represent an array of values in my rules??
I want to do this:
Fire{
Room,
Status}
Sprinkler{
Object [] Room = new Room[]{new Room(),new room()}
Status
}
Room{
Name,
Number}
Rule " if fire in room start sprinkler if room has sprinkler"
No-loop true
when
Fire($room : room)
$sprinkler : Sprinkler( room == $room) # how can I search through the array of room
values here???????
then
modify($sprinkler){
setStatus(true)
};
End
Any Idea if that is possible to implement in rules???
I could do it with adding different instances of sprinkler and rooms. But I want to
minimize the amount of repetition in data stored and loaded into the working memory.
Any idea??
Thank you,
M
________________________________
Please consider the environment before printing this email.
Visit our website at
http://www.nyse.com
*****************************************************************************
Note: The information contained in this message and any attachment to it is privileged,
confidential and protected from disclosure. If the reader of this message is not the
intended recipient, or an employee or agent responsible for delivering this message to the
intended recipient, you are hereby notified that any dissemination, distribution or
copying of this communication is strictly prohibited. If you have received this
communication in error, please notify the sender immediately by replying to the message,
and please delete it from your system. Thank you. NYSE Euronext.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org<mailto:rules-users@lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-users
--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Esteban Aliverti
________________________________
**************************************************************************************
This message is confidential and intended only for the addressee. If you have received
this message in error, please immediately notify the postmaster(a)nds.com and delete it from
your system as well as any copies. The content of e-mails as well as traffic data may be
monitored by NDS for employment and security purposes. To protect the environment please
do not print this e-mail unless necessary.
NDS Limited. Registered Office: One London Road, Staines, Middlesex, TW18 4EX, United
Kingdom. A company registered in England and Wales. Registered no. 3080780. VAT no. GB 603
8808 40-00
**************************************************************************************