Java 如何在DSL中为drools动态更改运算符

Java 如何在DSL中为drools动态更改运算符,java,drools,dsl,Java,Drools,Dsl,我有drools 6.0.1最终版本,我正在其中编写一个DSL文件。我的问题是,我希望用户在运行时选择操作符。是否有一种方法可以在运行时更改运算符。例如,将有两个具有不同值的变量,比如A和B。我希望条件类似于A{operator}B。我希望此条件动态更改。描述了如何执行此操作。然而,这里有一个总结 您还可以定义多个DSL短语映射到运营商,例如: [when][]is less than=< [when][]is greater than=> [when][]is equal to==

我有drools 6.0.1最终版本,我正在其中编写一个DSL文件。我的问题是,我希望用户在运行时选择操作符。是否有一种方法可以在运行时更改运算符。例如,将有两个具有不同值的变量,比如A和B。我希望条件类似于A{operator}B。我希望此条件动态更改。

描述了如何执行此操作。然而,这里有一个总结

您还可以定义多个DSL短语映射到运营商,例如:

[when][]is less than=<
[when][]is greater than=>
[when][]is equal to===
[when][]Given a person with=Person()
[when][]- {field:\w*} {operator} {value:\d*}={field} {operator} {value}
我还做了一件事,让向导编辑器的工作更轻松,那就是编写枚举和DSL,例如:

'InOrNotIn.options' : ['contains=in', 'not contains=not in']

[when][]Given a currency "{operator:ENUM:InOrNotIn.options}" the major currencies
              = $ccy : Currency(isoCode {operator} $majorCurrencies)

如果我正确理解了OP的问题,那么目标就是能够在运行时动态地选择操作符。DSL语法糖仍然是编码/编译时。考虑到这是一个DSL问题,我的工作假设是“在运行时更改运算符”意味着向用户提供编辑器(很可能是工作台中的引导式规则编辑器)来更改基于该DSL的规则,然后需要重新编译(希望很明显),您或我的运行时显然不同步;-)没关系,嗯。。。没有重新编译或知识库更新的真正“运行时”切换实际上不是DSL问题,可能会涉及到某种恶梦般的疯狂,比如插入和收回开关事实,并根据工作内存中的开关事实编写多个匹配规则。我不确定我能不能想出一个解决办法,让我在事后不想洗个澡。:)DSL和lambdas的结合可以让您编写真正酷的约束。但是,似乎即使是6.1.0也无法将lambdas作为双函数等的实例插入。也许使用方法引用可能是一种解决方法,但尚未检查。-这在Jess已经有很多年了,因为lambdas在Lisp方言中是“自然”的。
'InOrNotIn.options' : ['contains=in', 'not contains=not in']

[when][]Given a currency "{operator:ENUM:InOrNotIn.options}" the major currencies
              = $ccy : Currency(isoCode {operator} $majorCurrencies)