1

私の要件はタグを一致させることです。この例では、この特定のはに割り当てられたをHourConstraint チェックします。TeacherHourHour(23)

具体的にはTeacherHour.attributes["tags"]、値をチェックし、["asst_ct","teacher_john_smith"]少なくとも1つの一致、この場合は2つ("asst_ct"との両方"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"]

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

Drools ExpertにはとがmemberOfありますcontainsが、スカラーとコレクションをチェックします。コレクションとコレクションをチェックすることはありません。

私は2つの潜在的な方法を見ています:

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

3 番目のオプションは、"from" を使用することですが、最初のリストで反復が発生するため、実行時の効率が低下します。

rule X
when
    $t: TeacherHour( )
    $tag : String() from $t.attributes["tags"]
    exists( HourConstraint( values_list contains $tag ) )
...
于 2012-02-11T14:48:26.157 に答える