2012-02-11 72 views
1

我的要求是匹配標籤。在該示例中,該特定HourConstraint檢查分配給Hour(23)TeacherHour匹配一個列表(標籤)與另一個列表並檢測是否存在共同元素

具體而言,它會檢查TeacherHour.attributes["tags"]爲值["asst_ct","teacher_john_smith"]在這種情況下(兩個"asst_ct""teacher_john_smith")ATLEAST一個匹配兩個檢測。

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

問題:如何檢測的共同元素的存在(true或false)兩個列表?

Drools Expert有memberOfcontains,但他們檢查標量vs集合,從來沒有集合vs集合。

我看到兩種可能方式:

  1. 引入功能boolean isIntersecting(list,list)告訴Drools的使用,對真理檢查
  2. 實現TeacherHour.attributes[]作爲一個字符串,而不是一個列表,並HourConstraint.valueslist爲正則表達式可以匹配該列表

回答

2

有幾個選項。最直接的方法是使用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"]) 
... 

第三種選擇,就是用「從」,但畢竟是低效率的運行,因爲它會導致對迭代第一個列表:

rule X 
when 
    $t: TeacherHour() 
    $tag : String() from $t.attributes["tags"] 
    exists(HourConstraint(values_list contains $tag)) 
... 
+0

我會去Collections.disjoint。我應該使用一組數據類型嗎?你也可以把我稱爲「可插拔運營商」嗎? – aitchnyu 2012-02-12 08:22:41

+1

試試這個:http://blog.athico.com/2010/06/creating-pluggable-oprators.html。或複製並粘貼此課程以適應您的需求:https://github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java – 2012-02-12 16:25:48