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: [email protected] 
[mailto:[email protected]] 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 <[email protected]<mailto:[email protected]>>
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
[email protected]<mailto:[email protected]>
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 
[email protected] 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
**************************************************************************************
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to