Drools - 使用"来自"在决策表中

时间:2016-01-06 21:14:42

标签: java excel collections drools import-from-excel

我在获取我知道的规则时遇到了一些问题。在.drl表单中工作,在决策表中工作。

以下是drl形式的规则:

INSERT INTO District.resCount SUM(Select * FROM residences R WHERE R.dID = District.ID);

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

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"

似乎某些东西并没有正确使用from子句,但我不明白为什么。我尝试了很多谷歌搜索,这是我唯一能找到的东西:http://drools-moved.46999.n3.nabble.com/Question-on-excel-decision-table-with-quot-variable-Type-from-collection-quot-td1186138.html

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

1 个答案:

答案 0 :(得分: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和电子表格规则的组合。