[rules-users] using complex evaluate expressions with DSL

maverik j maverikj348 at gmail.com
Wed Jan 5 01:35:17 EST 2011


Ohh ..that was tricky - I neeed to read this sincerely :)

thanks a ton for all your help and time !!!!

Thanks & Regards,
Maverik

2011/1/4 Wolfgang Laun <wolfgang.laun at gmail.com>

> You have omitted the regular expressions from some of the variable
> definitions
> in DSL entries:
>
> [when][] {attr:\S+} follows pattern {x:\S+} =
> startsWithFunction({attr},{x})
>
> Restore them all, and it's OK.
>
>
> -W
>
>
>
> 2011/1/4 maverik j <maverikj348 at gmail.com>
>
>> Here is the complete DSL/DSLR
>>
>> DSLr:
>> rule "Your First Rule"
>>
>>  when
>>     There is a Department
>>     There is at least one Person
>>     - with a valid subOrdinate
>>     - check that name follows pattern "M"
>> then
>>    >System.out.println("Test Generic Cosntranit done !!!");
>> end
>>
>> DSL:
>>  [keyword][]check that {conditions}= eval( {conditions} )
>> [keyword][]AND = &&
>> [keyword][]OR  = ||
>> [when][][Tt]here is an? {entity}= {entity}: {entity}()
>> [when][][Tt]here is at least one {entity}= exists {entity}: {entity}()
>> [when][]the {entity:\w+}'s {attr:\w+} = {entity}.get{attr}()
>> [when][]- with {attr} equal to {value} = {attr} == {value}
>> [when][]- with a valid {attr} = {attr} != null
>>
>> [when][]- with {attr} not equal to {value} = {attr} != {value}
>> [when][]- eval\( {whatever} \)= eval( {whatever} )
>> [when][] {attr} equals {value} = {attr}.equals({value})
>> [when][] {attr} is valid  =  {attr} != null
>> [when][] {attr} follows pattern {x} =  startsWithFunction({attr},{x})
>>
>> Function used in drl is:
>> function boolean startsWithFunction(String value, String beginning) {
>>  if (value == null) return false;
>>  if (beginning == null) return false;
>>  return value.startsWith(beginning);
>> }
>> I am using drools version 5.1.1
>>
>> Thanks & Regards,
>> -Maverik
>>
>> 2011/1/4 Wolfgang Laun <wolfgang.laun at gmail.com>
>>
>>> Do you have any comments ("#..." or "//...") between when and then? If
>>> so, please remove and try again.
>>>
>>> If this doesn't fix it, please post completely and exactly
>>> - the rule from the DSLR
>>> - the full DSL
>>> - Drools version.
>>>
>>> Thanks
>>> -W
>>>
>>>
>>>
>>>
>>> 2011/1/4 maverik j <maverikj348 at gmail.com>
>>>
>>>>
>>>>
>>>> 2011/1/4 Wolfgang Laun <wolfgang.laun at gmail.com>
>>>>
>>>>
>>>>>
>>>>> 2011/1/4 maverik j <maverikj348 at gmail.com>
>>>>>
>>>>>  is there any restriction in terms of using custom function in
>>>>>> condition etc.
>>>>>> If I add function evaluation to conditions its messing up with dsl.
>>>>>> For pattern matching if I use custom function defined in drl then its not
>>>>>> able to parse that properly
>>>>>>
>>>>>> [when][] {attr:\S+} follows pattern {pattern:\S+} =
>>>>>> funcToEvalPattern({attr},( {pattern} )
>>>>>>
>>>>>
>>>>> Is this exactly what you have in the DSL definition? It's syntactically
>>>>> incorrect.
>>>>>
>>>>
>>>>
>>>>>   Sorry for that, it is actually
>>>>>
>>>>
>>>>
>>>>>  [when][] {*attr*} follows pattern {pattern} = startsWithFunction( {*
>>>>> attr*}, {pattern} )
>>>>>>
>>>>>>  and is being added as last statement in DSL (for testing purpose I
>>>>>> am using same dsl as you have shown)
>>>>>>
>>>>>
>>>>
>>>>>    in this case it is getting translated to
>>>>>> exists(Person:Person(subordinate != null , startsWithFunction( *eval*(
>>>>>> name, "I" ) ) )
>>>>>>  where as I was hoping this to be
>>>>>> exists(Person:Person(subordinate != null , *eval *(startsWithFunction(
>>>>>> name, "I" ) ) )
>>>>>>
>>>>>>
>>>>>
>>>>> I cannot reproduce this. But it may depend on the order of your entries
>>>>> in you DSL file.
>>>>>
>>>>> Actually I tried changing order as well but didnt worked. I have
>>>> actually defined these common functions in drl and added that to
>>>> knowledgebase along with these DSL and DSLR.
>>>>
>>>>
>>>>
>>>>>  -W
>>>>>
>>>>>
>>>>>
>>>>>> Regards,
>>>>>> -Maverik
>>>>>>
>>>>>> On Tue, Jan 4, 2011 at 12:24 PM, maverik j <maverikj348 at gmail.com>wrote:
>>>>>>
>>>>>>> cool...this was of great help, I will try this out I think it shoudl
>>>>>>> solve the purpose.
>>>>>>>
>>>>>>> Thanks once again,
>>>>>>> Maverik
>>>>>>>
>>>>>>> 2011/1/3 Wolfgang Laun <wolfgang.laun at gmail.com>
>>>>>>>
>>>>>>> Try using eval as a last resort. A better (smaller, more robust) DSL
>>>>>>>> can be designed around facts and their attributes.
>>>>>>>>
>>>>>>>> "||" (and "OR") can be used, but setting parentheses in order to get
>>>>>>>> the priority right is difficult. In constraints, you may have to resort to
>>>>>>>> "memberof" or "not memberof".
>>>>>>>>
>>>>>>>> Your sample isn't self-contained. But I think that the following DSL
>>>>>>>> and the DSLR might give you some ideas how to proceed.
>>>>>>>>
>>>>>>>> [keyword][]check that {conditions}= eval( {conditions} )
>>>>>>>> [keyword][]AND = &&
>>>>>>>> [keyword][]OR  = ||
>>>>>>>>
>>>>>>>> [when][][Tt]here is an? {entity}= {entity}: {entity}()
>>>>>>>> [when][][Tt]here is at least one {entity}= exists {entity}:
>>>>>>>> {entity}()
>>>>>>>>
>>>>>>>> [when][]the {entity:\w+}'s {attr:\w+} = {entity}.get{attr}()
>>>>>>>>
>>>>>>>> [when][]- with a valid {attr} = {attr}: {attr} != null
>>>>>>>> [when][]- with {attr} not equal to {value} = {attr} != {value}
>>>>>>>> [when][]- eval\( {whatever} \)=eval( {whatever} )
>>>>>>>>
>>>>>>>> [when][] {attr:\S+} follows pattern {pattern:\S+} =  {attr}.matches(
>>>>>>>> {pattern} )
>>>>>>>> [when][] {attr:\S+} not equals? {value:\S+} = ! {attr}.equals(
>>>>>>>> {value} )
>>>>>>>> [when][] {attr:\S+} is valid  =  {attr} != null
>>>>>>>>
>>>>>>>> rule "Rule 5"
>>>>>>>> when
>>>>>>>>     There is a Department
>>>>>>>>     There is at least one Person
>>>>>>>>     - with name not equal to "xxx"
>>>>>>>>     - with a valid subordinate
>>>>>>>>     - check that the Person's Id is valid AND the Department's Id
>>>>>>>> follows pattern "I" AND the Department's HeadOfDpt not equal name
>>>>>>>> then
>>>>>>>> end
>>>>>>>>
>>>>>>>> Notice that "-check that..." must be written as a single line.
>>>>>>>>
>>>>>>>> -W
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2011/1/3 maverik j <maverikj348 at gmail.com>
>>>>>>>>
>>>>>>>>>   Hi,
>>>>>>>>>
>>>>>>>>>  We are planning to use DSL/DSRL approach with generic DSL template
>>>>>>>>> like say
>>>>>>>>>
>>>>>>>>> [condition][]The {object} has valid {field}={object}({field} !=
>>>>>>>>> null )
>>>>>>>>>
>>>>>>>>> [condition][]there is object {*obj*} that = {*obj*}()
>>>>>>>>>
>>>>>>>>> [condition][]- has {*attr*} equal {*val*} = {*attr*} == {*val*}
>>>>>>>>>
>>>>>>>>> [condition][]- has valid {*attr*} = {*attr*} != null
>>>>>>>>>
>>>>>>>>> [condition][]- and has {*attr*} equal {value}= && {*attr*} ==
>>>>>>>>> {value}
>>>>>>>>>
>>>>>>>>> But there are quite few of requirements like to have DSL rules that
>>>>>>>>> can generate expression as follows:
>>>>>>>>> exists Employee(
>>>>>>>>>    attribute name not equals "xxx"
>>>>>>>>>    && the attribute subOrdinate is not null
>>>>>>>>>    && eval(
>>>>>>>>>    the attribute $dept.getId() is not null
>>>>>>>>>    && attribute $dept.getId() follows pattern "I"
>>>>>>>>>    && ( ! (the attribute $dept.getHeadOfDpt() equals name)
>>>>>>>>>    )
>>>>>>>>> )
>>>>>>>>>
>>>>>>>>> I am not sure if this is possible with DSL. Using '-' operator we
>>>>>>>>> cannot really add '&&', '||' conditions it by-default expands to ','
>>>>>>>>> separated and conditions. And wirtting generic rules with and/or is not
>>>>>>>>> really dynamic to allow any number of expressions in evaluation.
>>>>>>>>>
>>>>>>>>> i am struggling to get this run since long time so any
>>>>>>>>> help/thoughts on this would be  highly appriciable !!!
>>>>>>>>>
>>>>>>>>> Thanks & Regards,
>>>>>>>>> -Maverik
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> 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
>>>>
>>>>
>>>
>>> _______________________________________________
>>> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110105/c256532c/attachment.html 


More information about the rules-users mailing list