[jboss-svn-commits] JBL Code SVN: r32746 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples: src/main/java/org/drools/planner/examples/nurserostering/domain and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed May 5 09:09:51 EDT 2010


Author: ge0ffrey
Date: 2010-05-05 09:09:50 -0400 (Wed, 05 May 2010)
New Revision: 32746

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/BooleanContractLine.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java
Removed:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/data/nurserostering/input/toy1.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLineType.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionImporter.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
nurseRostering: import contract lines

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/data/nurserostering/input/toy1.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/data/nurserostering/input/toy1.xml	2010-05-05 12:55:45 UTC (rev 32745)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/data/nurserostering/input/toy1.xml	2010-05-05 13:09:50 UTC (rev 32746)
@@ -77,7 +77,7 @@
       <WeekendDefinition>SaturdaySunday</WeekendDefinition>
       <CompleteWeekends weight="1">true</CompleteWeekends>
       <IdenticalShiftTypesDuringWeekend weight="1">true</IdenticalShiftTypesDuringWeekend>
-      <NoNightShiftBeforeFreeWeekend weight="0">true</NoNightShiftBeforeFreeWeekend>
+      <NoNightShiftBeforeFreeWeekend weight="1">true</NoNightShiftBeforeFreeWeekend>
       <AlternativeSkillCategory weight="0">false</AlternativeSkillCategory>
       <UnwantedPatterns>
           <Pattern>0</Pattern>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java	2010-05-05 12:55:45 UTC (rev 32745)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -94,6 +94,10 @@
         return getShift().getShiftDate();
     }
 
+    public ShiftType getShiftType() {
+        return getShift().getShiftType();
+    }
+
     public int getShiftDateDayIndex() {
         return getShift().getShiftDate().getDayIndex();
     }

