2016-03-08 2 views
0

Existe-t-il un moyen de baver pour vérifier un ensemble de conditions, plutôt qu'une paire de conditions? Ce que je veux dire par ceci est disons que j'ai un type de fait appelé Ticket, et j'ai inséré deux faits de billet avec le même champ de propriétaire; comment puis-je empêcher la règle suivante de tirer deux fois? (Une fois où A = $ t1, B = t2 $, et une fois où B = t1 $, A = t2 $)Drools: empêcher le tir pour chaque permutation d'une règle

rule "two tickets purchased by same person" 
when 
     $t1 : Ticket($o : owner) 
     $t2 : Ticket(owner == $o, this != $t1) 
then 
    do something... 
end 

Il existe une multitude de façons de le faire avec des constructions non-Drools (membre drapeau de la règle flips par exemple), mais est-il un moyen de faire ce type de contrôle avec un Drools natif construire (et de garder les faits dans la base de connaissances), plutôt que d'utiliser une solution java

Merci

Répondre

1

Le modèle de conception standard consiste à utiliser un attribut clé pour forcer un ordre sur la paire. Les billets pourraient avoir un numéro de série:

$t1 : Ticket($o : owner, $sno: serialNumber) 
    $t2 : Ticket(owner == $o, serialNumber > $sno) 

Ceci élimine la nécessité de la contrainte de forcer des objets différents. Mais trois tickets ou plus créeraient toujours un problème similaire. Par conséquent, vous pouvez également garder une trace des billets d'un propriétaire:

rule "insert Owner" 
when 
    $t: Ticket($o: owner) 
    not TicketSet(owner == $o) 
then 
    insert(new TicketSet($t)); 
end 

rule "more tickets of one Owner" 
when 
    $t: Ticket($o: owner) 
    $s: TicketSet(owner == $o, set not contains $t) 
then 
    modify($s){ add($t) } 
    // $o buys n-th ticket 
end