Проверьте наличие указанного элемента c в списке в Drools с помощью dsl, dslr - PullRequest
0 голосов
/ 20 апреля 2020

Я только начал использовать drools workbench 6.5.0

У меня есть два класса

class Client{
    String name;
    String age;
    List<Products> products; 
}

class Product {
    String code;
    String description;
}

Есть способ запустить правила, которые соответствуют элементу в списке продуктов определенных клиент, использующий dsl и dslr?

я использовал следующий dsl

[keyword][]regla=rule
[keyword][]cuando=when
[keyword][]entonces=then
[keyword][]fin=end

[when][]es menor o igual que=<=
[when][]es menor que=<
[when][]es mayor o igual que=>=
[when][]es mayor que=>
[when][]es igual que===
[when][]igual===
[when][]- {campo:\w*} {operador} {valor:\d*}={campo} {operador} {valor} 

[when][]Hay un cliente =$c : Client($products: products)
[when][]nombre = name
[when][]edad = age
[when][]codigo = code
[when][]Hay producto = $p : Product() from $products

и следующее условие

cuando 
        Hay un cliente
            - edad es mayor o igual que 12
            - nombre igual "John"
        Hay producto
            - codigo es igual que  "4"

1 Ответ

0 голосов
/ 23 апреля 2020

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

test

@DroolsSession(resources = { "classpath:/test.rdslr", "classpath:/business.dsl" })
public class PlaygroundTest {

    @Rule
    public DroolsAssert drools = new DroolsAssert();

    @Test
    public void testIt() {
        drools.insertAndFire(new Client("client1", 40, asList(new Product("1", "product 1"), new Product("2", "product 2"))));
        drools.insertAndFire(new Client("John", 50, asList(new Product("3", "product 3"), new Product("4", "product 4"))));
    }
}

rule

regla X
cuando 
    Hay un cliente
        - edad es mayor o igual que 12
        - nombre igual "John"
    Hay producto
        - codigo es igual que  "4"
entonces
    print client name
fin

dsl

[keyword][]regla=rule
[keyword][]cuando=when
[keyword][]entonces=then
[keyword][]fin=end

[when][]es menor o igual que=<=
[when][]es menor que=<
[when][]es mayor o igual que=>=
[when][]es mayor que=>
[when][]es igual que===
[when][]igual===
[when][]- {campo:\w*} {operador} {valor:\d*}={campo} {operador} {valor} 

[when][]Hay un cliente =$c : Client($products: products)
[when][]nombre = name
[when][]edad = age
[when][]codigo = code
[when][]Hay producto = $p : Product() from $products

[then]print client name = System.out.println($c.name);

модель

public class Client {
    public String name;
    public int age;
    public List<Product> products;

    public Client(String name, int age, List<Product> products) {
        this.name = name;
        this.age = age;
        this.products = products;
    }

    public List<Product> getProducts() {
        return products;
    }
}

public class Product {
    public String code;
    public String description;

    public Product(String code, String description) {
        this.code = code;
        this.description = description;
    }
}

тестовый выход

00:00:00 --> inserted: Client[name=client1,age=40,products=[org.droolsassert.Product@4fbdc0f0, org.droolsassert.Product@2ad3a1bb]]
00:00:00 --> fireAllRules
00:00:00 --> inserted: Client[name=John,age=50,products=[org.droolsassert.Product@71e9a896, org.droolsassert.Product@6b9267b]]
00:00:00 --> fireAllRules
00:00:00 <-- 'X' has been activated by the tuple [Client, Product]
John

После вставки первого клиента никакие правила не сработали, после вставки Джона было сработано правило и напечатано имя клиента.

Какой неожиданный результат вы получили?

...