当前位置: 首页 > 知识库问答 >
问题:

Drools-在决策表中使用“from”

姜献
2023-03-14

我很难找到一条我知道有效的规则。drl表单,用于在决策表中工作。

这是我的drl形式的规则:

rule = "slider1"
    dialect "mvel"
    when
        $person: Person()
        ArrayList( size >= 2 )
            from collect( TestResult( name in ("TestA","TestB"), result == "high" )
                           from $person.getLabResults()
                        )
    then
        $person.setString("It worked");
end

以下是我在电子表格中尝试的内容:

CONDITION
-------------------
$person:Person()
-------------------
ArrayList( size >= 1 ) 
    from collect( TestResult( name in $param, result == 'high' ) 
       from $person.getLabResults() ) 
-------------------
Lab Names
-------------------
"TestA","TestB"

当我尝试从电子表格中运行规则时,我遇到以下错误:

Error while creating KieBase[Message [id=1, level=ERROR, path=com/creo/drools/decisiontables/sample-decision-table.xls, line=11, column=0
text=[ERR 102] Line 11:53 mismatched input 'from' in rule "Young safe package 1"], Message [id=2, level=ERROR, path=com/creo/drools/decisiontables/sample-decision-table.xls, line=0, column=0
text=Parser returned a null Package]]

from子句似乎有问题,但我不知道为什么。我尝试了无数次谷歌搜索,这是我唯一能找到的:http://drools-moved.46999.n3.nabble.com/Question-on-excel-decision-table-with-quot-variable-Type-from-collection-quot-td1186138.html

有什么想法吗?这让我发疯,为什么这在电子表格中不起作用。

共有1个答案

乌甫
2023-03-14

Drools电子表格编译器无法使用您想要的模式格式。如果您阅读留档,它会说CONDITION下的单元格提供模式CE,通常是类名,下面的下一个单元格指定一个约束,即必须适合添加到上面模式的一对括号之间的表达式。然后,占位符$参数将重复地被列下方的单元格值替换。

添加缺少的括号,您的条件将扩展为(无效)DRL代码

$person:Person( ArrayList( size >= 1 ) 
from collect( TestResult( name in ("TestA","TestB"), result == 'high' ) 
   from $person.getLabResults() ) )

这只会导致您报告的错误消息,原因是来自的放错了位置。

我有这个代码片段,如果您可以从任何地方导入类SpreadsheetCompiler,调用将显示生成的DRL,对或错。

private void testSpreadsheet(String dtPath){
  File dtf = new File( dtPath );
  InputStream is;
  try {
    is = new FileInputStream( dtf );
    SpreadsheetCompiler ssComp = new SpreadsheetCompiler();
    String s = ssComp.compile( is, InputType.XLS );
    System.out.println( "=== Begin generated DRL ===" );
    System.out.println( s );
    System.out.println( "=== End generated DRL ===" );
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}

如果需要用测试结果列表生成大量规则,那么应该查看Drools模板。使用此技术,可以将参数插入到任意规则文本中。其他解决方法也可能可行,例如,DRL和电子表格规则的组合。

 类似资料:
  • 当我尝试使用Drools引擎计算保险费时,我有一个潜在的性能/内存瓶颈。 我在我的项目中使用Drools将业务逻辑与java代码分开,我决定也将其用于溢价计算。 我是不是用错了口水 如何以更高性能的方式满足要求 详情如下: 我必须为给定的合同计算保险费。 合约配置有 productCode(来自字典的代码) 合同代码(来自字典的代码) 客户的个人资料(例如年龄、地址) 保险金额(SI) 等等 目前

  • 我有一个drools决策表,其中包含条件和位置类型 我的excel如下所示 设置参数的代码如下 我按要求提供的excel文件条件对象: 需求级别==$参数位置类型==$参数 当我像上面那样设置时,我得到以下错误: 创建KieBase时出错[消息[id=1,级别=错误,路径=规则.xls,行=8,列=0文本=[错误102]行8:14不匹配的输入'=='在规则“替换规则”中],消息[id=2,级别=错

  • 目前,我的drools决策表如下所示: 现在我想让这个决策表看起来像。drl文件中的下一个: 那么如何修改决策表来实现我的目标呢? 那就是如何在决策表文件中使用“exists”关键字? 提前感谢!

  • 场景如下: 我有一个java pojo类,具有2个变量和以及适当的getter和setter。我正在使用决策表流,我想要: 条件:当类型设置为“1”时 操作:调用name类的setName setter,并从excel中设置适当的参数 现在,我想在java中访问name的这个集值。 这就是我所做的: Name.java- MainClass.java-这有口水实现!! 决策表e:: http://

  • 使用Red Hat Decision Manager Workbench GUI,是否有方法导入java。时间世俗的ChronoUnit;到我的引导决策表中,这样我就可以修改这样的事实。。。 如果我使用Java应用程序实现这个,原始DRL看起来像这样。。。 如何让导入出现在创建的引导决策表用户交互界面或向导的DRL代码中?