@@ -65,12 +65,9 @@ protected Constraint avoidOvertime(ConstraintFactory constraintFactory) {
6565 }
6666
6767 protected Constraint requiredAttendanceConflict (ConstraintFactory constraintFactory ) {
68- return constraintFactory
69- .forEachUniquePair (RequiredAttendance .class ,
70- equal (RequiredAttendance ::getPerson ))
71- .join (MeetingAssignment .class ,
72- equal ((leftRequiredAttendance , rightRequiredAttendance ) -> leftRequiredAttendance .getMeeting (),
73- MeetingAssignment ::getMeeting ))
68+ return constraintFactory .precompute (MeetingSchedulingConstraintProvider ::requiredAttendanceAssignmentLeft )
69+ .filter ((leftRequiredAttendance , rightRequiredAttendance ,
70+ assignment ) -> assignment .getStartingTimeGrain () != null )
7471 .join (MeetingAssignment .class ,
7572 equal ((leftRequiredAttendance , rightRequiredAttendance , leftAssignment ) -> rightRequiredAttendance
7673 .getMeeting (),
@@ -87,6 +84,15 @@ protected Constraint requiredAttendanceConflict(ConstraintFactory constraintFact
8784 .asConstraint ("Required attendance conflict" );
8885 }
8986
87+ private static TriConstraintStream <RequiredAttendance , RequiredAttendance , MeetingAssignment >
88+ requiredAttendanceAssignmentLeft (PrecomputeFactory factory ) {
89+ return factory .forEachUnfilteredUniquePair (RequiredAttendance .class ,
90+ equal (RequiredAttendance ::getPerson ))
91+ .join (MeetingAssignment .class ,
92+ equal ((leftRequiredAttendance , rightRequiredAttendance ) -> leftRequiredAttendance .getMeeting (),
93+ MeetingAssignment ::getMeeting ));
94+ }
95+
9096 protected Constraint requiredRoomCapacity (ConstraintFactory constraintFactory ) {
9197 return constraintFactory .forEachIncludingUnassigned (MeetingAssignment .class )
9298 .filter (meetingAssignment -> meetingAssignment .getRequiredCapacity () > meetingAssignment .getRoomCapacity ())
@@ -140,13 +146,9 @@ protected Constraint requiredAndPreferredAttendanceConflict(ConstraintFactory co
140146 }
141147
142148 protected Constraint preferredAttendanceConflict (ConstraintFactory constraintFactory ) {
143- return constraintFactory
144- .forEachUniquePair (PreferredAttendance .class ,
145- equal (PreferredAttendance ::getPerson ))
146- .join (constraintFactory .forEachIncludingUnassigned (MeetingAssignment .class )
147- .filter (assignment -> assignment .getStartingTimeGrain () != null ),
148- equal ((leftAttendance , rightAttendance ) -> leftAttendance .getMeeting (),
149- MeetingAssignment ::getMeeting ))
149+ return constraintFactory .precompute (MeetingSchedulingConstraintProvider ::preferredAttendanceAssignmentLeft )
150+ .filter ((leftPreferredAttendance , rightPreferredAttendance ,
151+ assignment ) -> assignment .getStartingTimeGrain () != null )
150152 .join (constraintFactory .forEachIncludingUnassigned (MeetingAssignment .class )
151153 .filter (assignment -> assignment .getStartingTimeGrain () != null ),
152154 equal ((leftAttendance , rightAttendance , leftAssignment ) -> rightAttendance .getMeeting (),
@@ -163,6 +165,14 @@ protected Constraint preferredAttendanceConflict(ConstraintFactory constraintFac
163165 .asConstraint ("Preferred attendance conflict" );
164166 }
165167
168+ private static TriConstraintStream <PreferredAttendance , PreferredAttendance , MeetingAssignment >
169+ preferredAttendanceAssignmentLeft (PrecomputeFactory factory ) {
170+ return factory .forEachUnfilteredUniquePair (PreferredAttendance .class ,
171+ equal (PreferredAttendance ::getPerson ))
172+ .join (MeetingAssignment .class ,
173+ equal ((leftAttendance , rightAttendance ) -> leftAttendance .getMeeting (), MeetingAssignment ::getMeeting ));
174+ }
175+
166176 // ************************************************************************
167177 // Soft constraints
168178 // ************************************************************************
0 commit comments