2010-07-31 5 views
7

Est-ce que quelqu'un sait s'il y a un moyen de faire pour les boucles dans les baves? J'essaie de parcourir une liste de chaînes pour voir si l'une des chaînes correspond à un modèle, par exemple.sont pour les boucles possibles dans les baves?

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

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

J'ai écrit la règle suivante en fonction de quels documents que je pouvais trouver, mais je ne pense pas que la syntaxe est correcte

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

Je trouve qu'il est difficile de trouver une bonne documentation sur la langue DRL

Je vous serais reconnaissant toute aide que quelqu'un peut me donner


Selon la réponse précédente, j'ai essayé ce qui suit

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

Cependant, je reçois maintenant le message d'erreur suivant:

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

Répondre

12

Je pense que vous avez mal compris les principes de base d'un moteur de règles; vous devez penser un peu différemment. Au lieu de «itérer» dans la liste, vous devez fractionner la liste en ses chaînes de composants et les insérer individuellement comme des faits dans la mémoire de travail. Seules les chaînes/faits correspondant à la condition 'quand' déclencheront la règle.

Vous pouvez également vous intéresser aux variables globales et aux requêtes. global vous permettra d'injecter un service dans votre mémoire de travail pour vos conséquences à appeler, et la requête pourrait être un moyen par lequel vous pouvez obtenir les chaînes appariées à partir de la mémoire de travail.

2

L'algorithme Rete ne fonctionne pas de cette façon.

Je pense que vous voulez essayer regex in Drools.

+0

Merci pour le lien, mais l'exemple y recherche seulement une chaîne pour voir si elle correspond à une regex. Dans mon exemple, je pourrais utiliser « abc » correspond à «^ab * $ » Mais ce isnt ce que je suis en train de réaliser, je suis en train de rechercher une liste de chaînes pour voir si l'un d'eux correspondent régulièrement expression. Je ne pense pas que ce soit la partie regex qui me cause des problèmes. C'est le fait que je ne sais pas comment parcourir une liste de chaînes dans les baves. Savez-vous comment je pourrais être capable de faire ceci? merci – MTH

+0

Je ne suis pas certain, mais je suppose que vous voulez voir à propos de l'application de l'expression régulière à une liste. "correspond à au moins un", "correspond à un ou plusieurs" sont le genre de choses que je rechercherais. Si vous ne trouvez pas de boucles dans Drools, c'est parce que ce n'est pas censé fonctionner de cette façon. – duffymo

+0

savez-vous s'il existe un moyen d'intégrer du code java dans une règle? – MTH

3

je l'avais utilisé cette commande lorsque j'ai utilisé ce fichier DRL que les règles de mon projet

Espérons que cela peut vous être utile.

package com.sample

import com.sample.HelloProcessModel;

règle "NYuser_Rule"

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

fin

règle "ChileUser_Rule"

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

fin

règle "BelgiumUser_Rule"

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

fin

0

Je suis également itérer sur la String[] et à l'aide des fonctions de chaîne sur chaque chaîne de la chaîne []. Voilà ce que je me sers ...

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

Vous pouvez appeler différentes fonctions de chaîne sur chaque chaîne placé dans la chaîne Array.