[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