Drools - 在决定 table 中使用 "from"
Drools - Using "from" in decision table
我在获取一个我知道以 .drl 形式工作的规则来做出决定时遇到了一些麻烦 table。
这是我的 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
这是我正在尝试的传播方式sheet:
CONDITION
-------------------
$person:Person()
-------------------
ArrayList( size >= 1 )
from collect( TestResult( name in $param, result == 'high' )
from $person.getLabResults() )
-------------------
Lab Names
-------------------
"TestA","TestB"
当我尝试 运行 来自传播 sheet 的规则时,出现此错误:
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 子句似乎有问题,但我不知道为什么。我尝试了多次 google 搜索,这是我唯一能找到的东西:http://drools-moved.46999.n3.nabble.com/Question-on-excel-decision-table-with-quot-variable-Type-from-collection-quot-td1186138.html
有什么想法吗?这让我发疯为什么这在传播中不起作用 sheet.
Drools 电子表格编译器无法提供您想要的模式格式。如果您阅读文档,它会说 CONDITION 下的单元格提供模式 CE,通常是 class 名称,下面的下一个单元格指定 constraint,即添加到上述模式的一对括号 之间必须适合 的表达式。然后,占位符 $param
将重复被列下方的单元格值替换。
添加缺少的括号,您的条件扩展为(无效的)DRL 代码:
$person:Person( ArrayList( size >= 1 )
from collect( TestResult( name in ("TestA","TestB"), result == 'high' )
from $person.getLabResults() ) )
由于 from
.
放错了位置,这只会导致您报告的错误消息
我有这段代码,如果你可以从任何地方导入 class 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 和电子表格规则的组合。
我在获取一个我知道以 .drl 形式工作的规则来做出决定时遇到了一些麻烦 table。
这是我的 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
这是我正在尝试的传播方式sheet:
CONDITION
-------------------
$person:Person()
-------------------
ArrayList( size >= 1 )
from collect( TestResult( name in $param, result == 'high' )
from $person.getLabResults() )
-------------------
Lab Names
-------------------
"TestA","TestB"
当我尝试 运行 来自传播 sheet 的规则时,出现此错误:
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 子句似乎有问题,但我不知道为什么。我尝试了多次 google 搜索,这是我唯一能找到的东西:http://drools-moved.46999.n3.nabble.com/Question-on-excel-decision-table-with-quot-variable-Type-from-collection-quot-td1186138.html
有什么想法吗?这让我发疯为什么这在传播中不起作用 sheet.
Drools 电子表格编译器无法提供您想要的模式格式。如果您阅读文档,它会说 CONDITION 下的单元格提供模式 CE,通常是 class 名称,下面的下一个单元格指定 constraint,即添加到上述模式的一对括号 之间必须适合 的表达式。然后,占位符 $param
将重复被列下方的单元格值替换。
添加缺少的括号,您的条件扩展为(无效的)DRL 代码:
$person:Person( ArrayList( size >= 1 )
from collect( TestResult( name in ("TestA","TestB"), result == 'high' )
from $person.getLabResults() ) )
由于 from
.
我有这段代码,如果你可以从任何地方导入 class 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 和电子表格规则的组合。