2012-02-11 5 views
1

私の要件はタグと一致させることです。この例では、この特定のHourConstraintHour(23)に割り当てられたTeacherHourをチェックします。(タグの)リストを他のタグと照合して共通要素の存在を検出する

具体的には、値["asst_ct","teacher_john_smith"]ためTeacherHour.attributes["tags"]をチェックしは、この場合("asst_ct""teacher_john_smith"両方)に少なくとも1個の一致二検出します。

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

質問:はどのように私は2つのリストの間共通の要素の(真または偽)の存在を検出するのですか?

DroolsエキスパートはmemberOfcontainsですが、スカラーとコレクションをチェックします。コレクションと決してコレクションではありません。

私は2つの潜在的な方法を参照してください。

  1. は機能boolean isIntersecting(list,list)を導入し、真実は
  2. をチェックするために一致させることができ、正規表現としてリストの代わりに文字列としてTeacherHour.attributes[]HourConstraint.valueslistを実装することを使用するためにはDroolsを伝えますそのリスト

答えて

2

いくつかのオプションがあります。ほとんどまっすぐ進むがあなたのためにそれを行うためにコレクションクラスを使用することです。これは、あなたのルールで頻繁に使用すると何かあれば

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

+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 –

関連する問題