2010-03-23 22 views
6

Necesito ejecutar un método en la sección "cuándo" de un archivo DSLR y no estoy seguro de si es posible. Ejemplo:Reglas de Drools: ¿Cómo puedo usar un método en la sección "cuándo"?

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 

(nota: isInAgeRange() y haveAtLeastOptIns() son métodos de Usuario)

he intentado con eval() y no hay errores aparecieron, pero Dejase't ejecutan. De esta manera:

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 

¿Cómo puedo resolver este problema?

Respuesta

7

Su segundo intento parece bastante confuso, también tiene patrones de usuario. ¿Desea que se refieran a la misma instancia de usuario? o pueden ser instancias separadas (¿o deben estar separadas?) - eso cambiará las cosas un poco en algunos casos, dependiendo de su intención.

En cuanto a la reescritura más simple que puedo pensar:

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 

Nota el uso de la función eval() elemento de nivel superior - que también utiliza un único patrón del usuario - y luego aplica las limitaciones a la misma. (En una versión futura, las evaluaciones en línea funcionarán sin tener que escribir eval!).

+0

¡funciona! ¡Gracias! – manoelhc

Cuestiones relacionadas