将对象列表中的字段与 Drools 中的字符串列表进行比较

Comparing a field in a List of objects with a List of Strings in Drools

假设我在 Drools 中有一个 Policy 对象,该对象包含一个 ListCover 个对象,称为 covers 和一个 ListString 个对象,称为 requestedCovers.

Cover 对象包含 type 字段,这是一个 String 对象。

如果请求的封面与封面列表中的类型不匹配,我想触发规则。

rule "Add validation error for policies with requested covers that are not available"
when
    $p: Policy(available == true, $requestedCovers: requestedCovers, $covers: covers)
    $requestedCover: String() from $requestedCovers
    Cover(type not contains $requestedCover) from $covers 
then
    log.error("RHS rule not implemented yet. Found type {}.", $requestedCover);
end

然而这似乎触发每个封面都是封面列表。

如何创建这个规则?

您在这个笨重的对象中有两个列表,其中一个是另一个列表的一部分。你需要的是requestedCovers - covers.type的集合(一个集合差)。

在策略中或(作为静态)在单独的实用程序中将集合差异作为方法编写是小菜一碟 class。

如果你坚持使用 Drools,你将不得不

rule x
when
  Policy( available, $reqs: requestedCovers, $covs: covers )
  accumulate( Cover( $type: type ) from $covs;
              $covered: collectSet( $type ) )
  $s: String( this not memberOf $covered ) from $reqs
then
  ...$s is not covered...
end

未经测试!

终于搞定了,感谢@laune 的帮助

when
    $p: Policy(available == true, $requestedCovers: requestedCovers, $covers: covers)
    $requestedCover: String() from $requestedCovers
    $coverTypes: List(!this.isEmpty()) from accumulate(Cover($coverType: type) from $covers; collectList($coverType))
    eval(!$coverTypes.contains($requestedCover))