Added: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/BooleanContractLine.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/BooleanContractLine.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/BooleanContractLine.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -0,0 +1,30 @@
+package org.drools.planner.examples.nurserostering.domain.contract;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("BooleanContractLine")
+public class BooleanContractLine extends ContractLine {
+
+    private boolean enabled;
+    private int weight;
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public int getWeight() {
+        return weight;
+    }
+
+    public void setWeight(int weight) {
+        this.weight = weight;
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java	2010-05-05 12:55:45 UTC (rev 32745)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -1,107 +0,0 @@
-package org.drools.planner.examples.nurserostering.domain.contract;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.apache.commons.lang.builder.CompareToBuilder;
-import org.drools.planner.examples.common.domain.AbstractPersistable;
-
-/**
- * @author Geoffrey De Smet
- */
- at XStreamAlias("ContractLine")
-public class ContractLine extends AbstractPersistable implements Comparable<ContractLine> {
-
-    private Contract contract;
-    private ContractLineType contractLineType;
-
-    private boolean minimumEnabled;
-    private int minimumValue;
-    private int minimumWeight;
-
-    private boolean maximumEnabled;
-    private int maximumValue;
-    private int maximumWeight;
-
-    public Contract getContract() {
-        return contract;
-    }
-
-    public void setContract(Contract contract) {
-        this.contract = contract;
-    }
-
-    public ContractLineType getContractLineType() {
-        return contractLineType;
-    }
-
-    public void setContractLineType(ContractLineType contractLineType) {
-        this.contractLineType = contractLineType;
-    }
-
-    public boolean isMinimumEnabled() {
-        return minimumEnabled;
-    }
-
-    public void setMinimumEnabled(boolean minimumEnabled) {
-        this.minimumEnabled = minimumEnabled;
-    }
-
-    public int getMinimumValue() {
-        return minimumValue;
-    }
-
-    public void setMinimumValue(int minimumValue) {
-        this.minimumValue = minimumValue;
-    }
-
-    public int getMinimumIndexDiff() {
-        return minimumValue - 1;
-    }
-
-    public int getMinimumWeight() {
-        return minimumWeight;
-    }
-
-    public void setMinimumWeight(int minimumWeight) {
-        this.minimumWeight = minimumWeight;
-    }
-
-    public boolean isMaximumEnabled() {
-        return maximumEnabled;
-    }
-
-    public void setMaximumEnabled(boolean maximumEnabled) {
-        this.maximumEnabled = maximumEnabled;
-    }
-
-    public int getMaximumValue() {
-        return maximumValue;
-    }
-
-    public void setMaximumValue(int maximumValue) {
-        this.maximumValue = maximumValue;
-    }
-
-    public int getMaximumIndexDiff() {
-        return maximumValue - 1;
-    }
-
-    public int getMaximumWeight() {
-        return maximumWeight;
-    }
-
-    public void setMaximumWeight(int maximumWeight) {
-        this.maximumWeight = maximumWeight;
-    }
-
-    public int compareTo(ContractLine other) {
-        return new CompareToBuilder()
-                .append(id, other.id)
-                .toComparison();
-    }
-
-    @Override
-    public String toString() {
-        return contract + "-" + contractLineType;
-    }
-
-}

Added: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -0,0 +1,42 @@
+package org.drools.planner.examples.nurserostering.domain.contract;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.drools.planner.examples.common.domain.AbstractPersistable;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("ContractLine")
+public abstract class ContractLine extends AbstractPersistable implements Comparable<ContractLine> {
+
+    private Contract contract;
+    private ContractLineType contractLineType;
+
+    public Contract getContract() {
+        return contract;
+    }
+
+    public void setContract(Contract contract) {
+        this.contract = contract;
+    }
+
+    public ContractLineType getContractLineType() {
+        return contractLineType;
+    }
+
+    public void setContractLineType(ContractLineType contractLineType) {
+        this.contractLineType = contractLineType;
+    }
+
+    public int compareTo(ContractLine other) {
+        return new CompareToBuilder()
+                .append(id, other.id)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return contract + "-" + contractLineType;
+    }
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLineType.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLineType.java	2010-05-05 12:55:45 UTC (rev 32745)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLineType.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -4,9 +4,14 @@
  * @author Geoffrey De Smet
  */
 public enum ContractLineType {
+    SINGLE_ASSIGNMENT_PER_DAY,
     TOTAL_ASSIGNMENTS,
     CONSECUTIVE_WORKING_DAYS,
     CONSECUTIVE_FREE_DAYS,
     CONSECUTIVE_WORKING_WEEKENDS,
-    TOTAL_WORKING_WEEKENDS_IN_FOUR_WEEKS
+    TOTAL_WORKING_WEEKENDS_IN_FOUR_WEEKS,
+    COMPLETE_WEEKENDS,
+    IDENTICAL_SHIFT_TYPES_DURING_WEEKEND,
+    NO_NIGHT_SHIFT_BEFORE_FREE_WEEKEND,
+    ALTERNATIVE_SKILL_CATEGORY
 }

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java (from rev 32692, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -0,0 +1,75 @@
+package org.drools.planner.examples.nurserostering.domain.contract;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("MinMaxContractLine")
+public class MinMaxContractLine extends ContractLine {
+
+    private boolean minimumEnabled;
+    private int minimumValue;
+    private int minimumWeight;
+
+    private boolean maximumEnabled;
+    private int maximumValue;
+    private int maximumWeight;
+
+    public boolean isMinimumEnabled() {
+        return minimumEnabled;
+    }
+
+    public void setMinimumEnabled(boolean minimumEnabled) {
+        this.minimumEnabled = minimumEnabled;
+    }
+
+    public int getMinimumValue() {
+        return minimumValue;
+    }
+
+    public void setMinimumValue(int minimumValue) {
+        this.minimumValue = minimumValue;
+    }
+
+    public int getMinimumIndexDiff() {
+        return minimumValue - 1;
+    }
+
+    public int getMinimumWeight() {
+        return minimumWeight;
+    }
+
+    public void setMinimumWeight(int minimumWeight) {
+        this.minimumWeight = minimumWeight;
+    }
+
+    public boolean isMaximumEnabled() {
+        return maximumEnabled;
+    }
+
+    public void setMaximumEnabled(boolean maximumEnabled) {
+        this.maximumEnabled = maximumEnabled;
+    }
+
+    public int getMaximumValue() {
+        return maximumValue;
+    }
+
+    public void setMaximumValue(int maximumValue) {
+        this.maximumValue = maximumValue;
+    }
+
+    public int getMaximumIndexDiff() {
+        return maximumValue - 1;
+    }
+
+    public int getMaximumWeight() {
+        return maximumWeight;
+    }
+
+    public void setMaximumWeight(int maximumWeight) {
+        this.maximumWeight = maximumWeight;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionImporter.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionImporter.java	2010-05-05 12:55:45 UTC (rev 32745)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionImporter.java	2010-05-05 13:09:50 UTC (rev 32746)
@@ -26,13 +26,16 @@
 import org.drools.planner.examples.nurserostering.domain.ShiftTypeSkillRequirement;
 import org.drools.planner.examples.nurserostering.domain.Skill;
 import org.drools.planner.examples.nurserostering.domain.SkillProficiency;
+import org.drools.planner.examples.nurserostering.domain.contract.BooleanContractLine;
 import org.drools.planner.examples.nurserostering.domain.contract.Contract;
 import org.drools.planner.examples.nurserostering.domain.contract.ContractLine;
 import org.drools.planner.examples.nurserostering.domain.contract.ContractLineType;
+import org.drools.planner.examples.nurserostering.domain.contract.MinMaxContractLine;
 import org.drools.planner.examples.nurserostering.domain.request.DayOffRequest;
 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.jdom.DataConversionException;
 import org.jdom.Element;
 import org.jdom.JDOMException;
 
@@ -351,21 +354,108 @@
                 contract.setId(id);
                 contract.setCode(element.getAttribute("ID").getValue());
                 contract.setDescription(element.getChild("Description").getText());
-// TODO the rest of the contract
-//      <SingleAssignmentPerDay weight="1">true</SingleAssignmentPerDay>
-//      <MaxNumAssignments on="1" weight="1">16</MaxNumAssignments>
-//      <MinNumAssignments on="1" weight="1">6</MinNumAssignments>
-                
+
                 List<ContractLine> contractLineListOfContract = new ArrayList<ContractLine>(contractLineTypeListSize);
-                Element maxElement = element.getChild("MaxConsecutiveWorkingDays");
-                Element minElement = element.getChild("MinConsecutiveWorkingDays");
+                contractLineId = readBooleanContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("SingleAssignmentPerDay"),
+                        ContractLineType.SINGLE_ASSIGNMENT_PER_DAY);
+                contractLineId = readMinMaxContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("MinNumAssignments"),
+                        element.getChild("MaxNumAssignments"),
+                        ContractLineType.TOTAL_ASSIGNMENTS);
+                contractLineId = readMinMaxContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("MinConsecutiveWorkingDays"),
+                        element.getChild("MaxConsecutiveWorkingDays"),
+                        ContractLineType.CONSECUTIVE_WORKING_DAYS);
+                contractLineId = readMinMaxContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("MinConsecutiveFreeDays"),
+                        element.getChild("MaxConsecutiveFreeDays"),
+                        ContractLineType.CONSECUTIVE_FREE_DAYS);
+                contractLineId = readMinMaxContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("MinConsecutiveWorkingWeekends"),
+                        element.getChild("MaxConsecutiveWorkingWeekends"),
+                        ContractLineType.CONSECUTIVE_WORKING_WEEKENDS);
+                contractLineId = readMinMaxContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, null,
+                        element.getChild("MaxWorkingWeekendsInFourWeeks"),
+                        ContractLineType.TOTAL_WORKING_WEEKENDS_IN_FOUR_WEEKS);
+// TODO
+//      <WeekendDefinition>SaturdaySunday</WeekendDefinition>
+                contractLineId = readBooleanContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("CompleteWeekends"),
+                        ContractLineType.COMPLETE_WEEKENDS);
+                contractLineId = readBooleanContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("IdenticalShiftTypesDuringWeekend"),
+                        ContractLineType.IDENTICAL_SHIFT_TYPES_DURING_WEEKEND);
+                contractLineId = readBooleanContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("NoNightShiftBeforeFreeWeekend"),
+                        ContractLineType.NO_NIGHT_SHIFT_BEFORE_FREE_WEEKEND);
+                contractLineId = readBooleanContractLine(contract, contractLineList, contractLineListOfContract,
+                        contractLineId, element.getChild("AlternativeSkillCategory"),
+                        ContractLineType.ALTERNATIVE_SKILL_CATEGORY);
+                contract.setContractLineList(contractLineListOfContract);
 
