Слюнки текут, гнездо DSL - как использовать скобочки в правилах


Версия Drools: 6.3.0.Финал

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 (от R2): правило не генерируется.

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

Есть идеи?

2 4
dsl

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>")
(...)

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

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

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

Следует использовать следующие определения 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 bug reporting. (Но я не думаю, что команда Drools потратит какое-либо время или усилия на DSL, который был понижен до Step Child, когда работал на 6.- начал Икс.