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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri May 28 15:46:04 EDT 2010


Author: ge0ffrey
Date: 2010-05-28 15:46:03 -0400 (Fri, 28 May 2010)
New Revision: 33152

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntry.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntryPropertyWildcard.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/PatternContractLine.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/PatternEntryOccurrence.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/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.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:
unwanted patterns (first attempt)

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-28 17:39:15 UTC (rev 33151)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Assignment.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -103,6 +103,10 @@
         return shift.getShiftDate().getDayIndex();
     }
 
+    public DayOfWeek getShiftDateDayOfWeek() {
+        return shift.getShiftDate().getDayOfWeek();
+    }
+
     public Contract getContract() {
         return employee.getContract();
     }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java	2010-05-28 17:39:15 UTC (rev 33151)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -13,6 +13,7 @@
 import org.drools.planner.examples.common.domain.AbstractPersistable;
 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.PatternContractLine;
 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;
@@ -30,8 +31,10 @@
     private List<ShiftType> shiftTypeList;
     private List<ShiftTypeSkillRequirement> shiftTypeSkillRequirementList;
     private List<Pattern> patternList;
+    private List<PatternEntry> patternEntryList;
     private List<Contract> contractList;
     private List<ContractLine> contractLineList;
+    private List<PatternContractLine> patternContractLineList;
     private List<Employee> employeeList;
     private List<SkillProficiency> skillProficiencyList;
     private List<ShiftDate> shiftDateList;
@@ -85,6 +88,14 @@
         this.patternList = patternList;
     }
 
+    public List<PatternEntry> getPatternEntryList() {
+        return patternEntryList;
+    }
+
+    public void setPatternEntryList(List<PatternEntry> patternEntryList) {
+        this.patternEntryList = patternEntryList;
+    }
+
     public List<Contract> getContractList() {
         return contractList;
     }
@@ -101,6 +112,14 @@
         this.contractLineList = contractLineList;
     }
 
+    public List<PatternContractLine> getPatternContractLineList() {
+        return patternContractLineList;
+    }
+
+    public void setPatternContractLineList(List<PatternContractLine> patternContractLineList) {
+        this.patternContractLineList = patternContractLineList;
+    }
+
     public List<Employee> getEmployeeList() {
         return employeeList;
     }
@@ -194,8 +213,10 @@
         facts.addAll(shiftTypeList);
         facts.addAll(shiftTypeSkillRequirementList);
         facts.addAll(patternList);
+        facts.addAll(patternEntryList);
         facts.addAll(contractList);
         facts.addAll(contractLineList);
+        facts.addAll(patternContractLineList);
         facts.addAll(employeeList);
         facts.addAll(skillProficiencyList);
         facts.addAll(shiftDateList);
@@ -224,8 +245,10 @@
         clone.shiftTypeList = shiftTypeList;
         clone.shiftTypeSkillRequirementList = shiftTypeSkillRequirementList;
         clone.patternList = patternList;
+        clone.patternEntryList = patternEntryList;
         clone.contractList = contractList;
         clone.contractLineList = contractLineList;
