I must be missing something. If you want to check if all the three strings are present in each array, why are you using OR (||)?

If you don't want to model the array as a class containing the "parent" reference and insert them as facts, you can try this:

MyContext(classes contains "TestString1" && contains "TestString2" && contains "TestString3")


Best Regards,

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Esteban Aliverti
- Developer @ http://www.plugtree.com
- Blog @ http://ilesteban.wordpress.com


On Wed, Sep 29, 2010 at 12:17 PM, Swindells, Thomas <TSwindells@nds.com> wrote:
> Thomas, Thanks for the suggestions.
>
> Swindells, Thomas wrote:
> >
> > Also have you tried just using ==, eg exists( String(this ==
> > "TestString1") ||  String(this == "TestString2") || String(this ==
> > "TestString3") from DclassesList)
> >
>
> This did reduce the time by about 50 ms.
That's a step in the right direction at least.

> Swindells, Thomas wrote:
> >
> >
> > You may also want to consider whether it would be beneficial to
> > restructure your fact class to get rid of the from, and match against
> > ClassName facts instead - this may give you a big performance gain as it
> > means each rule wouldn't have to iterate over the list, if you are
> > updating MyContext then this gain is likely to be even bigger.
> >
>
> Not quite sure about what you mean by "match against ClassName facts instead
> ".  My fact class will have a bunch of instance variables one of which is
> the array of strings.
> Would be great if you could elaborate that a bit.

Have two fact classes,
One is your current fact class (MyContext), the other is to represent each of your classes entry.
Eg:
Class ClassName {
MyContext parent;
String name;
...
}

When inserting you MyContext into the working memory you would also add a ClassName fact for each entry of the classes list (you could either do this in code or have a rule which does it for you).

Your main rules would then look something like the following:


Rule XYZ
$parent : MyContext
exists ( ClassName(parent == $parant, name == "TestString1") or ClassName(parent == $parant, name == "TestString2") or ClassName(parent == $parant, name == "TestString3"))
then
...

If you only ever have one MyContext in working memory you can skip the parent check.


You may also be able to use in to simplify things
exists ( ClassName(parent == $parant, name in {"TestString1", "TestString2", "TestString3"))


Hope that makes sense,

Thomas



**************************************************************************************
This message is confidential and intended only for the addressee. If you have received this message in error, please immediately notify the postmaster@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
**************************************************************************************

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users