-                boolean minimumEnabled = minElement.getAttribute("on").getBooleanValue();
-                boolean maximumEnabled = maxElement.getAttribute("on").getBooleanValue();
-                ContractLine contractLine = new ContractLine();
+                List<Element> unwantedPatternElementList = (List<Element>) element.getChild("UnwantedPatterns")
+                        .getChildren();
+                for (Element patternElement : unwantedPatternElementList) {
+                    assertElementName(patternElement, "Pattern");
+                    Pattern pattern = patternMap.get(patternElement.getText());
+                    if (pattern == null) {
+                        throw new IllegalArgumentException("The pattern (" + patternElement.getText()
+                                + ") of contract (" + contract.getCode() + ") does not exist.");
+                    }
+                    // TODO unwanted pattern
+//      <UnwantedPatterns>
+//        <Pattern>0</Pattern>
+//        <Pattern>1</Pattern>
+//        <Pattern>2</Pattern>
+//      </UnwantedPatterns>
+
+
+                }
+
+                contractList.add(contract);
+                contractMap.put(contract.getCode(), contract);
+                id++;
+            }
+            nurseRoster.setContractList(contractList);
+            nurseRoster.setContractLineList(contractLineList);
+        }
+
+        private long readBooleanContractLine(Contract contract, List<ContractLine> contractLineList,
+                List<ContractLine> contractLineListOfContract, long contractLineId, Element element,
+                ContractLineType contractLineType) throws DataConversionException {
+            boolean enabled = Boolean.valueOf(element.getText());
+            if (enabled) {
+                BooleanContractLine contractLine = new BooleanContractLine();
                 contractLine.setId(contractLineId);
                 contractLine.setContract(contract);
-                contractLine.setContractLineType(ContractLineType.CONSECUTIVE_WORKING_DAYS);
+                contractLine.setContractLineType(contractLineType);
+                int weight = element.getAttribute("weight").getIntValue();
+                if (weight < 1) {
+                    throw new IllegalArgumentException("The weight (" + weight
+                            + ") of contract (" + contract.getCode() + ") and contractLineType (" + contractLineType
+                            + ") should be at least 1.");
+                }
+                contractLine.setWeight(weight);
+                contractLineList.add(contractLine);
+                contractLineListOfContract.add(contractLine);
+                contractLineId++;
+            }
+            return contractLineId;
+        }
+
+        private long readMinMaxContractLine(Contract contract, List<ContractLine> contractLineList,
+                List<ContractLine> contractLineListOfContract, long contractLineId,
+                Element minElement, Element maxElement,
+                ContractLineType contractLineType) throws DataConversionException {
+            boolean minimumEnabled = minElement == null ? false : minElement.getAttribute("on").getBooleanValue();
+            boolean maximumEnabled = maxElement == null ? false : maxElement.getAttribute("on").getBooleanValue();
+            if (minimumEnabled || maximumEnabled) {
+                MinMaxContractLine contractLine = new MinMaxContractLine();
+                contractLine.setId(contractLineId);
+                contractLine.setContract(contract);
+                contractLine.setContractLineType(contractLineType);
                 contractLine.setMinimumEnabled(minimumEnabled);
                 if (minimumEnabled) {
                     int minimumValue = Integer.parseInt(minElement.getText());
@@ -377,7 +467,8 @@
                     int minimumWeight = minElement.getAttribute("weight").getIntValue();
                     if (minimumWeight < 1) {
                         throw new IllegalArgumentException("The minimumWeight (" + minimumWeight
-                                + ") of contract (" + contract.getCode() + ") should be at least 1.");
+                                + ") of contract (" + contract.getCode() + ") and contractLineType (" + contractLineType
+                                + ") should be at least 1.");
                     }
                     contractLine.setMinimumWeight(minimumWeight);
                 }
@@ -392,55 +483,16 @@
                     int maximumWeight = maxElement.getAttribute("weight").getIntValue();
                     if (maximumWeight < 1) {
                         throw new IllegalArgumentException("The maximumWeight (" + maximumWeight
-                                + ") of contract (" + contract.getCode() + ") should be at least 1.");
+                                + ") of contract (" + contract.getCode() + ") and contractLineType (" + contractLineType
+                                + ") should be at least 1.");
                     }
                     contractLine.setMaximumWeight(maximumWeight);
                 }
                 contractLineList.add(contractLine);
                 contractLineListOfContract.add(contractLine);
                 contractLineId++;
