Java-通用Drools规则

Java-通用Drools规则,java,drools,rules,rule-engine,Java,Drools,Rules,Rule Engine,我想创建更通用的规则格式,这意味着它应该是验证字段和值。遵循我的POJO结构 public class RulesModel private String field; private List<String> values; // other stuff 验证单个字段很好,但我想验证RulesModel的多个字段。 因此,我希望创建POJO public class RulesModelList { private List<RulesModel> r

我想创建更通用的规则格式,这意味着它应该是验证字段和值。遵循我的POJO结构

 public class RulesModel
private String field;
private List<String> values;
// other stuff  
验证单个字段很好,但我想验证RulesModel的多个字段。 因此,我希望创建POJO

public class RulesModelList {

    private List<RulesModel> ruleList;
    // Getter & Setter
}
如何在Drools中验证这一点

提前谢谢

例如,您可以在when块中


您可以使用


如果您只想验证列表中是否有这两个(或三个或多个)规则模型,那么很简单:

// 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
。然后,我验证是否存在与我的“源”条件匹配的RulesModel实例,以及是否存在与“createdBy”条件匹配的RulesModel实例

在示例中,我使用了
exists()
而不是赋值变量,因为我的示例规则不需要使用右侧的RulesModel实例。如果确实需要对RulesModel实例执行某些操作,只需将
exists()
替换为如下赋值:

$source: RulesModel( field == "source", values contains "facebook") from $list
$createdBy: RulesModel( field == "createdBy", values contains "admin") from $list
除非您尝试遍历列表并找到符合特定条件的内容,否则不需要进行累积。例如,假设其中一个“field”值是“updatedBy”,并且可以有多个具有该字段名的RulesModel实例。要获得字段名为“updatedBy”的RulesModel实例的子集,可以使用accumulate,正如Mykhaylo在回答中所演示的那样


但是,如果您只想验证列表中是否包含符合条件的对象,则“累积”是多余的,这是合适的解决方案。

我将一次性比较RuleModel对象列表<代码>$rule:RulesModel(字段==“source”,值包含“facebook”)&&$rule2:RulesModel(字段==“createdBy”,值包含“admin”)&&$rule3:RulesModel(字段==“priority”,值>10)要验证多个字段,不需要模型集合。如果您有一组模型,并且希望找到所需的模型,那么这是完全不同的需求和方法。你可以用
import static org.apache.commons.collections4.CollectionUtils.intersection;
...
$rule : RulesModel( field == "source", !intersection(values, valuesToCheck).isEmpty())
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)
)
// 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
$source: RulesModel( field == "source", values contains "facebook") from $list
$createdBy: RulesModel( field == "createdBy", values contains "admin") from $list