Drools:测试/验证规则中的唯一LHS
是否可以测试一组规则的条件是否重叠?我当前问题的一个简化版本是,如果我有一组测试Person.age的规则,是否可以保证/验证/测试LHS最多只对一个规则有效 例如,这两条规则是“有效的”:Drools:测试/验证规则中的唯一LHS,drools,Drools,是否可以测试一组规则的条件是否重叠?我当前问题的一个简化版本是,如果我有一组测试Person.age的规则,是否可以保证/验证/测试LHS最多只对一个规则有效 例如,这两条规则是“有效的”: 规则“r1” 什么时候 个人(年龄>0岁和年龄=18岁和年龄0岁和年龄=8&&age
规则“r1”
什么时候
个人(年龄>0岁和年龄<18岁)
然后
//做点什么
结束
规则“r2”
什么时候
人(年龄>=18岁和年龄<65岁)
然后
//做点别的
结束
但以下情况并非如此:
rule "r1"
when
Person( age > 0 && age < 10 )
then
// do something
end
rule "r2"
when
Person( age >= 8 && age < 16 ) // range overlaps with r1!
then
// do something else
end
规则“r1”
什么时候
个人(年龄>0岁和年龄<10岁)
然后
//做点什么
结束
规则“r2”
什么时候
Person(年龄>=8&&age<16)//范围与r1重叠!
然后
//做点别的
结束
我知道我可以使用halt()来防止触发多个规则,我正在寻找方法来防止或至少警告触发多个规则的可能性。这样的重叠不一定是规则中的错误,因此您必须自己编写一些代码,根据您的设置检查错误 “稳定API”不提供访问已编译规则以检索约束的方法。您必须使用一些内部API类。编写此代码并进行测试(!)这可能比为您的规则开发可靠的测试需要付出更多的努力-无论如何,您都必须这样做
警告从一组规则中触发多个规则可以由事件侦听器直接完成。这样的重叠不一定是规则中的错误,因此您必须自己编写一些代码,根据设置检查错误 “稳定API”不提供访问已编译规则以检索约束的方法。您必须使用一些内部API类。编写此代码并进行测试(!)这可能比为您的规则开发可靠的测试需要付出更多的努力-无论如何,您都必须这样做
警告从一组规则中触发多个规则可以由事件侦听器直接完成。这样的重叠不一定是规则中的错误,因此您必须自己编写一些代码,根据设置检查错误 “稳定API”不提供访问已编译规则以检索约束的方法。您必须使用一些内部API类。编写此代码并进行测试(!)这可能比为您的规则开发可靠的测试需要付出更多的努力-无论如何,您都必须这样做
警告从一组规则中触发多个规则可以由事件侦听器直接完成。这样的重叠不一定是规则中的错误,因此您必须自己编写一些代码,根据设置检查错误 “稳定API”不提供访问已编译规则以检索约束的方法。您必须使用一些内部API类。编写此代码并进行测试(!)这可能比为您的规则开发可靠的测试需要付出更多的努力-无论如何,您都必须这样做
事件侦听器可以用一种简单的方式警告从一组规则中触发多个规则。我无法想象有一种方式在规则重叠时自动检测,因此,正如laune在回答中所说,您必须提出自己的测试用例等,并使用事件侦听器来提醒多个规则 为了防止触发第二个/第三个/etc规则,您可以插入在所有规则之间共享的控制事实(类似于,例如) 但它们将成为你规则条件的一部分。 所以你最终会添加一个条件,比如
not RuleHasFiredControlFact
给你的左手什么的
insert(new RuleHasFiredControlFact())
对于您的RHS(伪代码,不完整)我无法想象,如果存在规则重叠,会有一种“自动检测”的方式,因此正如laune在回答中所说,您必须拿出自己的测试用例等,并使用事件侦听器来提醒多个规则 为了防止触发第二个/第三个/etc规则,您可以插入在所有规则之间共享的控制事实(类似于,例如) 但它们将成为你规则条件的一部分。 所以你最终会添加一个条件,比如
not RuleHasFiredControlFact
给你的左手什么的
insert(new RuleHasFiredControlFact())
对于您的RHS(伪代码,不完整)我无法想象,如果存在规则重叠,会有一种“自动检测”的方式,因此正如laune在回答中所说,您必须拿出自己的测试用例等,并使用事件侦听器来提醒多个规则 为了防止触发第二个/第三个/etc规则,您可以插入在所有规则之间共享的控制事实(类似于,例如) 但它们将成为你规则条件的一部分。 所以你最终会添加一个条件,比如
not RuleHasFiredControlFact
给你的左手什么的
insert(new RuleHasFiredControlFact())
对于您的RHS(伪代码,不完整)我无法想象,如果存在规则重叠,会有一种“自动检测”的方式,因此正如laune在回答中所说,您必须拿出自己的测试用例等,并使用事件侦听器来提醒多个规则 为了防止触发第二个/第三个/etc规则,您可以插入在所有规则之间共享的控制事实(类似于,例如) 但它们将成为你规则条件的一部分。 所以你最终会添加一个条件,比如
not RuleHasFiredControlFact
给你的左手什么的
insert(new RuleHasFiredControlFact())
到您的RHS(伪代码,不完整)