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 上使用的惩罚函数不会惩罚任何东西。

我尝试了一些简单的替代方法:

以及计数方法的替代方法:

但没有任何改善。

我是不是忽略了什么?

底层引擎直接在 TeamCalendar 和 pre-empts ifNotExists 调用上应用第一个过滤器。因此,您不能使用 filter 来检查 ifNotExists 是否已触发。

约束流不是强制性的,各个构建块的执行不需要按顺序发生。无法使用调试器检查约束流,除非您了解底层 Drools 引擎如何评估约束,并相应地调整您的期望。

至于为什么 groupBy 结果为空 - 可能是因为 Preference 实例确实存在。如果不是这种情况,请file a JIRA附上一个最小的可执行代码复制器,我们将对其进行调查。