OptaPlanner:Drools 空安全取消引用运算符在 OptaPlanner DRL 规则中不起作用吗?
OptaPlanner: does the Drools null-safe dereference operator not work in OptaPlanner DRL rules?
根据空安全解引用运算符 !.
的 Drools v7.46.0.Final documentation,
形式的表达式
Type( $data : property!.data )
在内部 expanded/represented 为:
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
具有 return 类型的 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 规则以使用空安全取消引用运算符:
rule "distanceToPreviousStandstill"
when
$customer : Customer($prevVehicle : previousStandstill!.vehicle, previousStandstill != null, $distanceFromPreviousStandstill : distanceFromPreviousStandstill)
then
System.out.println($prevVehicle);
scoreHolder.addSoftConstraintMatch(kcontext, - $distanceFromPreviousStandstill);
end
这按预期运行。
更新到 8.8.x 解决了我的问题
解决方法:
将空解引用运算符表达式替换为内部表示应该是什么,所以,而不是这样写:
rule "name"
when
MyClass($subField : field!.subField)
// more matching
then
// do some stuff
end
这样写:
rule "name"
when
MyClass(field != null, $subField : field.subField)
// more matching
then
// do some stuff
end
根据空安全解引用运算符 !.
的 Drools v7.46.0.Final documentation,
Type( $data : property!.data )
在内部 expanded/represented 为:
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
具有 return 类型的 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 规则以使用空安全取消引用运算符:
rule "distanceToPreviousStandstill"
when
$customer : Customer($prevVehicle : previousStandstill!.vehicle, previousStandstill != null, $distanceFromPreviousStandstill : distanceFromPreviousStandstill)
then
System.out.println($prevVehicle);
scoreHolder.addSoftConstraintMatch(kcontext, - $distanceFromPreviousStandstill);
end
这按预期运行。
更新到 8.8.x 解决了我的问题
解决方法:
将空解引用运算符表达式替换为内部表示应该是什么,所以,而不是这样写:
rule "name"
when
MyClass($subField : field!.subField)
// more matching
then
// do some stuff
end
这样写:
rule "name"
when
MyClass(field != null, $subField : field.subField)
// more matching
then
// do some stuff
end