我的要求是匹配标签。在该示例中,此特定HourConstraint
会检查分配给TeacherHour
的{{1}}。
具体来说,它会Hour(23)
检查值TeacherHour.attributes["tags"]
,检测至少一个匹配,在这种情况下为两个["asst_ct","teacher_john_smith"]
和"asst_ct"
)。
"teacher_john_smith"
问题:如何检测两个列表之间公共元素的存在(真或假)?
Drools Expert有TeacherHour:
id: 47
assigned_hour: Null
attributes:Map<List<String>>
"tags":["asst_ct","no_strenuous_duties","kinda_boring","teacher_john_smith"]
"another_attribute":[...]
HourConstraint:
hour: Hour(23)
attribute: "tags"
values_list: ["asst_ct","teacher_john_smith"]
和memberOf
,但他们会检查标量与集合,而不是集合与集合。
我看到两种可能的方式:
contains
并告诉Drools将其用于真值检查boolean isIntersecting(list,list)
实现为字符串而不是列表,将TeacherHour.attributes[]
实现为可以匹配该列表的正则表达式答案 0 :(得分:2)
有几个选择。最直接的方法是使用Collections类为您做到这一点:
rule X
when
$t: TeacherHour( )
HourConstraint( Collections.disjoint( $t.attributes["tags"], values_list ) == false )
...
如果这是您在规则中经常使用的内容,那么我建议将该函数包装在Drools支持的可插入运算符中。假设您将运算符命名为“intersect”,然后您可以编写如下规则:
rule X
when
$t: TeacherHour( )
HourConstraint( values_list intersect $t.attributes["tags"] )
...
第三种选择是使用“from”,但在运行时效率较低,因为它会导致第一个列表上的迭代:
rule X
when
$t: TeacherHour( )
$tag : String() from $t.attributes["tags"]
exists( HourConstraint( values_list contains $tag ) )
...