Re: [rules-users] how do I add not exists contraint in dslr
I tried with same example as in http://permalink.gmane.org/gmane.comp.java.drools.user/23689 just changed the exists in this example to not(exists) Regards, -maverik 2011/1/11 Wolfgang Laun wolfgang.l...@gmail.com Don't use not(exists( X() )). not( X() ) means there is no X. The error may be due to constraints, but you'd have to show us the entire DSLR condition and its DSL definition. -W 2011/1/11 maverik j maverikj...@gmail.com Hi, I have been trying to add not exists constraint in dslr but its failing to parse the dslr. Here is what I am trying to do in DSLR [when][][*Tt*]here is at least one {entity}= not(exists {entity}: {entity}()) If I simply use the exists constraint here then it works well. But then after adding not to it, its not getting parsed correctly. error I am geeting is: [10,27]: [ERR 102] Line 10:27 mismatched input ',' expecting ')' in rule Rule1 in pattern Person not sure whats going wrong here, if it is expected to work this way? thanks, -m ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] using complex evaluate expressions with DSL
2011/1/4 Wolfgang Laun wolfgang.l...@gmail.com 2011/1/4 maverik j maverikj...@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 maverikj...@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.l...@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 maverikj...@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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users
Re: [rules-users] using complex evaluate expressions with DSL
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.l...@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 maverikj...@gmail.com 2011/1/4 Wolfgang Laun wolfgang.l...@gmail.com 2011/1/4 maverik j maverikj...@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 maverikj...@gmail.comwrote: 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.l...@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 maverikj...@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
Re: [rules-users] using complex evaluate expressions with DSL
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.l...@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 maverikj...@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.l...@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 maverikj...@gmail.com 2011/1/4 Wolfgang Laun wolfgang.l...@gmail.com 2011/1/4 maverik j maverikj...@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 maverikj...@gmail.comwrote: 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.l...@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
[rules-users] using complex evaluate expressions with DSL
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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] using complex evaluate expressions with DSL
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.l...@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 maverikj...@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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users