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(a)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(a)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(a)gmail.com>
>
>>
>>
>> 2011/1/4 Wolfgang Laun <wolfgang.laun(a)gmail.com>
>>
>>
>>>
>>> 2011/1/4 maverik j <maverikj348(a)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(a)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(a)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(a)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(a)lists.jboss.org
>>>>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> rules-users mailing list
>>>>>> rules-users(a)lists.jboss.org
>>>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>
>>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users(a)lists.jboss.org
>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>
>>>>
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users(a)lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users