-
-// TODO the rest of the contract
-//      <MaxConsecutiveFreeDays on="1" weight="1">5</MaxConsecutiveFreeDays>
-//      <MinConsecutiveFreeDays on="1" weight="1">1</MinConsecutiveFreeDays>
-//      <MaxConsecutiveWorkingWeekends on="0" weight="0">7</MaxConsecutiveWorkingWeekends>
-//      <MinConsecutiveWorkingWeekends on="0" weight="0">1</MinConsecutiveWorkingWeekends>
-//      <MaxWorkingWeekendsInFourWeeks on="0" weight="0">0</MaxWorkingWeekendsInFourWeeks>
-
-//      <WeekendDefinition>SaturdaySunday</WeekendDefinition>
-//      <CompleteWeekends weight="1">true</CompleteWeekends>
-//      <IdenticalShiftTypesDuringWeekend weight="1">true</IdenticalShiftTypesDuringWeekend>
-//      <NoNightShiftBeforeFreeWeekend weight="0">false</NoNightShiftBeforeFreeWeekend>
-//      <AlternativeSkillCategory weight="0">false</AlternativeSkillCategory>
-
-                contract.setContractLineList(contractLineListOfContract);
-
-
-                List<Element> unwantedPatternElementList = (List<Element>) element.getChild("UnwantedPatterns")
-                        .getChildren();
-                for (Element patternElement : unwantedPatternElementList) {
-                    assertElementName(patternElement, "Pattern");
-                    Pattern pattern = patternMap.get(patternElement.getText());
-                    if (pattern == null) {
-                        throw new IllegalArgumentException("The pattern (" + patternElement.getText()
-                                + ") of contract (" + contract.getCode() + ") does not exist.");
-                    }
-                    // TODO unwanted pattern
-//      <UnwantedPatterns>
-//        <Pattern>0</Pattern>
-//        <Pattern>1</Pattern>
-//        <Pattern>2</Pattern>
-//      </UnwantedPatterns>
-
-
-                }
-
-                contractList.add(contract);
-                contractMap.put(contract.getCode(), contract);
-                id++;
             }
