возможны ли петли в слюнях? - PullRequest
8 голосов
/ 31 июля 2010

Кто-нибудь знает, есть ли способ сделать циклы в drools?.

Я пытаюсь перебрать список строк, чтобы посмотреть, соответствует ли одна из строк шаблону, например,

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

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

Я написал следующее правило, основываясь на том, какую документацию я смог найти, но я не думаю, что синтаксис правильный

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

Мне трудно найти хорошую документацию по языку drl

Буду признателен за любую помощь, которую кто-нибудь может мне дать


На основании предыдущего ответа я попробовал следующее

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

Однако теперь я получаюследующее сообщение об ошибке:

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

Ответы [ 4 ]

14 голосов
/ 02 ноября 2010

Я думаю, вы неправильно поняли основы механизма правил; Вы должны думать немного по-другому.

Вместо того, чтобы «перебирать» список, вам нужно разбить список на строки компонентов и вставить их по отдельности как факты в рабочую память.

Правило запускает только те строки / факты, которые соответствуют условию «когда».

Возможно, вы также захотите изучить глобальные переменные и запросы. global позволит вам внедрить сервис в вашу рабочую память для вызова ваших последствий, и запрос может быть способом, которым вы можете получить соответствующие строки из рабочей памяти.

4 голосов
/ 24 января 2013

Я использовал эту команду, когда использовал этот файл drl как правила для моего проекта

Надеюсь, это может быть полезно для вас.

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
2 голосов
/ 31 июля 2010

Алгоритм Rete не работает таким образом.

Я думаю, вы хотите попробовать regex в Drools .

0 голосов
/ 27 ноября 2013

Я также перебираю String[] и использую эту функцию String для каждой String из String [].Это то, что я использую ...

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

Таким образом, вы можете вызывать различные функции String для каждой строки, помещенной в массив строк.

...