这个drl应该编译吗?

时间:2014-06-09 20:54:53

标签: java drools mvel

我正在开发一个为Drools 5.5运行促销引擎系统的项目。在构建知识库时,我在尝试理解编译步骤时遇到了一些麻烦。

情况就是这样:我有一个drl,它在条件大小为> = int的列表上执行收集(LHS)。 生成drl的系统,做错了,现在我有运行时异常。现在,我正在尝试理解编译如何在这种情况下对drools起作用。

问题是,在这个集合中,drools 5.5编译器没有验证约束(大小> =某些东西,其中某些东西不是整数),并且异常只会在运行时爆炸:

$COLLECT_ALL : ArrayList (size >= something)
    from collect ( Product ( ... ) )

但是,在drools 5.0.0上验证了相同的代码,并且我可以在创建知识库之前删除此规则。

我不知道这是一个错误,还是只是对流口水的LHS的理解不足。

无论如何,这是我正在进行的验证步骤

 KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
 builder.add(ResourceFactory.newByteArrayResource(rule.getBytes()) , ResourceType.DRL);
 if (builder.hasErrors()) {
    createErrorMessage(builder);
 }

1 个答案:

答案 0 :(得分:0)

在5.0.0之后,DRL解析器已经进行了一系列改进,然后在(IIRC)5.2和5.3之间进行了彻底的重新设计。

为了理解在编译时和运行时5.5中的ArrayList(size >= something)会发生什么,人们必须知道“某事”是什么。完全讨论代替“某事”的一切都超出了范围,但是,根据经验,如果表达式是有效的Java,它应该编译而不是在运行时发牢骚,隆隆声或翻滚 - 更不用说“爆炸”了(让我们希望它不会破坏核心。)

<强>后来

原因是(在开发线的某处)已经进行了区分,而不是对集合应用“类型安全”,而默认情况下所有其他类都是“类型安全”,这意味着编译时检查。

您可以使用例如ArrayList将其添加到您的DRL文件中来启用此功能:

declare ArrayList
@typesafe( true )
end