[jboss-svn-commits] JBL Code SVN: r33054 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main: java/org/drools/planner/examples/nurserostering/domain/solver and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon May 24 14:25:06 EDT 2010
Author: ge0ffrey
Date: 2010-05-24 14:25:05 -0400 (Mon, 24 May 2010)
New Revision: 33054
Modified:
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/WeekendDefinition.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
nurse rostering: rule Incomplete working weekends
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java 2010-05-24 18:25:05 UTC (rev 33054)
@@ -54,7 +54,16 @@
return code;
}
+ public int getDistanceToNext(DayOfWeek other) {
+ int distance = other.ordinal() - ordinal();
+ if (distance < 0) {
+ distance += 7;
+ }
+ return distance;
+ }
+
public String toString() {
return code.substring(0, 3);
}
+
}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/WeekendDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/WeekendDefinition.java 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/WeekendDefinition.java 2010-05-24 18:25:05 UTC (rev 33054)
@@ -7,15 +7,17 @@
*/
public enum WeekendDefinition {
SATURDAY_SUNDAY("SaturdaySunday",
- EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)),
+ DayOfWeek.SATURDAY, DayOfWeek.SUNDAY),
FRIDAY_SATURDAY_SUNDAY("FridaySaturdaySunday",
- EnumSet.of(DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)),
+ DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY),
FRIDAY_SATURDAY_SUNDAY_MONDAY("FridaySaturdaySundayMonday",
- EnumSet.of(DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY, DayOfWeek.MONDAY)),
+ DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY, DayOfWeek.MONDAY),
SATURDAY_SUNDAY_MONDAY("SaturdaySundayMonday",
- EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY, DayOfWeek.MONDAY));
+ DayOfWeek.SATURDAY, DayOfWeek.SUNDAY, DayOfWeek.MONDAY);
private EnumSet<DayOfWeek> dayOfWeekSet;
+ private DayOfWeek firstDayOfWeekend;
+ private DayOfWeek lastDayOfWeekend;
public static WeekendDefinition valueOfCode(String code) {
for (WeekendDefinition weekendDefinition : values()) {
@@ -28,21 +30,44 @@
private String code;
- private WeekendDefinition(String code, EnumSet<DayOfWeek> dayOfWeekSet) {
+ private WeekendDefinition(String code, DayOfWeek dayOfWeekend1, DayOfWeek dayOfWeekend2) {
this.code = code;
- this.dayOfWeekSet = dayOfWeekSet;
+ this.dayOfWeekSet = EnumSet.of(dayOfWeekend1, dayOfWeekend2);
+ this.firstDayOfWeekend = dayOfWeekend1;
+ this.lastDayOfWeekend = dayOfWeekend2;
}
+ private WeekendDefinition(String code, DayOfWeek dayOfWeekend1, DayOfWeek dayOfWeekend2, DayOfWeek dayOfWeekend3) {
+ this.code = code;
+ this.dayOfWeekSet = EnumSet.of(dayOfWeekend1, dayOfWeekend2, dayOfWeekend3);
+ this.firstDayOfWeekend = dayOfWeekend1;
+ this.lastDayOfWeekend = dayOfWeekend3;
+ }
+ private WeekendDefinition(String code, DayOfWeek dayOfWeekend1, DayOfWeek dayOfWeekend2, DayOfWeek dayOfWeekend3,
+ DayOfWeek dayOfWeekend4) {
+ this.code = code;
+ this.dayOfWeekSet = EnumSet.of(dayOfWeekend1, dayOfWeekend2, dayOfWeekend3, dayOfWeekend4);
+ this.firstDayOfWeekend = dayOfWeekend1;
+ this.lastDayOfWeekend = dayOfWeekend4;
+ }
public String getCode() {
return code;
}
- public boolean isWeekend(DayOfWeek dayOfWeek) {
- return dayOfWeekSet.contains(dayOfWeek);
+ public DayOfWeek getFirstDayOfWeekend() {
+ return firstDayOfWeekend;
}
+ public DayOfWeek getLastDayOfWeekend() {
+ return lastDayOfWeekend;
+ }
+
public String toString() {
return code;
}
+ public boolean isWeekend(DayOfWeek dayOfWeek) {
+ return dayOfWeekSet.contains(dayOfWeek);
+ }
+
}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java 2010-05-24 18:25:05 UTC (rev 33054)
@@ -78,6 +78,11 @@
.toComparison();
}
+ @Override
+ public String toString() {
+ return employee + " is working between " + firstShiftDate + " - " + lastShiftDate;
+ }
+
public int getFirstShiftDateDayIndex() {
return firstShiftDate.getDayIndex();
}
@@ -90,9 +95,4 @@
return lastShiftDate.getDayIndex() - firstShiftDate.getDayIndex() + 1;
}
- @Override
- public String toString() {
- return employee + " is working between " + firstShiftDate + " - " + lastShiftDate;
- }
-
}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java 2010-05-24 18:25:05 UTC (rev 33054)
@@ -5,8 +5,11 @@
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.planner.examples.nurserostering.domain.DayOfWeek;
import org.drools.planner.examples.nurserostering.domain.Employee;
import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+import org.drools.planner.examples.nurserostering.domain.WeekendDefinition;
+import org.drools.planner.examples.nurserostering.domain.contract.Contract;
/**
* @author Geoffrey De Smet
@@ -70,8 +73,24 @@
return employee + " ... - " + shiftDate;
}
+ public Contract getContract() {
+ return employee.getContract();
+ }
+
public int getShiftDateDayIndex() {
return shiftDate.getDayIndex();
}
+ public boolean isWeekendAndNotLastDayOfWeekend() {
+ WeekendDefinition weekendDefinition = employee.getContract().getWeekendDefinition();
+ DayOfWeek dayOfWeek = shiftDate.getDayOfWeek();
+ return weekendDefinition.isWeekend(dayOfWeek) && weekendDefinition.getLastDayOfWeekend() != dayOfWeek;
+ }
+
+ public int getDistanceToLastDayOfWeekend() {
+ WeekendDefinition weekendDefinition = employee.getContract().getWeekendDefinition();
+ DayOfWeek dayOfWeek = shiftDate.getDayOfWeek();
+ return dayOfWeek.getDistanceToNext(weekendDefinition.getLastDayOfWeekend());
+ }
+
}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java 2010-05-24 18:25:05 UTC (rev 33054)
@@ -5,8 +5,11 @@
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.planner.examples.nurserostering.domain.DayOfWeek;
import org.drools.planner.examples.nurserostering.domain.Employee;
import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+import org.drools.planner.examples.nurserostering.domain.WeekendDefinition;
+import org.drools.planner.examples.nurserostering.domain.contract.Contract;
/**
* @author Geoffrey De Smet
@@ -66,13 +69,29 @@
.toComparison();
}
+ @Override
+ public String toString() {
+ return employee + " " + shiftDate + " - ...";
+ }
+
+ public Contract getContract() {
+ return employee.getContract();
+ }
+
public int getShiftDateDayIndex() {
return shiftDate.getDayIndex();
}
- @Override
- public String toString() {
- return employee + " " + shiftDate + " - ...";
+ public boolean isWeekendAndNotFirstDayOfWeekend() {
+ WeekendDefinition weekendDefinition = employee.getContract().getWeekendDefinition();
+ DayOfWeek dayOfWeek = shiftDate.getDayOfWeek();
+ return weekendDefinition.isWeekend(dayOfWeek) && weekendDefinition.getFirstDayOfWeekend() != dayOfWeek;
}
+ public int getDistanceToFirstDayOfWeekend() {
+ WeekendDefinition weekendDefinition = employee.getContract().getWeekendDefinition();
+ DayOfWeek dayOfWeek = shiftDate.getDayOfWeek();
+ return weekendDefinition.getFirstDayOfWeekend().getDistanceToNext(dayOfWeek);
+ }
+
}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java 2010-05-24 18:25:05 UTC (rev 33054)
@@ -77,13 +77,13 @@
.toComparison();
}
- public int getDayLength() {
- return lastDayIndex - firstDayIndex + 1;
- }
-
@Override
public String toString() {
return employee + " is free between " + firstDayIndex + " - " + lastDayIndex;
}
+ public int getDayLength() {
+ return lastDayIndex - firstDayIndex + 1;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl 2010-05-24 17:24:17 UTC (rev 33053)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl 2010-05-24 18:25:05 UTC (rev 33054)
@@ -327,7 +327,38 @@
// Complete weekends
-// TODO
+rule "startOnNotFirstDayOfWeekend"
+ when
+ $contractLine : BooleanContractLine(
+ contractLineType == ContractLineType.COMPLETE_WEEKENDS, enabled == true,
+ $contract : contract
+ )
+ $employeeConsecutiveAssignmentStart : EmployeeConsecutiveAssignmentStart(
+ weekendAndNotFirstDayOfWeekend == true,
+ contract == $contract,
+ $distanceToFirstDayOfWeekend : distanceToFirstDayOfWeekend
+ )
+ then
+ insertLogical(new IntConstraintOccurrence("startOnNotFirstDayOfWeekend", ConstraintType.NEGATIVE_SOFT,
+ $distanceToFirstDayOfWeekend * $contractLine.getWeight(),
+ $employeeConsecutiveAssignmentStart));
+end
+rule "endOnNotLastDayOfWeekend"
+ when
+ $contractLine : BooleanContractLine(
+ contractLineType == ContractLineType.COMPLETE_WEEKENDS, enabled == true,
+ $contract : contract
+ )
+ $employeeConsecutiveAssignmentEnd : EmployeeConsecutiveAssignmentEnd(
+ weekendAndNotLastDayOfWeekend == true,
+ contract == $contract,
+ $distanceToLastDayOfWeekend : distanceToLastDayOfWeekend
+ )
+ then
+ insertLogical(new IntConstraintOccurrence("endOnNotLastDayOfWeekend", ConstraintType.NEGATIVE_SOFT,
+ $distanceToLastDayOfWeekend * $contractLine.getWeight(),
+ $employeeConsecutiveAssignmentEnd));
+end
// Identical shiftTypes during a weekend
// TODO
More information about the jboss-svn-commits
mailing list