将(标签)列表与另一个列表匹配并检测公共元素的存在

时间:2012-02-11 07:46:06

标签: drools drools-planner

我的要求是匹配标签。在该示例中,此特定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,但他们会检查标量与集合,而不是集合与集合。

我看到两种可能的方式:

  1. 引入一个函数contains并告诉Drools将其用于真值检查
  2. boolean isIntersecting(list,list)实现为字符串而不是列表,将TeacherHour.attributes[]实现为可以匹配该列表的正则表达式

1 个答案:

答案 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 ) )
...