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

Drools-如何检查决策表中是否存在事实,drools,xls,Drools,Xls,我正在使用Drools 5.5.0,我有一个决策表,如下所示: 当我运行规则引擎时,我一次只插入一个SecurityContext,一次插入一个JSONWrapper 单从这个表来看,我的所有规则都不会被炒鱿鱼(不过它们都会被评估)。我相信这是因为对于第二个条件,每个角色/规则的单元格都是空白的 这就是我想要的,在DRL中: package com.acme.security.rules.widget; import com.acme.test.RuleTableTest.SecurityC

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

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

单从这个表来看,我的所有规则都不会被炒鱿鱼(不过它们都会被评估)。我相信这是因为对于第二个条件,每个角色/规则的单元格都是空白的

这就是我想要的,在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中一样)我需要这个对象,这样我就可以在操作语句中将它用作输出。为了简单起见,我还尝试将列中每个规则的单元格留空。

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

包含仅存在事实的条件的有点做作的变通方法如下所示:

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

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

我知道现在对于原始海报来说已经太晚了,但面对类似的问题,我的解决方案是在该对象中查找一个肯定不会为null的值。例如:

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文件看起来像这样:

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


如果这些对象上没有强制参数,甚至可以跳过内部参数并检查SecurityContext及其本身是否为null。或者,您可以检查“exists SecurityContext”。

这太愚蠢了,Drools不会以更明显的方式在决策表中做一些在DRL中很容易做到的事情。然而,我认为您的解决方案更为理想,因为在我的描述单元中,我使用了“下面的标记强制包含”这样的措辞,因此很明显,如果没有任何内容,规则就不会被取消。好主意。