2010-03-23 15 views
6

J'ai besoin d'exécuter une méthode sur la section "quand" d'un fichier DSLR et je ne sais pas si c'est possible. Exemple:Drools Règles: Comment puis-je utiliser une méthode sur "quand" section?

rule "WNPRules_10" 
    when 
    $reminder:Reminder(source == "HMI") 
    $user:User(isInAgeRange("30-100")==true) 
    Reminder(clickPercentual >= 10) 
    User(haveAtLeastOptIns("1,2,3,4") == true) 
    then 
    $reminder.setPriority(1);update($reminder); 
end 

(Note: isInAgeRange() et haveAtLeastOptIns() sont des méthodes de l'utilisateur)

J'ai essayé avec eval() et aucune erreur sont apparues, mais exécutent didnt. Comme ceci:

rule "WNPRules_10" 
when 
    $reminder:Reminder(source == "HMI") 
    $user:User(eval($user.isInAgeRange("30-100")==true)) 
    Reminder(clickPercentual >= 10) 
    User(eval($user.haveAtLeastOptIns("1,2,3,4") == true)) 
then 
    $reminder.setPriority(1);update($reminder); 
end 

Comment puis-je résoudre ce problème?

Répondre

7

Votre deuxième tentative semble assez confuse - aussi - avez-vous donc des modèles utilisateur - voulez-vous qu'ils se réfèrent à la même instance de l'utilisateur? ou peuvent-ils être des instances séparées (ou doivent-elles être séparées?) - cela changera un peu les choses dans certains cas en fonction de votre intention.

En termes de simple réécriture je peux penser:

rule "WNPRules_10" 
    when 
    $reminder:Reminder(source == "HMI") 
    $user:User() 
    eval($user.isInAgeRange("30-100") && $user.haveAtLeastOptIns("1,2,3,4")) 
    Reminder(clickPercentual >= 10) 
    then 
    $reminder.setPriority(1);update($reminder); 
    end 

Notez l'utilisation de l'élément de niveau supérieur eval() - il utilise seulement un motif utilisateur - et applique ensuite les contraintes à elle. (Dans une future version inline, les evals fonctionneront sans avoir à écrire eval!).

+0

ça marche! Merci! – manoelhc