2016-10-20 10 views
1

私はルールをたくさん持っており、私はそれらのためにいくつかのユニットテストを書こうとしています。私のテストでは、私はこれを使用しています:Droolsは、アジェンダフィルタを使用して特定のルールを起動すると、他のすべてのルールを検証するのはなぜですか?

int rulesFired = kSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule name 1")); 

私が気づいた事が返さ焼成ルールの量は1ですが、Droolsのは、まだ条件が満たされている他のルールに対して検証しようということです。私は時々、私のkSessionにユニットテストのために挿入しているものに基づいて条件が一致するので、私のルール名がアジェンダフィルタに定義されていない他のルールからエラーメッセージを受け取ることがあります。例えば

私が持っている:

rule "test1" 
    when 
     $var : Map(this["key"] == "gold") 
    then 
     do something 
    end 

rule "test2" 
    when 
     $var : Map(this["key"] == "gold" && this["other"] == "silver") 
    then 
     do something 
    end 

をし、ルール1のための私のテストで私は、「キー」とのマップを持っています。 "test1"のフィルタを使ってテストを実行すると、フィルタリングしているルールが "other"を気にしなくても、私のマップに "other"の値がないのでnullポインタを受け取ります

なぜこのようなことが起こりますか?私はどこにでもドキュメントを見つけることができません。 Droolsがフィルタリングする前に、DRLファイルのすべてのルールと構文を検証する必要があります。

答えて

1

ルール条件を評価するためのコードは、すべてのルールを組み合わせたもので、場合によってはパターンや制約などの条件の一部を組み合わせて全体の労力を軽減します。したがって、実行時に個々のルールの条件を抑止することはできません。

+0

ありがとうございます。私はそれを取るが、これはどこにも書かれていないが、ルール全体を評価する責任があるソースクラスで見ることができる。 – Seephor

+0

Reteとその細分化の仕方が文書化されています。そのアジェンダのフィルタはルールの発火にのみ影響します。 – laune

+0

@シーファーは、これを達成したいと思っています。異なる列を持つために例外をスローしているので。 – Neetika

関連する問題