-            nurseRoster.setContractList(contractList);
-            nurseRoster.setContractLineList(contractLineList);
+            return contractLineId;
         }
 
         private void readEmployeeList(NurseRoster nurseRoster, Element employeesElement) throws JDOMException {

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-05 12:55:45 UTC (rev 32745)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-05-05 13:09:50 UTC (rev 32746)
@@ -17,8 +17,10 @@
 import org.drools.planner.examples.nurserostering.domain.Skill;
 import org.drools.planner.examples.nurserostering.domain.SkillProficiency;
 import org.drools.planner.examples.nurserostering.domain.contract.Contract;
+import org.drools.planner.examples.nurserostering.domain.contract.BooleanContractLine;
 import org.drools.planner.examples.nurserostering.domain.contract.ContractLine;
 import org.drools.planner.examples.nurserostering.domain.contract.ContractLineType;
+import org.drools.planner.examples.nurserostering.domain.contract.MinMaxContractLine;
 import org.drools.planner.examples.nurserostering.domain.request.DayOffRequest;
 import org.drools.planner.examples.nurserostering.domain.request.DayOnRequest;
 import org.drools.planner.examples.nurserostering.domain.request.ShiftOffRequest;
@@ -82,7 +84,7 @@
 // Maximum number of consecutive working days // TODO too slow!
 //rule "maximumConsecutiveWorkingDays"
 //    when
-//        $contractLine : ContractLine(
+//        $contractLine : MinMaxContractLine(
 //            contractLineType == ContractLineType.CONSECUTIVE_WORKING_DAYS, maximumEnabled == true,
 //            $contract : contract, $maximumIndexDiff : maximumIndexDiff
 //        );
@@ -117,7 +119,7 @@
 // Minimum number of consecutive working days
 //rule "minimumConsecutiveWorkingDays"
 //    when
-//        $contractLine : ContractLine(
+//        $contractLine : MinMaxContractLine(
 //            contractLineType == ContractLineType.CONSECUTIVE_WORKING_DAYS, minimumEnabled == true,
 //            $contract : contract, $minimumIndexDiff : minimumIndexDiff
 //        );
@@ -155,7 +157,7 @@
 // Minimum number of consecutive free days
 //rule "minimumConsecutiveFreeDays"
 //    when
-//        $contractLine : ContractLine(
+//        $contractLine : MinMaxContractLine(
 //            contractLineType == ContractLineType.CONSECUTIVE_FREE_DAYS, minimumEnabled == true,
 //            $contract : contract, $minimumIndexDiff : minimumIndexDiff
 //        )
@@ -206,11 +208,11 @@
 rule "dayOffRequest"
     when
         $dayOffRequest : DayOffRequest($employee : employee, $shiftDate : shiftDate, $weight : weight);
-        $employeeAssignment : EmployeeAssignment(employee == $employee, shiftDate == $shiftDate);
+        exists EmployeeAssignment(employee == $employee, shiftDate == $shiftDate);
     then
         insertLogical(new IntConstraintOccurrence("dayOffRequest", ConstraintType.NEGATIVE_SOFT,
                 $weight,
-                $dayOffRequest, $employeeAssignment));
+                $dayOffRequest));
 end
 rule "dayOnRequest"
     when
