[jboss-svn-commits] JBL Code SVN: r33023 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main: resources/org/drools/planner/examples/nurserostering/solver and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon May 24 04:52:27 EDT 2010


Author: ge0ffrey
Date: 2010-05-24 04:52:27 -0400 (Mon, 24 May 2010)
New Revision: 33023

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeAssignmentTotal.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
insertEmployeeAssignmentTotal

Added: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeAssignmentTotal.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeAssignmentTotal.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeAssignmentTotal.java	2010-05-24 08:52:27 UTC (rev 33023)
@@ -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.ShiftDate;
+import org.drools.planner.examples.nurserostering.domain.contract.Contract;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class EmployeeAssignmentTotal implements Comparable<EmployeeAssignmentTotal>, Serializable {
+
+    private Employee employee;
+    private int total;
+
+    public EmployeeAssignmentTotal(Employee employee, int total) {
+        this.employee = employee;
+        this.total = total;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof EmployeeAssignmentTotal) {
+            EmployeeAssignmentTotal other = (EmployeeAssignmentTotal) o;
+            return new EqualsBuilder()
+                    .append(employee, other.employee)
+                    .append(total, other.total)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(employee)
+                .append(total)
+                .toHashCode();
+    }
+
+    public int compareTo(EmployeeAssignmentTotal other) {
+        return new CompareToBuilder()
+                .append(employee, other.employee)
+                .append(total, other.total)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return employee + " = " + total;
+    }
+
+    public Contract getEmployeeContract() {
+        return employee.getContract();
+    }
+
+}

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 08:45:36 UTC (rev 33022)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-05-24 08:52:27 UTC (rev 33023)
@@ -25,6 +25,7 @@
 import org.drools.planner.examples.nurserostering.domain.request.DayOnRequest;
 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.EmployeeConsecutiveAssignment;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentEnd;
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentStart;
@@ -67,39 +68,47 @@
 // Soft constraints
 // ############################################################################
 
+rule "insertEmployeeAssignmentTotal"
+        salience 1 // Do these rules first (optional, for performance)
+    when
+        MinMaxContractLine(contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, enabled == true,
+            $contract : contract)
+        $employee : Employee(contract == $contract)
+        $totalAssignmentSize : Number() from accumulate(
+            $assignment : Assignment(employee == $employee),
+            count($assignment)
+        )
+    then
+        insertLogical(new EmployeeAssignmentTotal($employee, $totalAssignmentSize.intValue()));
+end
+
 // Minimum number of assignments
 rule "minimumTotalAssignments"
     when
-        $contractLine : MinMaxContractLine(
+        MinMaxContractLine(
             contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, minimumEnabled == true,
             $contract : contract, $minimumValue : minimumValue
         )
-        $employee : Employee(contract == $contract)
-        $totalAssignmentSize : Number(intValue < $minimumValue) from accumulate(
-            $assignment : Assignment(employee == $employee),
-            count($assignment)
-        )
+        EmployeeAssignmentTotal(employeeContract == $contract, total < $minimumValue,
+            $employee : employee, $total : total)
     then
         insertLogical(new IntConstraintOccurrence("minimumTotalAssignments", ConstraintType.NEGATIVE_SOFT,
-                Math.abs($minimumValue - $totalAssignmentSize.intValue()),
+                $minimumValue - $total,
                 $employee));
 end
 
 // Maximum number of assignments
 rule "maximumTotalAssignments"
     when
-        $contractLine : MinMaxContractLine(
+        MinMaxContractLine(
             contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, maximumEnabled == true,
             $contract : contract, $maximumValue : maximumValue
         )
-        $employee : Employee(contract == $contract)
-        $totalAssignmentSize : Number(intValue > $maximumValue) from accumulate(
-            $assignment : Assignment(employee == $employee),
-            count($assignment)
-        )
+        EmployeeAssignmentTotal(employeeContract == $contract, total > $maximumValue,
+            $employee : employee, $total : total)
     then
         insertLogical(new IntConstraintOccurrence("maximumTotalAssignments", ConstraintType.NEGATIVE_SOFT,
-                Math.abs($totalAssignmentSize.intValue() - $maximumValue),
+                $total - $maximumValue,
                 $employee));
 end
 



More information about the jboss-svn-commits mailing list