1

问题陈述:

我们有几个用于日期和字符串的自定义运算符,这些运算符是通过查看 Str 运算符来实现的,如下所示:https ://github.com/kiegroup/drools/blob/f7ab4ee3c88d767a8cbb372c2db1afa84b20a51d/drools-core/src/main/java/org/drools /core/base/evaluators/StrEvaluatorDefinition.java

在 kie.properties.conf 中具有以下配置:

drools.evaluator.str = com.company.drools.operators.StrEvaluatorDefinition

对于我们创建的自定义 Str 运算符,Drools 运行时无法区分 Str[begins] 和 Str[ends]。

这意味着当我们在以下测试中运行时,我们预计 Rule-1 会失败而 Rule-2 会被激活。但我们注意到的是,Rule-2 不会被激活。

// Facts input into drools :
//     str1 = drools
//     str2 = dr 

rule "Rule-1"
   when message : Customer( str1 str[endsWith] str2 )
   then System.out.println("Rule - Str 1 -  fired");
end


rule "Rule-2"
   when message : Customer( str1 str[startsWith] str2 )
   then System.out.println("Rule - Str 2 - fired");
end

其他观察:

如果我们将 RHS 更改为如下所示的字符串文字,则 Rule-2 将被激活。

// Facts input into drools :
//     str1 = drools
//     str2 = dr 

rule "Rule-1"
   when message : Customer( str1 str[endsWith] "abc" )
   then System.out.println("Rule - Str 1 -  fired");
end


rule "Rule-2"
   when message : Customer( str1 str[startsWith] str2 )
   then System.out.println("Rule - Str 2 - fired");
end

最后

我们去掉了 Str 自定义算子,然后使用了 drools 提供的开箱即用的 Str 算子。我们再次运行了下面提到的测试,这次规则 2 被激活。

// Facts input into drools :
//     str1 = drools
//     str2 = dr 

rule "Rule-1"
   when message : Customer( str1 str[endsWith] str2 )
   then System.out.println("Rule - Str 1 -  fired");
end


rule "Rule-2"
   when message : Customer( str1 str[startsWith] str2 )
   then System.out.println("Rule - Str 2 - fired");
end

需要帮助:

我们注册自定义运算符的方式有问题吗?因为我们从 Drools Repo 复制了整个代码并创建了我们自己的操作符。但请注意执行中的不同行为。

我们还有其他运算符,例如 date[before/after/equals] 我们也注意到它们的相同行为。我们正在使用最新版本的 drools JAR。

4

0 回答 0