1

我的要求是匹配标签。在示例中,此特定HourConstraint 检查TeacherHour分配给Hour(23).

具体来说,它会检查TeacherHour.attributes["tags"]["asst_ct","teacher_john_smith"]检测至少一个 match,在这种情况下是两个 match (both "asst_ct"and "teacher_john_smith")。

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"]

问题:如何检测两个列表之间是否存在共同元素(真或假)?

Drools Expert 有memberOfand contains,但他们检查标量与集合,从不检查集合与集合。

我看到了两种可能的方式:

  1. 引入一个函数boolean isIntersecting(list,list)并告诉 Drools 使用它来进行真实性检查
  2. 实现TeacherHour.attributes[]为字符串而不是列表,以及HourConstraint.valueslist可以匹配该列表的正则表达式
4

1 回答 1

3

有几个选项。最直接的是使用 Collections 类为您执行此操作:

rule X
when
    $t: TeacherHour( )
    HourConstraint( Collections.disjoint( $t.attributes["tags"], values_list ) == false )
...

如果这是您经常在规则中使用的东西,那么我建议将该函数包装在 Drools 支持的可插入运算符中。假设您将运算符命名为“相交”,然后您可以像这样编写规则:

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 ) )
...
于 2012-02-11T14:48:26.157 回答