+        clone.patternContractLineList = patternContractLineList;
         clone.employeeList = employeeList;
         clone.skillProficiencyList = skillProficiencyList;
         clone.shiftDateList = shiftDateList;

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntry.java (from rev 33127, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Pattern.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntry.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntry.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -0,0 +1,81 @@
+package org.drools.planner.examples.nurserostering.domain;
+
+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("PatternEntry")
+public class PatternEntry extends AbstractPersistable implements Comparable<PatternEntry> {
+
+    private Pattern pattern;
+    private int entryIndex;
+
+    private PatternEntryPropertyWildcard dayOfWeekWildcard;
+    private DayOfWeek dayOfWeek;
+    private PatternEntryPropertyWildcard shiftTypeWildcard;
+    private ShiftType shiftType;
+
+    public Pattern getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(Pattern pattern) {
+        this.pattern = pattern;
+    }
+
+    public int getEntryIndex() {
+        return entryIndex;
+    }
+
+    public void setEntryIndex(int entryIndex) {
+        this.entryIndex = entryIndex;
+    }
+
+    public PatternEntryPropertyWildcard getDayOfWeekWildcard() {
+        return dayOfWeekWildcard;
+    }
+
+    public void setDayOfWeekWildcard(PatternEntryPropertyWildcard dayOfWeekWildcard) {
+        this.dayOfWeekWildcard = dayOfWeekWildcard;
+    }
+
+    public DayOfWeek getDayOfWeek() {
+        return dayOfWeek;
+    }
+
+    public void setDayOfWeek(DayOfWeek dayOfWeek) {
+        this.dayOfWeek = dayOfWeek;
+    }
+
+    public PatternEntryPropertyWildcard getShiftTypeWildcard() {
+        return shiftTypeWildcard;
+    }
+
+    public void setShiftTypeWildcard(PatternEntryPropertyWildcard shiftTypeWildcard) {
+        this.shiftTypeWildcard = shiftTypeWildcard;
+    }
+
+    public ShiftType getShiftType() {
+        return shiftType;
+    }
+
+    public void setShiftType(ShiftType shiftType) {
+        this.shiftType = shiftType;
+    }
+
+    public int compareTo(PatternEntry other) {
+        return new CompareToBuilder()
+                .append(id, other.id)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return pattern + "-" + entryIndex + ": "
+                + dayOfWeekWildcard + "(" + dayOfWeek + ") " + shiftTypeWildcard + "(" + shiftType + ")";
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntryPropertyWildcard.java (from rev 33127, 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/PatternEntryPropertyWildcard.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/PatternEntryPropertyWildcard.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -0,0 +1,11 @@
+package org.drools.planner.examples.nurserostering.domain;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public enum PatternEntryPropertyWildcard {
+    NONE,
+    SPECIFIC,
+    ANY;
+
+}

Added: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/PatternContractLine.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/PatternContractLine.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/PatternContractLine.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -0,0 +1,47 @@
+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;
+import org.drools.planner.examples.nurserostering.domain.DayOfWeek;
+import org.drools.planner.examples.nurserostering.domain.Pattern;
+import org.drools.planner.examples.nurserostering.domain.PatternEntryPropertyWildcard;
+import org.drools.planner.examples.nurserostering.domain.ShiftType;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("PatternContractLine")
+public class PatternContractLine extends AbstractPersistable implements Comparable<PatternContractLine> {
+
+    private Contract contract;
+    private Pattern pattern;
+
+    public Contract getContract() {
+        return contract;
+    }
+
+    public void setContract(Contract contract) {
+        this.contract = contract;
+    }
+
+    public Pattern getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(Pattern pattern) {
+        this.pattern = pattern;
+    }
+
+    public int compareTo(PatternContractLine other) {
+        return new CompareToBuilder()
+                .append(id, other.id)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return contract + "-" + pattern;
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/PatternEntryOccurrence.java (from rev 33127, 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/PatternEntryOccurrence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/PatternEntryOccurrence.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -0,0 +1,100 @@
+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.Pattern;
+import org.drools.planner.examples.nurserostering.domain.PatternEntry;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class PatternEntryOccurrence implements Comparable<PatternEntryOccurrence>, Serializable {
+
+    private PatternEntry patternEntry;
+    private Employee employee;
+    private ShiftDate shiftDate;
+
+    public PatternEntryOccurrence(PatternEntry patternEntry, Employee employee, ShiftDate shiftDate) {
+        this.patternEntry = patternEntry;
+        this.employee = employee;
+        this.shiftDate = shiftDate;
+    }
+
+    public PatternEntry getPatternEntry() {
+        return patternEntry;
+    }
+
+    public void setPatternEntry(PatternEntry patternEntry) {
+        this.patternEntry = patternEntry;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public ShiftDate getShiftDate() {
+        return shiftDate;
+    }
+
+    public void setShiftDate(ShiftDate shiftDate) {
+        this.shiftDate = shiftDate;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof PatternEntryOccurrence) {
+            PatternEntryOccurrence other = (PatternEntryOccurrence) o;
+            return new EqualsBuilder()
+                    .append(patternEntry, other.patternEntry)
+                    .append(employee, other.employee)
+                    .append(shiftDate, other.shiftDate)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(patternEntry)
+                .append(employee)
+                .append(shiftDate)
+                .toHashCode();
+    }
+
+    public int compareTo(PatternEntryOccurrence other) {
+        return new CompareToBuilder()
+                .append(patternEntry, other.patternEntry)
+                .append(employee, other.employee)
+                .append(shiftDate, other.shiftDate)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return patternEntry + " for " + employee + " on " + shiftDate;
+    }
+
+    public Pattern getPattern() {
+        return patternEntry.getPattern();
+    }
+
+    public int getEntryIndex() {
+        return patternEntry.getEntryIndex();
+    }
+
+    public int getDayIndex() {
+        return shiftDate.getDayIndex();
+    }
+
+}

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-28 17:39:15 UTC (rev 33151)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionImporter.java	2010-05-28 19:46:03 UTC (rev 33152)
@@ -20,6 +20,8 @@
 import org.drools.planner.examples.nurserostering.domain.Employee;
 import org.drools.planner.examples.nurserostering.domain.NurseRoster;
 import org.drools.planner.examples.nurserostering.domain.Pattern;
+import org.drools.planner.examples.nurserostering.domain.PatternEntry;
+import org.drools.planner.examples.nurserostering.domain.PatternEntryPropertyWildcard;
 import org.drools.planner.examples.nurserostering.domain.Shift;
 import org.drools.planner.examples.nurserostering.domain.ShiftDate;
 import org.drools.planner.examples.nurserostering.domain.ShiftType;
@@ -32,6 +34,7 @@
 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.contract.PatternContractLine;
 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;
@@ -292,13 +295,17 @@
 
         private void readPatternList(NurseRoster nurseRoster, Element patternsElement) throws JDOMException {
             List<Pattern> patternList;
+            List<PatternEntry> patternEntryList;
             if (patternsElement == null) {
                 patternList = Collections.emptyList();
+                patternEntryList = Collections.emptyList();
             } else {
                 List<Element> patternElementList = (List<Element>) patternsElement.getChildren();
                 patternList = new ArrayList<Pattern>(patternElementList.size());
                 patternMap = new HashMap<String, Pattern>(patternElementList.size());
                 long id = 0L;
+                patternEntryList = new ArrayList<PatternEntry>(patternElementList.size() * 3);
+                long patternEntryId = 0L;
                 for (Element element : patternElementList) {
                     assertElementName(element, "Pattern");
                     Pattern pattern = new Pattern();
@@ -308,52 +315,48 @@
 
                     List<Element> patternEntryElementList = (List<Element>) element.getChild("PatternEntries")
                             .getChildren();
+                    int entryIndex = 0;
                     for (Element patternEntryElement : patternEntryElementList) {
                         assertElementName(patternEntryElement, "PatternEntry");
                         Element shiftTypeElement = patternEntryElement.getChild("ShiftType");
+                        PatternEntryPropertyWildcard shiftTypeWildcard;
                         ShiftType shiftType = shiftTypeMap.get(shiftTypeElement.getText());
                         if (shiftType == null) {
                             if (shiftTypeElement.getText().equals("Any")) {
-                                // TODO
-
-
+                                shiftTypeWildcard = PatternEntryPropertyWildcard.ANY;
                             } else if (shiftTypeElement.getText().equals("None")) {
-                                // TODO
-
-
+                                shiftTypeWildcard = PatternEntryPropertyWildcard.NONE;
                             } else {
                                 throw new IllegalArgumentException("The shiftType (" + shiftTypeElement.getText()
                                         + ") of pattern (" + pattern.getCode() + ") does not exist.");
                             }
+                        } else {
+                            shiftTypeWildcard = PatternEntryPropertyWildcard.SPECIFIC;
                         }
                         Element dayElement = patternEntryElement.getChild("Day");
+                        PatternEntryPropertyWildcard dayOfWeekWildcard;
                         DayOfWeek dayOfWeek = DayOfWeek.valueOfCode(dayElement.getText());
                         if (dayOfWeek == null) {
                             if (dayElement.getText().equals("Any")) {
-                                // TODO
-
-
+                                dayOfWeekWildcard = PatternEntryPropertyWildcard.ANY;
                             } else {
                                 throw new IllegalArgumentException("The dayOfWeek (" + dayElement.getText()
                                         + ") of pattern (" + pattern.getCode() + ") does not exist.");
                             }
+                        } else {
+                            dayOfWeekWildcard = PatternEntryPropertyWildcard.SPECIFIC;
                         }
-
-                        // TODO shiftType & day etc
-
-    //        <PatternEntry index="0">
-    //          <ShiftType>None</ShiftType>
-    //          <Day>Friday</Day>
-    //        </PatternEntry>
-    //        <PatternEntry index="1">
-    //          <ShiftType>Any</ShiftType>
-    //          <Day>Saturday</Day>
-    //        </PatternEntry>
-    //        <PatternEntry index="2">
-    //          <ShiftType>Any</ShiftType>
-    //          <Day>Sunday</Day>
-    //        </PatternEntry>
-
+                        PatternEntry patternEntry = new PatternEntry();
+                        patternEntry.setId(patternEntryId);
+                        patternEntry.setPattern(pattern);
+                        patternEntry.setEntryIndex(entryIndex);
+                        patternEntry.setDayOfWeekWildcard(dayOfWeekWildcard);
+                        patternEntry.setDayOfWeek(dayOfWeek);
+                        patternEntry.setShiftTypeWildcard(shiftTypeWildcard);
+                        patternEntry.setShiftType(shiftType);
+                        patternEntryList.add(patternEntry);
+                        patternEntryId++;
+                        entryIndex++;
                     }
 
                     patternList.add(pattern);
@@ -366,6 +369,7 @@
                 }
             }
             nurseRoster.setPatternList(patternList);
+            nurseRoster.setPatternEntryList(patternEntryList);
         }
 
         private void readContractList(NurseRoster nurseRoster, Element contractsElement) throws JDOMException {
@@ -377,6 +381,9 @@
             List<ContractLine> contractLineList = new ArrayList<ContractLine>(
                     contractElementList.size() * contractLineTypeListSize);
             long contractLineId = 0L;
+            List<PatternContractLine> patternContractLineList = new ArrayList<PatternContractLine>(
+                    contractElementList.size() * 3);
+            long patternContractLineId = 0L;
             for (Element element : contractElementList) {
                 assertElementName(element, "Contract");
                 Contract contract = new Contract();
@@ -434,14 +441,12 @@
                         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>
-
-
+                    PatternContractLine patternContractLine = new PatternContractLine();
+                    patternContractLine.setId(patternContractLineId);
+                    patternContractLine.setContract(contract);
+                    patternContractLine.setPattern(pattern);
+                    patternContractLineList.add(patternContractLine);
+                    patternContractLineId++;
                 }
 
                 contractList.add(contract);
@@ -454,6 +459,7 @@
             }
             nurseRoster.setContractList(contractList);
             nurseRoster.setContractLineList(contractLineList);
+            nurseRoster.setPatternContractLineList(patternContractLineList);
         }
 
         private long readBooleanContractLine(Contract contract, List<ContractLine> contractLineList,

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-28 17:39:15 UTC (rev 33151)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-05-28 19:46:03 UTC (rev 33152)
@@ -10,6 +10,9 @@
 import org.drools.planner.examples.nurserostering.domain.Assignment;
 import org.drools.planner.examples.nurserostering.domain.NurseRoster;
 import org.drools.planner.examples.nurserostering.domain.Pattern;
+import org.drools.planner.examples.nurserostering.domain.PatternEntry;
+import org.drools.planner.examples.nurserostering.domain.PatternEntryPropertyWildcard;
+import org.drools.planner.examples.nurserostering.domain.contract.PatternContractLine;
 import org.drools.planner.examples.nurserostering.domain.RosterInfo;
 import org.drools.planner.examples.nurserostering.domain.Shift;
 import org.drools.planner.examples.nurserostering.domain.ShiftDate;
@@ -34,6 +37,7 @@
 import org.drools.planner.examples.nurserostering.domain.solver.EmployeeFreeDaySequence;
 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.PatternEntryOccurrence;
 
 // @author Geoffrey De Smet
 
@@ -499,7 +503,62 @@
 end
 
 // Unwanted patterns
-// TODO
+rule "insertPatternEntryOccurrenceShiftType"
+    when
+        $patternEntry : PatternEntry(shiftTypeWildcard != PatternEntryPropertyWildcard.NONE,
+            $dayOfWeekWildcard : dayOfWeekWildcard, $dayOfWeek : dayOfWeek,
+            $shiftTypeWildcard : shiftTypeWildcard, $shiftType : shiftType,
+            $pattern : pattern
+        )
+        Assignment(
+            (PatternEntryPropertyWildcard.ANY == $dayOfWeekWildcard) || (shiftDateDayOfWeek == $dayOfWeek),
+            (PatternEntryPropertyWildcard.ANY == $shiftTypeWildcard) || (shiftType == $shiftType),
+            $contract : contract, $employee : employee, $shiftDate : shiftDate
+        )
+        PatternContractLine(
+            pattern == $pattern, contract == $contract
+        )
+    then
+        insertLogical(new PatternEntryOccurrence($patternEntry, $employee, $shiftDate));
+end
+rule "insertPatternEntryOccurrenceNoneShiftType"
+    when
+        $patternEntry : PatternEntry(shiftTypeWildcard == PatternEntryPropertyWildcard.NONE,
+            $dayOfWeekWildcard : dayOfWeekWildcard, $dayOfWeek : dayOfWeek,
+            $pattern : pattern
+        )
+        $employee : Employee(
+            $contract : contract
+        )
+        PatternContractLine(
+            pattern == $pattern, contract == $contract
+        )
+        $shiftDate : ShiftDate(
+            (PatternEntryPropertyWildcard.ANY == $dayOfWeekWildcard) || (dayOfWeek == $dayOfWeek)
+        )
+        not Assignment(
+            employee == $employee, shiftDate == $shiftDate
+        )
+    then
+        insertLogical(new PatternEntryOccurrence($patternEntry, $employee, $shiftDate));
+end
+rule "unwantedPatterns"
+    when
+        $pattern : Pattern()
+        PatternEntryOccurrence(
+            pattern == $pattern, entryIndex == 0,
+            $employee : employee, $firstDayIndex : dayIndex)
+        PatternEntryOccurrence(
+            pattern == $pattern, entryIndex == 1,
+            employee == $employee, dayIndex == ($firstDayIndex + 1))
+        PatternEntryOccurrence(
+            pattern == $pattern, entryIndex == 2,
+            employee == $employee, dayIndex == ($firstDayIndex + 2))
+    then
+        insertLogical(new IntConstraintOccurrence("unwantedPatterns", ConstraintType.NEGATIVE_SOFT,
+                $pattern.getWeight(),
+                $pattern, $employee, $firstDayIndex));
+end
 
 // ############################################################################
 // Calculate score



More information about the jboss-svn-commits mailing list