8 Stimmen

Sind for-Schleifen in Drools möglich?

Weiß jemand, ob es eine Möglichkeit gibt, for-Schleifen in Drools zu verwenden?

Ich versuche, eine Liste von Zeichenfolgen zu durchlaufen, um zu sehen, ob eine der Zeichenfolgen einem Muster entspricht, z. B.

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

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

Ich habe die folgende Regel auf der Grundlage der Dokumentation geschrieben, die ich finden konnte, aber ich glaube nicht, dass die Syntax korrekt ist

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

Ich finde es schwierig, eine gute Dokumentation über die drl-Sprache zu finden.

Ich wäre für jede Hilfe dankbar, die mir jemand geben kann.


Auf der Grundlage der vorherigen Antwort habe ich Folgendes versucht

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

Jetzt erhalte ich jedoch folgende Fehlermeldung:

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

14voto

Steven Herod Punkte 744

Ich glaube, Sie haben die Grundlagen einer Regelmaschine falsch verstanden; Sie müssen ein wenig anders denken.

Anstatt über die Liste zu "iterieren", müssen Sie die Liste in ihre Bestandteile zerlegen und sie einzeln als Fakten in den Arbeitsspeicher einfügen.

Nur die Zeichenfolgen/Fakten, die der "wenn"-Bedingung entsprechen, lösen die Regel aus.

Sie sollten sich auch mit Globals und Abfragen befassen. Mit Globals können Sie einen Dienst in den Arbeitsspeicher einfügen, der von Ihren Folgen aufgerufen werden kann, und mit Abfragen können Sie die übereinstimmenden Zeichenfolgen aus dem Arbeitsspeicher abrufen.

4voto

Dhaval Shah Punkte 8892

Ich hatte diesen Befehl verwendet, als ich diese drl-Datei als Regeln für mein Projekt verwendete

Ich hoffe, dass dies für Sie hilfreich ist.

package com.sample

import com.sample.HelloProcessModel;

rule "NYuser_Rule"

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

rule "ChileUser_Rule"

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

rule "BelgiumUser_Rule"

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

2voto

duffymo Punkte 298898

Der Rete-Algorithmus funktioniert nicht auf diese Weise.

Ich denke, Sie wollen versuchen regex in Drools .

0voto

Rizwan Punkte 71

Ich iteriere auch über die String[] und verwenden diese Funktionen von String auf jeden String aus String[]. Dies ist, was ich verwende...

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

So können Sie verschiedene Funktionen von String auf jeden String in String Array platziert aufrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X