我想创建更通用的规则,这意味着它应该验证字段和值。按照我的POJO结构。
public class RulesModel
private String field;
private List<String> values;
// other stuff
而我的规则
rule "sample"
when
$rule : RulesModel( field == "source", values contains "facebook", values contains "youtube", value not contains "instagram" )
then
// actions
end
验证单个字段工作正常,但我想验证RulesModel的多个字段。所以我希望创建POJO
public class RulesModelList {
private List<RulesModel> ruleList;
// Getter & Setter
}
所以现在当我使用RulesModelList类传递RulesModel列表时,规则应该像下面这样验证
$rule : RulesModel( field == "source", values contains "facebook") && $rule : RulesModel( field == "createdBy", values contains "admin")
如何在Drools中进行验证?
先谢谢你。
如果你想做的只是验证这两个(或三个或任意多个)RulesModel是否在列表中,这很简单。
// Example from question
rule "Verify Facebook source and admin createdBy"
when
RulesModelList( $list: ruleList)
exists(RulesModel( field == "source", values contains "facebook") from $list)
exists(RulesModel( field == "createdBy", values contains "admin") from $list)
then
// do something
end
基本上,我从RulesModelList输入中得到RulesModel列表,然后分配给 $list
. 然后我验证是否存在一个与我的 "source "标准相匹配的RulesModel实例,然后是一个与 "createdBy "标准相匹配的实例。
在这个例子中,我使用了 exists()
而不是赋值一个变量,因为我的示例规则不需要使用右侧的RulesModel实例。如果你 做 需要对RulesModel实例做一些事情时,只需简单地替换掉 exists()
这样的任务。
$source: RulesModel( field == "source", values contains "facebook") from $list
$createdBy: RulesModel( field == "createdBy", values contains "admin") from $list
除非你想对列表进行迭代,并找到符合特定标准的东西,否则没有必要进行累加。例如,假设其中一个 "字段 "的值是 "updateBy",而且可以有多个RulesModel实例具有该字段名。要得到字段名为 "updateBy "的RulesModel实例的子集,你可以使用accumulate,Mykhaylo在他的回答中演示了这一点。
但如果你想做的只是验证一个列表是否包含一个符合你的标准的对象,那么 accumulate 是矫枉过正的,这里是合适的解决方案。
你可以 使用java方法 在当块,例如 CollectionUtils.intersection
import static org.apache.commons.collections4.CollectionUtils.intersection;
...
$rule : RulesModel( field == "source", !intersection(values, valuesToCheck).isEmpty())
您可以使用 forAll和积累
RulesModelList($ruleList: ruleList)
$matchingList: List() from accumulate (
$model: RulesModel(field == "source", values contains "facebook", values contains "youtube", value not contains "instagram") from $ruleList,
accumulateList($model)
)