[rules-users] Check if fact is subset of items in the rule

Kumar Pandey kumar.pandey at gmail.com
Thu Oct 14 17:41:22 EDT 2010


Thanks for this tip.
This works but only if the second rule's  $f.numbers is on the RHS and
numbers is on the LHS of the subsetOf operator.
i.e  Element(name="Super set - Rule 1", numbers subsetOf $f.numbers)

Which is what I want in my case (to check if values in the fact is subset of
values in the rule).

If I wanted it the other way round though the compiler seems to disapprove.

I get a compiler error like so --

java.lang.RuntimeException: Unable to compile rule
Unable to determine the used declarations.
[Error: unknown class or illegal statement: org.mvel2.ParserContext at 1aed5f9]
[Near : {... $f.numbers subsetOf dat ....}]

If you try the Wolfgang's example and in the rule swap check like so - s1
disjoint numbers

e2: Element( this != e1, n2 : name, s1 disjoint numbers )

then you get error like so

Unable to create Field Extractor for 's1' of '[ClassObjectType
class=com.test.context.Element]' in rule 'find disjoint pairs' : [Rule
name='find disjoint pairs']

Sounds like a compiler bug as the operation should be commutative right?


Thanks
Kumar
2010/10/13 Michael Anstis <michael.anstis at gmail.com>

> OK, unless I'm missing something else you should be able to do something
> like this:-
>
> rule "setup superset - Rule 1"
>    when
>    then
>         Element ss = new Element("Super set - Rule 1", 1, 2, 3);
>         insert(ss);
> end
>
> rule "rule 1"
>     when
>         $f : Fact()
>          Element(name="Super set - Rule 1", $f.numbers subsetOf numbers)
>     then
>         //Do something
> end
>
> This uses Wolfgang's Element Class from his example creating custom
> operators and assumes Fact exposes a "numbers" property which returns a
> Collection. This remains untested but I have no reason to doubt Wolfgang.
>
> With kind regards,
>
> Mike
>
>
>
>
>
> 2010/10/13 Kumar Pandey <kumar.pandey at gmail.com>
>
>> Well the problem is in forming the DRL  :)
>> My use case is each rule represents an item with its specific property.
>> Fact is a user property and I want to filter the items for this user based
>> on the users incoming property as facts.
>>
>>
>> I have been able to get it working like so but eval is not optimum for
>> Rete. I was hoping for a better solution that would utilize the Rete
>> optimization.
>>
>> Here's my unit test DRL. Note, I have a isNotSubset method in my fact
>> object and I'm getting the list from rule and doing a check.
>>
>> package com.test
>> import com.rule.OfferFact;
>> global java.util.List list
>>
>> rule rule_not_sub_set
>> when
>>    $context : Fact()
>>    eval($context.isNotSubset("SINGER","DANCER", "DOCTOR"))
>> then
>>    list.add(drools.getRule().getName());
>> end
>>
>>
>> 2010/10/13 Michael Anstis <michael.anstis at gmail.com>
>>
>>> Not as clear as I'd hoped; can you provide an actual rule DRL?
>>>
>>> 2010/10/13 Kumar Pandey <kumar.pandey at gmail.com>
>>>
>>> Michael
>>>>   Here are some examples
>>>>
>>>> Rule1  has "str1", "Str2", "Str3"
>>>>
>>>> Rule2 has "str2", "Str3", "Str5", "Str6", "Str7"
>>>>
>>>> Rule3 has "str1", "Str3", "Str6"
>>>>
>>>> etc.
>>>>
>>>> With fact1 that has  "str1", "Str3" , since this is subset of values in
>>>> Rule1 and Rule3, they should not fire but Rule2 should fire
>>>>
>>>> With fact2 that has "str2", "Str6", "Str7", Rule 2 should not fire and
>>>> Rule1 and Rule3 should fire.
>>>>
>>>> Hope this is clear.
>>>>
>>>> Thanks
>>>> Kumar
>>>>
>>>> 2010/10/13 Michael Anstis <michael.anstis at gmail.com>
>>>>
>>>>>  Thanks, please provide a specific example rule too.
>>>>>
>>>>> Don't forget to keep your posts to the mailing list for the good of the
>>>>> community.
>>>>>
>>>>>
>>>>> On 12 October 2010 22:18, Kumar Pandey <kumar.pandey at gmail.com> wrote:
>>>>>
>>>>>> Michale
>>>>>>   Thanks for the response.
>>>>>> Here's the link for the thread .
>>>>>>
>>>>>>
>>>>>> http://drools-java-rules-engine.46999.n3.nabble.com/Check-if-fact-is-subset-of-items-in-the-rule-td1680013.html#a1680013
>>>>>>
>>>>>> and the original about matching strings in two arrays.
>>>>>>
>>>>>> http://drools-java-rules-engine.46999.n3.nabble.com/Matching-strings-in-two-arrays-td1602511.html#a1602511
>>>>>>
>>>>>>
>>>>>> My use case is that I could have hundreds of rule and each rule could
>>>>>> have its own set of strings.
>>>>>> A fact object is run through these rules to see which ones are fired.
>>>>>> One of the condition to check is that the a list in the fact is not a
>>>>>> subset of list in the rule.
>>>>>> That is fire the rule only if list in fact is not a subset of list in
>>>>>> rule.
>>>>>>
>>>>>> Thanks
>>>>>> Kumar
>>>>>>
>>>>>>
>>>>>> On Tue, Oct 12, 2010 at 12:38 PM, Michael Anstis <
>>>>>> michael.anstis at gmail.com> wrote:
>>>>>>
>>>>>>> OK, I admit I don't have the original thread anymore.
>>>>>>>
>>>>>>> If I am not wrong (which is always a possibility) for Wolfgang's
>>>>>>> operator to work you'd need to externalise the superset from the rule into
>>>>>>> WorkingMemory. You could have a rule with higher salience construct the
>>>>>>> superset WM fact.
>>>>>>>
>>>>>>> If you don't mind re-posting or providing a link to the complete
>>>>>>> thread (on Nabble or somewhere) I'll happily try to help further.
>>>>>>>
>>>>>>> On 12 October 2010 17:23, <kumar.pandey at gmail.com> wrote:
>>>>>>>
>>>>>>>> <quote author='Michael Anstis-2'>
>>>>>>>>
>>>>>>>> Wolfgang gave a great solution.
>>>>>>>> </quote>
>>>>>>>> Don't know if I'm missing something obvious here.  I have a superset
>>>>>>>> in the rule itself. Each rule has a superset list. In this case how would I
>>>>>>>> use Wolfgang's solution. Its comparing through two arrays in runtime. I have
>>>>>>>> not been able to construct an array construct with specific values in the
>>>>>>>> rule itself.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>
>>>>
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>


-- 
Kumar Pandey
http://www.linkedin.com/in/kumarpandey
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20101014/b5bf864c/attachment.html 


More information about the rules-users mailing list