【发布时间】:2021-06-02 22:11:37
【问题描述】:
根据Drools v7.46.0.Final documentation 为空安全解引用运算符!.,表达式为
Type( $data : property!.data )
在内部扩展/表示为:
Type( property != null, $data : property.data )
但是,这似乎不适用于 OptaPlanner。
为了规则
Type( $data : property!.data )
生成的代码是
package some.classes;
import static location.RulesAHASH1.*;
import org.optaplanner.core.api.score.buildin.bendablelong.BendableLongScoreHolder;
import org.drools.modelcompiler.dsl.pattern.D;
// other imports
@org.drools.compiler.kie.builder.MaterializedLambda()
public enum LambdaExtractorAHASH2 implements org.drools.model.functions.Function1<Type, java.lang.Long> {
INSTANCE;
public static final String EXPRESSION_HASH = "SOME_HASH";
@Override()
public java.lang.Long apply(Type _this) {
return _this.getProperty() != null && _this.getProperty().getData();
}
}
鉴于data 不是boolean 并且apply 的返回类型为Long,这会引发异常。
消息:
java.lang.IllegalStateException: There are errors in a score DRL:
Error Messages:
Message [id=1, level=ERROR, path=blah/blah/blah/LambdaExtractorHASH.java, line=24, column=54
text=bad operand types for binary operator '&&'
first type: boolean
second type: java.lang.Long]
...
// generated code etc.
那么,当使用 Drools 和 OptaPlanner 时,我们不应该使用这种表示法吗?还有其他语言限制吗?
更新:
提取 optaplanner 存储库,切换到 8.8.x,并修改了 vehicleRoutingConstriants DRL 规则以使用 null 安全取消引用运算符:
rule "distanceToPreviousStandstill"
when
$customer : Customer($prevVehicle : previousStandstill!.vehicle, previousStandstill != null, $distanceFromPreviousStandstill : distanceFromPreviousStandstill)
then
System.out.println($prevVehicle);
scoreHolder.addSoftConstraintMatch(kcontext, - $distanceFromPreviousStandstill);
end
这按预期运行。
【问题讨论】:
-
好问题。不幸的是,我不熟悉 OptaPlanner 的 Drools 特定风格,所以我很想知道这是语言限制(可能在其他地方记录)还是错误。你能用你正在使用的库的版本更新你的问题吗?
-
@RoddyoftheFrozenPeas 当然;帖子已更新。
-
不知道为什么我有不止一个
compiler和core嗯... -
JK,想通了。试图变得聪明,只是从我的“项目和外部依赖项”文件夹中复制粘贴并修剪名称,但我搞砸了:
| +--- org.kie.kogito:drools-core:1.0.0.Final| | +--- org.drools:drools-core:7.46.0.Final -
发生这种情况的原因有很多,但都与 OptaPlanner 无关。我建议您升级到最新的 OptaPlanner,它将为您提供最新的 Drools - 如果问题仍然存在,让我们再谈。
标签: java drools optaplanner