首页 文章

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

提问于
浏览
1

我在获取我知道以.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 回答

  • 1

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

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

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

    由于错误放置 from ,这会导致您报告的错误消息 .

    我有这段代码,如果你可以从任何地方导入类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和电子表格规则的组合 .

相关问题