DSL 中的逻辑或

Logic OR in a DSL

我对如何在 DSLR 中执行 or 有疑问,我有这个规则:

rule "Test"
    when
        There is AThing
        - with attribute1 is equal to something1
        - attribute2 is higher than or equal to somethingelse1

        There is AThing
        - with attribute1  is equal to something2
        - attribute2 is higher than or equal to somethingelse2
    then
        something is valid
end

重写为 dlr,如:

rule "Test"
    when
        AThing(attribute1 ==  something1, attribute2  >=  somethingelse1)
        AThing(attribute1 ==  something2, attribute2  >= somethingelse2)
    then
        something is valid
end

在 DSLR 中将条件 2 放入 OR 中的最佳方法是什么?我想写这样的东西:

rule "Test"
    when
        (There is AThing
        - with attribute1 is equal to something1
        - attribute2 is higher than or equal to somethingelse1)
        or
        (There is AThing
        - with attribute1  is equal to something2
        - attribute2 is higher than or equal to somethingelse2)
    then
        something is valid
end

但是 Drools 编译器在抱怨,我尝试了很多括号组合。

在这种情况下,我可以编写 2 个单独的规则,但实际上它们是最复杂规则的一部分,我想避免仅仅为了一个或而重复两个大规则。

有办法吗?谢谢!

最好将其写成两条规则 - 无论如何都会发生。

语法要求你在LHS上写一个中缀或

when
( Type(...)
or
  Type(...) )
then

和前缀或作为

when
(or Type(...)
    Type(...))
then

使用 DSL 都不容易实现。您可以做的最好的事情是在以更大的符号 (>) 为前缀的行上写上括号和 or ,这只会将余数传递给 DRL 输出。

when
> (
  Type(...)
> or
  Type(...)
> )

但是像你的例子这样的条件也可以这样组合:

when
    AThing(attribute1 == something1 && attribute2 >=  somethingelse1
           ||
           attribute1 == something2 && attribute2 >= somethingelse2)
then

但这将很难使用 DSL 实现。 (正如我在 SO 的另一个角落所写的那样,...)