将对象列表中的字段与 Drools 中的字符串列表进行比较
Comparing a field in a List of objects with a List of Strings in Drools
假设我在 Drools 中有一个 Policy
对象,该对象包含一个 List
个 Cover
个对象,称为 covers
和一个 List
个 String
个对象,称为 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))
假设我在 Drools 中有一个 Policy
对象,该对象包含一个 List
个 Cover
个对象,称为 covers
和一个 List
个 String
个对象,称为 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))