@@ -226,11 +228,11 @@
 rule "shiftOffRequest"
     when
         $shiftOffRequest : ShiftOffRequest($employee : employee, $shift : shift, $weight : weight);
-        $employeeAssignment : EmployeeAssignment(employee == $employee, shift == $shift);
+        exists EmployeeAssignment(employee == $employee, shift == $shift);
     then
         insertLogical(new IntConstraintOccurrence("shiftOffRequest", ConstraintType.NEGATIVE_SOFT,
                 $weight,
-                $shiftOffRequest, $employeeAssignment));
+                $shiftOffRequest));
 end
 rule "shiftOnRequest"
     when
@@ -243,7 +245,16 @@
 end
 
 // Alternative skill
-// TODO
+rule "alternativeSkill"
+    when
+        $employeeAssignment : EmployeeAssignment($employee : employee, $shiftType : shiftType);
+        ShiftTypeSkillRequirement(shiftType == $shiftType, $skill : skill);
+        not SkillProficiency(employee == $employee, skill == $skill);
+    then
+        insertLogical(new IntConstraintOccurrence("alternativeSkill", ConstraintType.NEGATIVE_SOFT,
+                1,
+                $employeeAssignment));
+end
 
 // Unwanted patterns
 // TODO



More information about the jboss-svn-commits mailing list