,common
およびdistinct
の3つのプロパティを持つEvent
タイプがあるとします。目標は、火災Event
秒のサブセットは、それが次の基準を満たして存在していることをDroolsのルールで記述することです:Drools:イベントのセットがプロパティに対してn個の異なる値を持つ場合のルールの実行
Event
sが最後トン秒で起こったが、およびEvent
sconstraint
プロパティの値はとなりました。以前はでした。そして- 以前に共有する不明の値は
common
です。そして、ルールが発火した場合 distinct
プロパティ
ための少なくともn個異なる値がありますが、私たちはさらなる処理のため、参加イベントのセットを必要としています。
この問題にどのようにアプローチすることをお勧めしますか?
注1:この質問は、linkと多少似ていますが、スティーブの答えは有望そうですが不完全です。
注2:パフォーマンスは本質です。私たちはこの作業を行うルールをうまく開発しましたが、ルールベース全体のパフォーマンスを劇的に低下させるため、受け入れられません。
編集1:現在の(パフォーマンスの低い)ソリューションは、次のようになります。
rule ""
when
$event : Event(constraint == CONSTANT_VALUE)
$events : ArrayList() from collect(
Event(constraint == CONSTANT_VALUE,
common == $event.common)
over window:time(t))
$distinctVals : Set(size >= n) from accumulate(Event($d : distinct) from $events, collectSet($d))
then
// process $events
end
パフォーマンスを損なう最初の失敗は、これがt秒を超えていないことを確認せずに '$ event:Event'にラッチすることです。これにより、ソリューションが存在する場合とそうでない場合がある古いイベントに対してルールが実行され、ソリューションがある場合は繰り返し実行されます。 – laune
もう1つの間違いは、これがnよりも短い場合にArrayListを収集した後に停止しないことです。そのサイズがnを超える場合に限り、異なるn個の異なる値の少なくとも1つのサブセットを有することが可能である。 – laune
元のコードにはこれらの制約が含まれていますが、これらの制約から生じるパフォーマンスの向上はほとんど無視できます。私はこれを信じます - >「それは解決策がある場合には繰り返し実行されます」とエンジンが計算しようと試みた繰り返しのデカルト積は性能問題を作り出します。 – fzwd