我有5种事实类型:BaseFact,AFact,BFact,CFact和DFact。
AFact,BFact,CFact和DFact都继承自BaseFact。
我有一些在BaseFacts上运行的规则,我不能在CFacts或DFacts上运行。
修改BaseFact规则的最佳方法是什么,以便它们只能在BaseFacts,AFacts和BFacts上运行。
我可以检查某种instanceOf函数,如下所示吗?
rule "BaseRule"
when
fact : BaseFact(this instanceOf AFact || this instanceOf BFact)
...
then
...
end
或者我是否需要将此规则拆分为2条新规则,对于AFact和BFact?
答案 0 :(得分:2)
即使没有instanceOf
运算符,也有几种方法可以实现您的目标。
这些是一些想法:
rule "BaseRule"
when
fact : BaseFact(class == AFact.class || == BFact.class)
...
then
//note that the variable fact is still of type BaseFact
...
end
更糟糕的版本:
rule "BaseRule"
when
fact : BaseFact()
not CFact(this == fact)
not DFact(this == fact)
...
then
//note that the variable fact is still of type BaseFact
...
end
或者:
rule "BaseRule"
when
AFact() OR
BFact()
...
then
//note you can't bind a variable to AFact or BFact
...
end
如果你只想要匹配2种具体类型,那么拥有2个单独的规则也不是一个坏主意。
希望它有所帮助,
答案 1 :(得分:0)
快速更新:我还可以使用:
rule "MyRow"
dialect "mvel"
when
f1 : Wrapper( eval( nestedProperty#MyNestedClass ), ... )
then
...
end
这对于测试(嵌套)属性类非常方便。