2016-03-22 50 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怎麼會是這樣的:

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"); 
    } 
}); 

正如@laune提到的,你還可以得到在的RHS中激活的規則匹配的實例規則自己。在這種情況下,Match對象可通過drools.getMatch()訪問。

希望它有幫助,

+0

我的問題與getDeclarationIds()是,它似乎返回一個空列表在我的情況下 – blackdrag

+0

是?還是仍然是? –