2010-07-31 8 views
7

qualcuno sa se c'è un modo per fare i loop in drools?sono possibili per loop in drools?

Sto provando a scorrere un elenco di stringhe per vedere se una delle stringhe corrisponde a un modello, ad es.

def listOfStrings = ['a','a.b','a.b.c'] 

for(String s:listOfStrings){ 
if(s matches "^a.b.*$"){ 
return true 
} 
} 

ho scritto la seguente regola in base a quale documentazione che ho trovato, ma io non credo che la sintassi è corretta

rule "Matcher" 
    when 
     TestClass : TestClass(($s matches "^a.b.*$") from listOfStrings, count($s)) 
    then 
     TestClass.setResponse("Condition is True !!"); 
end 

mi sto trovando difficile trovare una buona documentazione sul linguaggio DRL

Gradirei qualsiasi aiuto che chiunque può darmi


Sulla base della risposta precedente, ho provato quanto segue

rule "Matcher" 
    when 
TestClass:TestClass(String(this matches "^a.b.*$") from listOfStrings) 
then 
     TestClass.setResponse("Condition is True !!"); 
end 

Tuttavia, ora ottengo il seguente messaggio di errore:

[43,197]: unknown:43:197 Unexpected token 'this' 

risposta

12

Penso che tu abbia frainteso i fondamenti di un motore di regole; devi pensare un po 'diversamente.

Invece di "iterare" sull'elenco, è necessario suddividere l'elenco nelle sue stringhe di componenti e inserirle singolarmente come fatti nella memoria di lavoro.

Solo le stringhe/i fatti che corrispondono alla condizione "quando" generano la regola.

Si potrebbe anche voler esaminare globali e query. Global ti permetterà di iniettare un servizio nella tua memoria di lavoro per le tue conseguenze da chiamare, e la query potrebbe essere un modo con cui puoi ottenere le stringhe corrispondenti fuori dalla memoria di lavoro.

2

L'algoritmo rete non funziona in questo modo.

Penso che tu voglia provare regex in Drools.

+0

Grazie per il collegamento, ma nell'esempio si cerca solo una stringa per vedere se corrisponde a un'espressione regolare. Nel mio esempio ho potuto utilizzare "ABC" partite "^ ab * $" Ma quello non è quello che sto cercando di realizzare, sto cercando di cercare una lista di stringhe per vedere se qualcuno di loro corrispondono un regolare espressione. Non penso che sia la parte regex che mi sta causando problemi. È il fatto che non so come eseguire iterazioni attraverso una lista di stringhe in drools. Sai come potrei essere in grado di fare questo? grazie – MTH

+0

Non sono sicuro, ma suppongo che vogliate vedere l'applicazione della regex in una lista. "corrisponde almeno a uno", "corrisponde a uno o più" sono il tipo di cose che cerco. Se non trovi loop in Drools, è perché non dovrebbe funzionare in questo modo. – duffymo

+0

sai se esiste un modo per incorporare un codice java in una regola? – MTH

3

avevo usato questo comando quando ho usato questo file DRL come regole per il mio progetto

Spero che questo può essere utile a voi.

pacchetto com.sample

import com.sample.HelloProcessModel;

regola "NYuser_Rule"

no-loop true 
ruleflow-group "EvalLoopcondition" 
when 
    m:HelloProcessModel(userlocation in ("NewYorkUser"), count < 4) 
then 
    m.setLoopcondition(6);update(m); 

fine

regola "ChileUser_Rule"

no-loop true 
ruleflow-group "EvalLoopcondition" 
when 
    m:HelloProcessModel(userlocation in ("ChileUser"), count < 3) 
then 
    m.setLoopcondition(5);update(m); 

fine

regola "BelgiumUser_Rule"

no-loop true 
ruleflow-group "EvalLoopcondition" 
when 
    m:HelloProcessModel(userlocation in ("BelgiumUser"), count < 6) 
then 
    m.setLoopcondition(8);update(m); 

fine

0

Sto anche scorrere il String[] e l'utilizzo di queste funzioni di stringa su ogni stringa dal String []. Questo è quello che sto usando ...

String ($vvl.indexOf(String.valueOf(charAt($idx))) >= 0) da $m.stringArray

Così si può chiamare diverse funzioni di stringa su ogni String posto in String Array.