2015-09-21 1 views
0

J'ai faits suivantstri sur la valeur d'attribut dans Drools

declare PriceInfo 
    price : Integer 
end 

J'utilise cette règle pour insérer:

règle « insérer » agenda-groupe « trouver-maison tournée » quand

then 
    PriceInfo p1 = new PriceInfo(); 
    PriceInfo p2 = new PriceInfo(); 
    PriceInfo p3 = new PriceInfo(); 
    PriceInfo p4 = new PriceInfo(); 
    PriceInfo p5 = new PriceInfo(); 

    p1.setPrice(200); 
    p2.setPrice(300); 
    p3.setPrice(400); 
    p4.setPrice(500); 
    p5.setPrice(600); 

    insert(p1); 
    insert(p2); 
    insert(p3); 
    insert(p4); 
    insert(p5); 
end 

Cela va insérer 5 faits de PriceInfo dans le moteur de règles. J'essaye de le trier dans l'ordre croissant ou décroissant de cette règle.

rule "sort-number" 
    agenda-group "find-rotated-house" 
    when 
     $priceInfo : PriceInfo($price : price) 
     not PriceInfo(price < $price) 
    then 
     $logger.info($priceInfo.toString()); 
     retract($priceInfo); 
end 

Cependant, dans cette règle, je rétracte le fait. Si je ne me rétracte pas, je reçois la valeur minimum, c'est-à-dire 200. D'autres faits ne sont pas activés. Je veux garder le fait intact dans RE après le tri.

Cette règle fonctionne également mais avec rétractation.

rule "sort-number-1" 
    agenda-group "find-rotated-house" 
    when 
     Number($intValue : intValue) from accumulate(PriceInfo($price : price), min($price)) 
     $p : PriceInfo(price == $intValue) 
    then 
     $logger.info($p.toString()); 
     retract($p); 
end 

Aidez-nous s'il vous plaît.

Merci

Répondre

1

Une bonne réponse dépend de ce que vous avez besoin de l'ordre de tri, si elle doit être maintenue sur inserts éventuels, modifie (prix changent) et supprime, si elle devra être utilisée à plusieurs reprises, etc.

Voici une possibilité:

rule "sort price info" 
when 
    $list: ArrayList() from collect(PriceInfo()) 
then 
    $list.sort(...); // use suitable Comparator 
end 

maintenant vous avez une liste triée des objets PriceInfo.

Vous pouvez placer cette liste dans un objet et l'insérer comme un fait. Cela pourrait vous permettre d'écrire des règles telles que

rule "10 cheap ones" 
when 
    $p: PriceInfo() 
    PriceList($l: list) 
    eval($l.indexOf($p) < 10) 
then ... end 
+0

Merci pour votre réponse. – Kumar