2016-07-22 12 views
0

1- Ist es möglich, in Drool nur ausgewählte Regeln für einen bestimmten Kunden auszulösen? Angenommen, ich habe 100 Regeln, sind dies Regeln von verschiedenen Kunden. Wenn also ein bestimmter Kunde die Anwendung öffnet, möchte ich nur die Regeln auslösen, die ihm gehören. Es kann möglich sein, dass eine Regel zu mehr als einem Kunden gehört.Auslösen ausgewählter Regeln in Drool

2 - Ich möchte eine Liste von Regeln erhalten, die für einen bestimmten Kunden gefeuert werden mussten, und eine Liste von Fakten, um diese Regeln auszulösen, so dass ich nur diese bestimmten Fakten aus meiner Datenbank abrufen kann. Nach dem Abrufen werden die für diesen Kunden spezifischen Regeln ausgelöst.

Antwort

0

Sie müssen die Eignerkunden zusammen mit den Regeln identifizieren oder Daten verwalten, die einem Kunden Regeln zuweisen. Ich denke, dass letzteres vorzuziehen ist, aber ich werde beide Lösungen skizzieren. In jedem Fall muss der Kunde durch eine Tatsache identifiziert werden.

rule "some rule" 
when 
    Customer(id in ("Smith&Co", "Brown&Sons", "Jones Inc.")) 
    ... 
then ... end 

an einen Kunden mit Regeln associcate Sie brauchen:

class Customer { 
    private String name; 
    private List<String> rules; 
    //... 
} 

und einen AgendaFilter schreiben

class RuleFilter implements AgendaFilter { 
    static List<Customer> customers = new ArrayList<>(); 
    static { 
     customers.add(...); 
     ... 
    } 
    static RuleFilter getFilterFor(String custname){ 
     for(Customer cust: customers){ 
      if(cust.getName().equals(custname)){ 
       return cust; 
      } 
     } 
     throw IllegalArgumentException("no customer: " + custname); 
    } 
    Customer current; 
    RuleFilter(Customer current){ 
     this.current = current; 
    } 
    // ... getters & setters 
    boolean accept(Match match){ 
     return current.getRules().contains(match.getRule().getName()); 
    } 
} 

und die Sitzung für einen Kunden betreiben eine Filterinstanz durch:

AgendaFilter currFilter = RuleFilter(getFilterFor(customername)); 
fireAllRules(currFilter); 
+0

Sie sagen also zu erstellen Agenda für jeden Kunden und feuern die Regeln auf der Grundlage der Tagesordnung ... – pratik2392

+0

Nein, das sage ich nicht. Ich sage, dass Sie eine Instanz eines Agendafilters abhängig vom Kunden erstellen sollten. – laune

+0

ok ... Ich denke, das wird für mich funktionieren können Sie einen Link teilen, wo ich die vollständige Implementierung des gleichen sehen und es weiter verstehen kann ... – pratik2392