Drools - 如何检查决策表中是否存在事实

时间:2015-07-08 18:30:23

标签: drools xls

我正在使用Drools 5.5.0,我有一个决策表,如下所示:

Example Drools Decision Table

当我运行规则引擎时,我一次只插入一个SecurityContextJSONWrapper

仅基于此表,我的规则都没有被解雇(但是它们都得到了评估)。我相信这是因为对于第二个条件,每个角色/规则的单元格都是空白的。

这就是我想要的,在DRL中:

package com.acme.security.rules.widget;

import com.acme.test.RuleTableTest.SecurityContext; 
import com.acme.test.RuleTableTest.JSONWrapper;

rule "widget_accessibility_store_manager"
  when
    $sc : SecurityContext()
    $output : JSONWrapper()
    eval($sc.hasRole("Store Manager"))
  then
    $output.setFeatureVisibility("feature1", "yes");
    $output.setFeatureVisibility("feature2", "yes");
    $output.setFeatureVisibility("feature3", "yes");
    $output.setFeatureVisibility("feature4", "yes");
    $output.setFeatureVisibility("feature5", "yes");
end

这条规则很好。

如何在我的决策表中只检查对象是否存在,而没有任何其他约束? (就像在我的DRL中一样)我需要这个对象,所以我可以在动作语句中将它用作输出。为简单起见,我还试图将列中的每个规则的单元格留空。

2 个答案:

答案 0 :(得分:2)

创建"输出对象"会更方便。在右侧和侧面,您可以插入它或将其传递给全局集合。

仅仅存在一个事实包含条件的有点人为的解决方法如下:

CONDITION
$output : JSONWrapper
/*$param*/
mark below to force inclusion
x

请注意,您可以垂直连接单元格。

答案 1 :(得分:0)

我知道此时的原始海报为时已晚,但遇到类似的问题我的解决方案是在该对象中寻找一个肯定不会为空的值。例如:

rule "widget_accessibility_store_manager"
when
    $sc : SecurityContext(role != null)
    $output : JSONWrapper(featureVisibility!=null)
    eval($sc.hasRole("Store Manager"))

then
    $output.setFeatureVisibility("feature1", "yes");
    $output.setFeatureVisibility("feature2", "yes");
    $output.setFeatureVisibility("feature3", "yes");
    $output.setFeatureVisibility("feature4", "yes");
    $output.setFeatureVisibility("feature5", "yes");
end

然后你的excel文件看起来像这样:

enter image description here

如果这些对象上没有必需参数,您甚至可以跳过内部参数并检查SecurityContext和它本身是否为空。或者,您可以检查“存在SecurityContext”。