2016-03-22 19 views
0

Ben Drools 6.3.0 Final kullanıyorum. BuDamlalar: LHS desen tanımlayıcı alın

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

gibi bir kural bize ayrıca, bu kurala benim KieSession inşa varsayalım bazı gerçekleri ekleyelim ve şimdi benim gerçekleri eşleşti tüm kurallarda/tüm kurallara kullanılan tanımlayıcıları bilmek istiyorum varsayarsak.

Buraya ulaşmak istediğim kişi $ ve $ çocuk.

Bir AgendaEventListener kullanarak tetiklenen kuralları ve kuralın adını alabildiğim olayın yanı sıra $ insan ve $ child için nesneleri alabildiğimi biliyorum. Ama eşleştiricilere $ kişiyi ve $ çocuğumu eşleştirmem için bir yol bulamadım. Bir hata ayıklayıcısını kullanarak bilgileri görebiliyorum ... aslında olaydan aldığım Kural, bu bilgiyi bulabildiğim bir lhsRoot'a sahip olan bir RuleImpl ... ama bu olması gerekenden çok daha karmaşık geliyor amaçlanan ve değil.

Bunun için daha iyi bir yol olmadığını merak ediyordum.

+0

Bu kuralla tamamen uyuşan bilgi ile ne yapmak istersiniz? – laune

+0

RuleImpl ve GroupElement, kamuya açık olmayan API sınıflarıdır; bu, bunların bildirimde bulunulmadan değiştirilebileceği anlamına gelir. Standart tavsiye, bu sınıflar üzerindeki herhangi bir ciddi uygulama programına dayanmamaktır. – laune

+0

Sonuç için kendi sistemimi sağlamalıyım, bu yüzden eşleşen değerler ve kuralda kullanılan isimlere ihtiyacım var. Bunun için bir kamu API'sı olduğunu umuyorum, ama eğer değilse, o zaman Java tüm ihtiyaçları karşılamak için yeterli olmasaydı dahili – blackdrag

cevap

2

İhtiyacınız Drools'un public API'si kullanılarak kolayca gerçekleştirilebilir. Doğru yere (AgendaEventListener) bakıyorsunuz ama Match.getObjects() ihtiyacınız olan şey değil. İhtiyacınız olan şey, Match.getDeclarationIds() (tanımlayıcıların listesini almak) ve daha sonra Match.getDeclarationValue(String id) (her tanımlayıcının değerini almak için) kombinasyonudur.

@laune belirtildiği gibi
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"); 
    } 
}); 

, ayrıca önceki çözümün bir kural aktive maçın bir örneğini alabilirsiniz: Bir örnek olarak, böyle konsolda bu bilgileri kaydeder bir AgendaEventListener nasıl görüneceğini kendileri kurallar. Bu durumda, Eşleme nesnesine drools.getMatch() üzerinden erişilebilir.

Yardım edin,

+0

GetDeclarationIds() ile benim sorunum, benim durumumda boş bir liste dönmek gibi görünüyordu – blackdrag

+0

oldu mu? Ya da hala? –