2016-03-22 24 views
0

私はDrools 6.3.0 Finalを使用しています。私はこのDrools:LHSパターンから識別子を取得

rule "Child of Person over 18" 
when 
    $person : Person(age > 18) 
    $child : from $person.children 
then 
end 

のようなルールは、私たちはさらに、私はこのルールに私のKieSessionを構築すると仮定し、いくつかの事実を追加してみましょう、今、私は私の事実にマッチしたすべてのルールに/すべてのルールで使用される識別子を知ってほしいしていると仮定します。

ここで私が手に入れたいのは、$ personと$ childです。

私はAgendaEventListenerを使ってイベントを発生させ、ルールの名前と$ personと$ childのオブジェクトを取得できます。しかし、私は一致する人から$ personと$ childという識別子を取得する方法を見つけることができません。デバッガを使用すると、情報がそこにあるのがわかります...実際にイベントから得られるルールはRuleImplです。これはlhsRootを持っていますが、その情報を見つけることができます...しかし、これはもっと複雑です意図された方法ではありません。

だから私はそこにもっと良い方法がないのだろうかと思っていました。

+0

純粋にルールのローカルな情報でどうしたいですか? – laune

+0

RuleImplおよびGroupElementは非公開APIのクラスであり、予告なしに変更されることがあります。標準的なアドバイスは、これらのクラスで深刻なアプリケーションプログラミングをベースにしないようにすることです。 – laune

+0

私は自分のシステムを結果として提供する必要があります。そのため、ルールに使用されている値と一致する名前が必要です。私はこのための公開APIがあることを望んでいましたが、そうでなければ、それは内部でなければなりません – blackdrag

答えて

2

あなたの要件は、DroolsのパブリックAPIを使用することで簡単に達成できます。あなたは正しい場所(AgendaEventListener)を見ていましたが、Match.getObjects()は必要なものではありません。必要なのはMatch.getDeclarationIds()(識別子のリストを取得する)とMatch.getDeclarationValue(String id)(各識別子の値を取得する)の組み合わせです。例として、これはコンソールでこの情報をログに記録しますAgendaEventListenerは次のようになります方法です。述べたよう@laune

import org.kie.api.event.rule.BeforeMatchFiredEvent; 
import org.kie.api.event.rule.DefaultAgendaEventListener; 

... 

ksession.addEventListener(new DefaultAgendaEventListener() { 

    @Override 
    public void beforeMatchFired(BeforeMatchFiredEvent event) { 

     String ruleName = event.getMatch().getRule().getName(); 
     List<String> declarationIds = event.getMatch().getDeclarationIds(); 

     System.out.println("\n\n\tRule: "+ruleName); 

     for (String declarationId : declarationIds) { 
      Object declarationValue = event.getMatch().getDeclarationValue(declarationId); 

      System.out.println("\t\tId: "+declarationId); 
      System.out.println("\t\tValue: "+declarationValue); 
     } 
     System.out.println("\n\n"); 
    } 
}); 

、あなたものRHSにルールを有効に試合のインスタンスを取得することができますルールそのもの。この場合、Matchオブジェクトにはdrools.getMatch()でアクセスできます。

ご希望の場合は、

+0

getDeclarationIds()の問題は、私のケースで空のリストを返すようでした。 – blackdrag

+0

でしたか?それともまだですか? –

関連する問題