[jboss-svn-commits] JBL Code SVN: r33102 - 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
Wed May 26 16:27:33 EDT 2010


Author: ge0ffrey
Date: 2010-05-26 16:27:31 -0400 (Wed, 26 May 2010)
New Revision: 33102

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveWeekendAssignmentEnd.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveWeekendAssignmentStart.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeWeekendSequence.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Assignment.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
maximumConsecutiveWorkingWeekends

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Assignment.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Assignment.java	2010-05-26 20:04:22 UTC (rev 33101)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Assignment.java	2010-05-26 20:27:31 UTC (rev 33102)
@@ -107,4 +107,14 @@
         return employee.getContract();
     }
 
+    public boolean isWeekend() {
+        WeekendDefinition weekendDefinition = employee.getContract().getWeekendDefinition();
+        DayOfWeek dayOfWeek = shift.getShiftDate().getDayOfWeek();
+        return weekendDefinition.isWeekend(dayOfWeek);
+    }
+
+    public int getWeekendSundayIndex() {
+        return shift.getShiftDate().getWeekendSundayIndex();
+    }
+
 }

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveWeekendAssignmentEnd.java (from rev 33054, 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/EmployeeConsecutiveWeekendAssignmentEnd.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveWeekendAssignmentEnd.java	2010-05-26 20:27:31 UTC (rev 33102)
@@ -0,0 +1,80 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+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
+ */
+public class EmployeeConsecutiveWeekendAssignmentEnd implements Comparable<EmployeeConsecutiveWeekendAssignmentEnd>, Serializable {
+
+    private Employee employee;
+    private int sundayIndex;
+
+    public EmployeeConsecutiveWeekendAssignmentEnd(Employee employee, int sundayIndex) {
+        this.employee = employee;
+        this.sundayIndex = sundayIndex;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public int getSundayIndex() {
+        return sundayIndex;
+    }
+
+    public void setSundayIndex(int sundayIndex) {
+        this.sundayIndex = sundayIndex;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof EmployeeConsecutiveWeekendAssignmentEnd) {
+            EmployeeConsecutiveWeekendAssignmentEnd other = (EmployeeConsecutiveWeekendAssignmentEnd) o;
+            return new EqualsBuilder()
+                    .append(employee, other.employee)
+                    .append(sundayIndex, other.sundayIndex)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(employee)
+                .append(sundayIndex)
+                .toHashCode();
+    }
+
+    public int compareTo(EmployeeConsecutiveWeekendAssignmentEnd other) {
+        return new CompareToBuilder()
+                .append(employee, other.employee)
+                .append(sundayIndex, other.sundayIndex)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return employee + " weekend ... - " + sundayIndex;
+    }
+
+    public Contract getContract() {
+        return employee.getContract();
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveWeekendAssignmentStart.java (from rev 33054, 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/EmployeeConsecutiveWeekendAssignmentStart.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveWeekendAssignmentStart.java	2010-05-26 20:27:31 UTC (rev 33102)
@@ -0,0 +1,78 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+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.Employee;
+import org.drools.planner.examples.nurserostering.domain.contract.Contract;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class EmployeeConsecutiveWeekendAssignmentStart implements Comparable<EmployeeConsecutiveWeekendAssignmentStart>,
+        Serializable {
+
+    private Employee employee;
+    private int sundayIndex;
+
+    public EmployeeConsecutiveWeekendAssignmentStart(Employee employee, int sundayIndex) {
+        this.employee = employee;
+        this.sundayIndex = sundayIndex;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public int getSundayIndex() {
+        return sundayIndex;
+    }
+
+    public void setSundayIndex(int sundayIndex) {
+        this.sundayIndex = sundayIndex;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof EmployeeConsecutiveWeekendAssignmentStart) {
+            EmployeeConsecutiveWeekendAssignmentStart other = (EmployeeConsecutiveWeekendAssignmentStart) o;
+            return new EqualsBuilder()
+                    .append(employee, other.employee)
+                    .append(sundayIndex, other.sundayIndex)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(employee)
+                .append(sundayIndex)
+                .toHashCode();
+    }
+
+    public int compareTo(EmployeeConsecutiveWeekendAssignmentStart other) {
+        return new CompareToBuilder()
+                .append(employee, other.employee)
+                .append(sundayIndex, other.sundayIndex)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return employee + " weekend " + sundayIndex + " - ...";
+    }
+
+    public Contract getContract() {
+        return employee.getContract();
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeWeekendSequence.java (from rev 33099, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeWorkSequence.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeWeekendSequence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeWeekendSequence.java	2010-05-26 20:27:31 UTC (rev 33102)
@@ -0,0 +1,89 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+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.Employee;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class EmployeeWeekendSequence implements Comparable<EmployeeWeekendSequence>, Serializable {
+
+    private Employee employee;
+    private int firstSundayIndex;
+    private int lastSundayIndex;
+
+    public EmployeeWeekendSequence(Employee employee, int firstSundayIndex, int lastSundayIndex) {
+        this.employee = employee;
+        this.firstSundayIndex = firstSundayIndex;
+        this.lastSundayIndex = lastSundayIndex;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public int getFirstSundayIndex() {
+        return firstSundayIndex;
+    }
+
+    public void setFirstSundayIndex(int firstSundayIndex) {
+        this.firstSundayIndex = firstSundayIndex;
+    }
+
+    public int getLastSundayIndex() {
+        return lastSundayIndex;
+    }
+
+    public void setLastSundayIndex(int lastSundayIndex) {
+        this.lastSundayIndex = lastSundayIndex;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof EmployeeWeekendSequence) {
+            EmployeeWeekendSequence other = (EmployeeWeekendSequence) o;
+            return new EqualsBuilder()
+                    .append(employee, other.employee)
+                    .append(firstSundayIndex, other.firstSundayIndex)
+                    .append(lastSundayIndex, other.lastSundayIndex)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(employee)
+                .append(firstSundayIndex)
+                .append(lastSundayIndex)
+                .toHashCode();
+    }
+
+    public int compareTo(EmployeeWeekendSequence other) {
+        return new CompareToBuilder()
+                .append(employee, other.employee)
+                .append(firstSundayIndex, other.firstSundayIndex)
+                .append(lastSundayIndex, other.lastSundayIndex)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return employee + " is working the weekend of " + firstSundayIndex + " - " + lastSundayIndex;
+    }
+
+    public int getWeekendLength() {
+        return ((lastSundayIndex - firstSundayIndex) / 7) + 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-26 20:04:22 UTC (rev 33101)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-05-26 20:27:31 UTC (rev 33102)
@@ -27,10 +27,13 @@
 import org.drools.planner.examples.nurserostering.domain.request.ShiftOffRequest;
 import org.drools.planner.examples.nurserostering.domain.request.ShiftOnRequest;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeAssignmentTotal;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeWeekendSequence;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeWorkSequence;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeFreeDaySequence;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentEnd;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentStart;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveWeekendAssignmentEnd;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveWeekendAssignmentStart;
 
 // @author Geoffrey De Smet
 
@@ -304,25 +307,84 @@
 end
 
 
+rule "insertEmployeeConsecutiveWeekendAssignmentStart"
+        salience 2 // Do these rules first (optional, for performance)
+    when
+        Assignment(
+            weekend == true,
+            $employee : employee,
+            $weekendSundayIndex : weekendSundayIndex
+        )
+        // The first working weekend has no working weekend before it
+        not Assignment(
+            weekend == true,
+            employee == $employee,
+            weekendSundayIndex == ($weekendSundayIndex - 7)
+        )
+    then
+        insertLogical(new EmployeeConsecutiveWeekendAssignmentStart($employee, $weekendSundayIndex));
+end
+rule "insertEmployeeConsecutiveWeekendAssignmentEnd"
+        salience 2 // Do these rules first (optional, for performance)
+    when
+        Assignment(
+            weekend == true,
+            $employee : employee,
+            $weekendSundayIndex : weekendSundayIndex
+        )
+        // The last working weekend has no working weekend after it
+        not Assignment(
+            weekend == true,
+            employee == $employee,
+            weekendSundayIndex == ($weekendSundayIndex + 7)
+        )
+    then
+        insertLogical(new EmployeeConsecutiveWeekendAssignmentEnd($employee, $weekendSundayIndex));
+end
+
+rule "insertEmployeeWeekendSequence"
+    when
+        EmployeeConsecutiveWeekendAssignmentStart(
+            $employee : employee,
+            $firstSundayIndex : sundayIndex
+        )
+
+        EmployeeConsecutiveWeekendAssignmentEnd(
+            employee == $employee,
+            sundayIndex >= $firstSundayIndex,
+            $lastSundayIndex : sundayIndex
+        )
+
+        // There are no free weekends between the first and last weekend
+        not EmployeeConsecutiveWeekendAssignmentEnd(
+            employee == $employee,
+            sundayIndex >= $firstSundayIndex && < $lastSundayIndex
+        )
+    then
+        insertLogical(new EmployeeWeekendSequence($employee, $firstSundayIndex, $lastSundayIndex));
+end
+
 // Maximum number of consecutive working weekends
-// TODO do start and end
-//rule "maximumConsecutiveWorkingWeekends"
-//        salience 1 // Do these rules first (optional, for performance)
-//    when
-//        MinMaxContractLine(contractLineType == ContractLineType.CONSECUTIVE_WORKING_WEEKENDS, maximumEnabled == true,
-//            $contract : contract, $maximumValue : maximumValue)
-//        $employee : Employee(contract == $contract)
-//
-//
-//        $totalAssignmentSize : Number() from accumulate(
-//            $assignment : Assignment(employee == $employee),
-//            count($assignment)
-//        )
-//    then
-//        insertLogical(new EmployeeAssignmentTotal($employee, $totalAssignmentSize.intValue()));
-//end
+rule "maximumConsecutiveWorkingWeekends"
+    when
+        $contractLine : MinMaxContractLine(
+            contractLineType == ContractLineType.CONSECUTIVE_WORKING_WEEKENDS, maximumEnabled == true,
+            $contract : contract, $maximumValue : maximumValue
+        )
+        $employee : Employee(contract == $contract)
 
+        $employeeWeekendSequence : EmployeeWeekendSequence(
+            employee == $employee,
+            weekendLength > $maximumValue,
+            $weekendLength : weekendLength
+        )
+    then
+        insertLogical(new IntConstraintOccurrence("maximumConsecutiveWorkingWeekends", ConstraintType.NEGATIVE_SOFT,
+                ($weekendLength - $maximumValue) * $contractLine.getMaximumWeight(),
+                $employeeWeekendSequence));
+end
 
+
 // Complete weekends
 rule "startOnNotFirstDayOfWeekend"
     when



More information about the jboss-svn-commits mailing list