Optaplanner调试groupBy
Optaplanner debugging groupBy
我有一个 java 方法可以从不遵循给定 [=25] 的所有 TeamCalendar 对象(具有 pinned=true 的规划实体)中创建约束流=]偏好.
因此,我想要一个约束流,表示每个 部门 存在多少这样的差异。这是 java 代码:
private BiConstraintStream<Department, Integer> violatedPreferredTeamDays(ConstraintFactory constraintFactory) {
return constraintFactory.from(TeamCalendar.class)
.ifNotExists(Preference.class,
Joiners.equal(TeamCalendar::getDate, Preference::getDate),
Joiners.equal(TeamCalendar::getDepartment, Preference::getDepartment))
.filter((tc) -> {
return true;
})
.groupBy(TeamCalendar::getDepartment, count())
.filter((dep, count) -> {
return true;
});
}
当运行这个在Debug模式下,第一个filter(tc -> {return true;})一共输入了20次,4个部门各5次。
但是在groupBy之后,结果集好像是空的。调试器不会中断该过滤器中的代码执行,并且在此 BiConstraintStream 上使用的惩罚函数不会惩罚任何东西。
我尝试了一些简单的替代方法:
- .groupBy(tc -> tc.getDepartment(), count())
- .groupBy(tc -> { return tc.getDepartment(); }, count() )
以及计数方法的替代方法:
- .groupBy(TeamCalendar::getDepartment, sum(tc -> 1) )
- .groupBy(TeamCalendar::getDepartment, sum(tc -> {return 1;})
但没有任何改善。
我是不是忽略了什么?
底层引擎直接在 TeamCalendar
和 pre-empts ifNotExists
调用上应用第一个过滤器。因此,您不能使用 filter
来检查 ifNotExists
是否已触发。
约束流不是强制性的,各个构建块的执行不需要按顺序发生。无法使用调试器检查约束流,除非您了解底层 Drools 引擎如何评估约束,并相应地调整您的期望。
至于为什么 groupBy
结果为空 - 可能是因为 Preference
实例确实存在。如果不是这种情况,请file a JIRA附上一个最小的可执行代码复制器,我们将对其进行调查。
我有一个 java 方法可以从不遵循给定 [=25] 的所有 TeamCalendar 对象(具有 pinned=true 的规划实体)中创建约束流=]偏好.
因此,我想要一个约束流,表示每个 部门 存在多少这样的差异。这是 java 代码:
private BiConstraintStream<Department, Integer> violatedPreferredTeamDays(ConstraintFactory constraintFactory) {
return constraintFactory.from(TeamCalendar.class)
.ifNotExists(Preference.class,
Joiners.equal(TeamCalendar::getDate, Preference::getDate),
Joiners.equal(TeamCalendar::getDepartment, Preference::getDepartment))
.filter((tc) -> {
return true;
})
.groupBy(TeamCalendar::getDepartment, count())
.filter((dep, count) -> {
return true;
});
}
当运行这个在Debug模式下,第一个filter(tc -> {return true;})一共输入了20次,4个部门各5次。 但是在groupBy之后,结果集好像是空的。调试器不会中断该过滤器中的代码执行,并且在此 BiConstraintStream 上使用的惩罚函数不会惩罚任何东西。
我尝试了一些简单的替代方法:
- .groupBy(tc -> tc.getDepartment(), count())
- .groupBy(tc -> { return tc.getDepartment(); }, count() )
以及计数方法的替代方法:
- .groupBy(TeamCalendar::getDepartment, sum(tc -> 1) )
- .groupBy(TeamCalendar::getDepartment, sum(tc -> {return 1;})
但没有任何改善。
我是不是忽略了什么?
底层引擎直接在 TeamCalendar
和 pre-empts ifNotExists
调用上应用第一个过滤器。因此,您不能使用 filter
来检查 ifNotExists
是否已触发。
约束流不是强制性的,各个构建块的执行不需要按顺序发生。无法使用调试器检查约束流,除非您了解底层 Drools 引擎如何评估约束,并相应地调整您的期望。
至于为什么 groupBy
结果为空 - 可能是因为 Preference
实例确实存在。如果不是这种情况,请file a JIRA附上一个最小的可执行代码复制器,我们将对其进行调查。