2015-12-16 8 views
4

Drools версия: 6.3.0.FinalDrools DSL - Как использовать круглые скобки в правилах

Pojo:

public class Person { 
    private Integer age; 
    private Integer childrens; 
    private String name; 
    private String address; 
    (...) 
} 

DSL файл:

[condition][]and=&& 
[condition][]or=|| 
[condition][]is less than or equal to=<= 
[condition][]is less than=< 
[condition][]is greater than or equal to=>= 
[condition][]is greater than=> 
[condition][]is equal to=== 
[condition][]There is a [Pp]erson with=$person:Person() 
[condition][].{field:\w*} {operator} {value:\d*}={field} {operator} {value} 
(...) 

DSRL файл:

package <package>; 

import <import class>.* 

global org.slf4j.Logger logger; 

expander <class>.dsl; 

rule "R1" 
    when 
     There is a person with 
     .age is greater than 10 or .chidldrens is less than 2 and .name is equal to "<name>" 
    then 
     (...) 
end 

rule "R2" 
    when 
     There is a person with 
     (.age is greater than 10 or .childrens is less than 2) and .name is equal to "<name>" 
    then 
     (...) 
end 

DRL (от R1):

(...) 
rule "R1" 
     when 
      $person:Person(age > 10 || childrens < 2 && name = "<name>") 
     then 
      (...) 
    end 
(...) 

DRL (from R2): правило не генерируется.

Если я удаляю скобку, она работает, но с круглой скобкой файл DRL генерируется неправильно. Так работает только правило R2, но моя цель - правило R1.

Любая идея?

+0

Что такое определение DSL для «Есть объект с»? - Странный. Я бы подумал, что ни R1, ни R2 не работают. Вы проверили сгенерированный код DRL? – laune

+0

Я изменяю вопрос с условием Person на DSL-файле, чтобы ответить на ваш вопрос. Есть ли у вас какие-либо подсказки относительно скобок? – Leonel

+0

DRL для правила R1 является * определенно не * результатом расширения с использованием данных DSL и DSLR (и я не имею в виду из-за опечатки «chidldrens»). – laune

ответ

3

Я думаю, что я нашел возможное решение:

DSL-файл (заменить эти новые условия):

[condition][]There is a [Pp]erson that {constraints}=$person:Person({constraints}) 
[condition][]{field:\w*}\s+{operator}\s+{value:\s*}={field} {operator} {value} 

DSRL (определение ограничений, начиная с первой строки):

(...) 
There is a person that ((age is greater than 10 or chidldrens is less than 2) and name is equal to "<name>") 
(...) 

DRL (генерируется):

(...) 
$person:Person((age > 10 || childrens < 2) && name == "name") 
(...) 

Использование этой новой круглой скобки определения DSL поддерживается и работает должным образом. Как вы думаете, @laune?

+0

Я думаю, что DSL отличается от того, что было в вашем вопросе. Возможно, есть и другие рабочие альтернативы. – laune

+0

Да, DSL отличается. Я заменяю 2 условия, и теперь у меня есть все ограничения в одной строке, поэтому он работает со скобками. – Leonel

0

Следующие определения DSL следует использовать:

[condition][]There is a Person with=Person() 
[condition][]- :{field:\w*} {operator} {value:\d*}= 
      {field} {operator} {value} 
[condition][]:{field:\w*} {operator} {value:\d*}= 
      {field} {operator} {value} 
# operators as in the question 

И на зеркалку:

rule R1 
when 
There is a Person with 
- :call_count is less than 10 or :name is equal to "Joe" 
- :points is greater than 5 
then 
    ... 
end 

Это приводит к

rule R1 
when 
Person(call_count < 10 || name == "Joe", points > 5) 
then 
... 
end 

Есть по крайней мере две ошибки в 6.3. 0 расширитель DSL. Раньше это работало в 5.5, но было сделано некоторое «улучшение» в разборе DSL. Вы должны поднять JIRA на сайте отчетов об ошибках Drools. (Но я не думаю, что команда Drools проведет какое-то время или усилие на DSL, которая была понижена до Step Child, когда началась работа над 6.x.

+0

Спасибо за ваш комментарий. Но я не понимаю разницы между '[condition] [] -: {поле: \ w *} {operator} {значение: \ d *} = {поле} {operator} {значение}' и '[ условие] []: {поле: \ w *} {operator} {значение: \ d *} = {поле} {operator} {значение} '. А что касается круглых скобок какой-либо идеи? – Leonel

+0

И я тоже. Ошибки могут создавать странные эффекты. Похоже, что маркерный дефис («помещаем это в круглые скобки предыдущего шаблона») сохраняется в сгенерированном коде. - Извините, но я не собираюсь анализировать эту ошибку; Я улучшал код расширителя DSL в 5.2 или 5.3, но я не собираюсь исправлять его, опять же, для 6.x. – laune

+0

, пожалуйста, проверьте мой ответ. – Leonel