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

Wolfgang Laun wolfgang.laun at gmail.com
Fri Oct 15 02:54:01 EDT 2010


All simple field constraints (the expressions you write between commas in a
pattern) must follow the same
syntactic pattern, which is

  [ <variable> ':' ] <fieldname> <restriction>

This means that you may use a binding (e.g. "$foo :"), but the next thing
must be a field name from the
fact class. The <restriction> can have many forms; one of them is a name
denoting an operator
followed by the other operand, where you have a little more freedom, e.g.,
by using a bound variable
or an access to a field or other forms.

Hence, not being able to reverse the operands of subsetOf is not a compiler
bug; it is a (perhaps
regrettable) consequence of the overall structure of constraints.

Thus, if you need an operator supersetOf (which is to subsetOf just like >=
is to <=) you'll have
to define it, too. This is simple, since it is practically the same as
subsetOf, with some operand
swapping down in the works.

Cheers
Wolfgang



2010/10/14 Kumar Pandey <kumar.pandey at gmail.com>

> 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
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20101015/42db0b96/attachment.html 


More information about the rules-users mailing list