Drools DSL - Как использовать скобки в правилах

Версия дроола: 6.3.0.Финальная

Пожо:

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 

ДХО (от R1):

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

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

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

Есть идеи?


person Leonel    schedule 16.12.2015    source источник
comment
Что такое определение DSL для объекта? - Странный. Я бы подумал, что ни R1, ни R2 не работают. Вы проверили сгенерированный код DRL?   -  person laune    schedule 16.12.2015
comment
Я меняю вопрос с условием Person в файле DSL, чтобы ответить на ваш вопрос. У вас есть какая-нибудь подсказка относительно скобок?   -  person Leonel    schedule 17.12.2015
comment
DRL для правила R1 определенно не является результатом расширения с использованием заданных DSL и DSLR (и я не имею в виду из-за дочерних опечаток).   -  person laune    schedule 17.12.2015
comment
В своем ответе я упомянул, что, по моему мнению, в расширении DSL версии 6.3.0 есть ошибки.   -  person laune    schedule 17.12.2015
comment
Обновляю ДХО на R1. Я изменяю оператор and на && вместо , и теперь он точно такой же, как он сгенерирован. Соглашаться?   -  person Leonel    schedule 18.12.2015
comment
R1 в DRL (из R1) не является правильным преобразованием R1 в DSLR.   -  person laune    schedule 18.12.2015
comment
Да, конечно... Я менял местами R1 с R2. R1 не имеет скобок. Теперь проверьте R1 в ДХО (от R1).   -  person Leonel    schedule 18.12.2015


Ответы (2)


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

Файл 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>")
(...)

ДХО (сгенерировано):

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

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

person Leonel    schedule 17.12.2015
comment
Я думаю, что DSL отличается от того, что в вашем вопросе. Возможно есть и другие рабочие варианты. - person laune; 17.12.2015
comment
Да, DSL другой. Я заменяю 2 условия, и теперь у меня все ограничения в одной строке, поэтому он работает со скобками. - person Leonel; 18.12.2015

Следует использовать следующие определения 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 

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

person laune    schedule 16.12.2015
comment
Спасибо за ваш комментарий. Но я не понимаю разницы между [condition][]- :{field:\w*} {operator} {value:\d*}= {field} {operator} {value} и [condition][]:{field:\w*} {operator} {value:\d*}= {field} {operator} {value}. А по поводу скобок есть идеи? - person Leonel; 17.12.2015
comment
Я тоже. Жуки способны создавать странные эффекты. Похоже, что маркерный дефис (поместите его в круглые скобки предыдущего шаблона) сохраняется в сгенерированном коде. - Извините, но я не буду анализировать этот баг; Я улучшал код расширителя DSL в 5.2 или 5.3, но исправлять его, опять же, для 6.x не буду. - person laune; 17.12.2015
comment
пожалуйста, проверьте мой ответ. - person Leonel; 17.12.2015