2017-09-18 7 views
0

Considérons le scénario suivant dans Drools: Nous avons une règle, en comparant les objets de type A et B les uns contre les autres.Drools: Hiérarchisation des faits basée sur la valeur d'un champ

rule 1 
    when 
     $a : A() 
     $b : B($a.matches($b), flagged == false) 
    then 
     mofidy($b) { flag($a) } 
end 

Cependant, A objets ont un champ appelé priority, et quand un B arrive dans la mémoire de travail, un correspondant A avec la plus haute priorité devrait le signaler, au-dessus de tous les autres A s correspondant. Comment est-ce possible dans Drools? Comment cela affecte-t-il les performances?

Répondre

1

En supposant que B.flag() est mise en son flagged attribut true, vous pouvez essayer quelque chose comme ceci: avec une priorité

rule 1 
when 
    $a : A() 
    not A(this != $a, priority > $a.priority) 
    $b : B($a.matches($b), flagged == false) 
then 
    mofidy($b) { flag($a) } 
end 

Une chose à remarquer dans cet exemple est que si un Un objet est inséré, tout B qui était déjà marqué avec un A plus bas ne sera pas modifié.

Si vous avez besoin de changer le pavillon vôtre hôtes, vous pouvez essayer quelque chose comme ceci:

rule 1 
when 
    $a : A() 
    not A(this != $a, priority > $a.priority) 
    $b : B($a.matches($b), flag != $a) 
then 
    mofidy($b) { flag($a) } 
end 

Hope it helps,

+0

Merci pour votre réponse! Est-ce que le segment 'when' choisit le' A' avec la plus haute priorité, puis vérifie s'il correspond à un 'B'? Ou choisit-il le plus grand «A» correspondant au «B» donné? – fzwd

+0

La première condition est la vérification de tout 'A' et la seconde filtre le' A' avec la priorité la plus élevée (il filtre en fait tous, sauf celui qui a la plus haute priorité). –