Quero impor que os grupos de alunos da mesma série de alunos estejam no mesmo intervalo de tempo e na mesma sala para um tipo de curso.
Esta é minha tentativa:
Constraint seminarsGroupedInTheSameTimeslot(ConstraintFactory constraintFactory){
return constraintFactory
//select each 2 pair of different lessons
.forEachUniquePair(Lesson.class,
//with the same group
Joiners.equal((lesson) -> lesson.getStudentGroup().getGroup()),
//with the same series
Joiners.equal((lesson) -> lesson.getStudentGroup().getName()),
//with the same subject
Joiners.equal(Lesson::getSubject),
//with the same Seminar type
Joiners.equal((lesson) -> lesson.getType().equals(LessonType.SEMINAR))
)
//check if the lessons have different timeslots and rooms
.filter(((lesson, lesson2) -> {
return !(lesson.getTimeslot().equals(lesson2.getTimeslot()) &&
lesson.getRoom().equals(lesson2.getRoom()));
}))
.penalize(HardSoftScore.ONE_HARD)
.asConstraint("Seminars should be grouped in the same timeslot and room");
}
Eu sei que esta não é a melhor solução porque não é escalável e dá penalidade a cada par de aulas que quebra a restrição (ou seja, no caso de 10 aulas que são analisadas e apenas uma instância das aulas quebra a restrição, a pontuação será ser -9 em vez de -1).
Tentei adicionar um método ifNotExists() para levar em conta apenas o ID de lições consecutivas, mas recebi o seguinte aviso: Criação de matriz genérica não verificada para o parâmetro varargs.
Como posso escrever melhor esse tipo de restrição?