[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