001 /** 002 * Copyright 2004-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.hr.time.assignment.dao; 017 018 import java.sql.Date; 019 import java.util.ArrayList; 020 import java.util.Collection; 021 import java.util.HashSet; 022 import java.util.List; 023 import java.util.Set; 024 025 import com.google.common.collect.ImmutableList; 026 import org.apache.commons.collections.CollectionUtils; 027 import org.apache.commons.lang.StringUtils; 028 import org.apache.log4j.Logger; 029 import org.apache.ojb.broker.query.Criteria; 030 import org.apache.ojb.broker.query.Query; 031 import org.apache.ojb.broker.query.QueryFactory; 032 import org.apache.ojb.broker.query.ReportQueryByCriteria; 033 import org.kuali.hr.core.util.OjbSubQueryUtil; 034 import org.kuali.hr.time.assignment.Assignment; 035 import org.kuali.hr.time.service.base.TkServiceLocator; 036 import org.kuali.hr.time.util.TKContext; 037 import org.kuali.hr.time.util.TKUtils; 038 import org.kuali.hr.time.workarea.WorkArea; 039 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; 040 041 public class AssignmentDaoSpringOjbImpl extends PlatformAwareDaoBaseOjb implements AssignmentDao { 042 043 private static final Logger LOG = Logger.getLogger(AssignmentDaoSpringOjbImpl.class); 044 private static final ImmutableList<String> ASSIGNMENT_EQUAL_TO_FIELD = new ImmutableList.Builder<String>() 045 .add("jobNumber") 046 .add("workArea") 047 .add("task") 048 .add("principalId") 049 .build(); 050 051 @Override 052 public void saveOrUpdate(Assignment assignment) { 053 this.getPersistenceBrokerTemplate().store(assignment); 054 } 055 056 @Override 057 public void saveOrUpdate(List<Assignment> assignments) { 058 if (assignments != null) { 059 for (Assignment assign : assignments) { 060 this.getPersistenceBrokerTemplate().store(assign); 061 } 062 } 063 } 064 065 @Override 066 public void delete(Assignment assignment) { 067 if (assignment != null) { 068 LOG.debug("Deleting assignment:" + assignment.getTkAssignmentId()); 069 this.getPersistenceBrokerTemplate().delete(assignment); 070 } else { 071 LOG.warn("Attempt to delete null assignment."); 072 } 073 } 074 075 public Assignment getAssignment(String principalId, Long jobNumber, Long workArea, Long task, Date asOfDate) { 076 Criteria root = new Criteria(); 077 078 root.addEqualTo("principalId", principalId); 079 root.addEqualTo("jobNumber", jobNumber); 080 root.addEqualTo("workArea", workArea); 081 root.addEqualTo("task", task); 082 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Assignment.class, asOfDate, ASSIGNMENT_EQUAL_TO_FIELD, false)); 083 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false)); 084 //root.addEqualTo("active", true); 085 086 Criteria activeFilter = new Criteria(); // Inner Join For Activity 087 activeFilter.addEqualTo("active", true); 088 root.addAndCriteria(activeFilter); 089 090 Query query = QueryFactory.newQuery(Assignment.class, root); 091 Object o = this.getPersistenceBrokerTemplate().getObjectByQuery(query); 092 093 return (Assignment) o; 094 } 095 096 097 @Override 098 public Assignment getAssignment(Long job, Long workArea, Long task, Date asOfDate) { 099 Criteria root = new Criteria(); 100 101 root.addEqualTo("jobNumber", job); 102 root.addEqualTo("workArea", workArea); 103 root.addEqualTo("task", task); 104 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Assignment.class, asOfDate, ASSIGNMENT_EQUAL_TO_FIELD, false)); 105 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false)); 106 root.addEqualTo("principalId", TKContext.getTargetPrincipalId()); 107 //root.addEqualTo("active", true); 108 109 Criteria activeFilter = new Criteria(); // Inner Join For Activity 110 activeFilter.addEqualTo("active", true); 111 root.addAndCriteria(activeFilter); 112 113 Query query = QueryFactory.newQuery(Assignment.class, root); 114 Object o = this.getPersistenceBrokerTemplate().getObjectByQuery(query); 115 116 return (Assignment) o; 117 } 118 119 @SuppressWarnings({"unchecked", "rawtypes"}) 120 @Override 121 public List<Assignment> findAssignments(String principalId, Date asOfDate) { 122 List<Assignment> assignments = new ArrayList<Assignment>(); 123 Criteria root = new Criteria(); 124 125 root.addEqualTo("principalId", principalId); 126 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Assignment.class, asOfDate, ASSIGNMENT_EQUAL_TO_FIELD, false)); 127 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false)); 128 //root.addEqualTo("active", true); 129 130 Criteria activeFilter = new Criteria(); // Inner Join For Activity 131 activeFilter.addEqualTo("active", true); 132 root.addAndCriteria(activeFilter); 133 134 Query query = QueryFactory.newQuery(Assignment.class, root); 135 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 136 137 if (c != null) { 138 assignments.addAll(c); 139 } 140 141 return assignments; 142 } 143 144 @SuppressWarnings({"unchecked", "rawtypes"}) 145 @Override 146 public List<Assignment> findAssignmentsWithinPeriod(String principalId, Date startDate, Date endDate) { 147 List<Assignment> assignments = new ArrayList<Assignment>(); 148 Criteria root = new Criteria(); 149 150 root.addGreaterOrEqualThan("effectiveDate", startDate); 151 root.addLessOrEqualThan("effectiveDate", endDate); 152 root.addEqualTo("principalId", principalId); 153 root.addEqualTo("active", true); 154 155 Query query = QueryFactory.newQuery(Assignment.class, root); 156 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 157 158 if (c != null) { 159 assignments.addAll(c); 160 } 161 162 return assignments; 163 } 164 165 @SuppressWarnings({"rawtypes", "unchecked"}) 166 public List<Assignment> getActiveAssignmentsInWorkArea(Long workArea, Date asOfDate) { 167 List<Assignment> assignments = new ArrayList<Assignment>(); 168 Criteria root = new Criteria(); 169 170 root.addEqualTo("workArea", workArea); 171 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Assignment.class, asOfDate, ASSIGNMENT_EQUAL_TO_FIELD, true)); 172 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, true)); 173 root.addEqualTo("active", true); 174 175 Criteria activeFilter = new Criteria(); // Inner Join For Activity 176 activeFilter.addEqualTo("active", true); 177 root.addAndCriteria(activeFilter); 178 179 Query query = QueryFactory.newQuery(Assignment.class, root); 180 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 181 182 if (c != null) { 183 assignments.addAll(c); 184 } 185 186 return assignments; 187 } 188 189 public List<Assignment> getActiveAssignments(Date asOfDate) { 190 List<Assignment> assignments = new ArrayList<Assignment>(); 191 192 Criteria root = new Criteria(); 193 root.addLessOrEqualThan("effectiveDate", asOfDate); 194 195 Criteria timestamp = new Criteria(); 196 timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 197 timestamp.addEqualToField("jobNumber", Criteria.PARENT_QUERY_PREFIX + "jobNumber"); 198 timestamp.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); 199 timestamp.addEqualToField("task", Criteria.PARENT_QUERY_PREFIX + "task"); 200 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate"); 201 ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(Assignment.class, timestamp); 202 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"}); 203 root.addEqualTo("timestamp", timestampSubQuery); 204 205 Criteria activeFilter = new Criteria(); 206 activeFilter.addEqualTo("active", true); 207 root.addAndCriteria(activeFilter); 208 209 Query query = QueryFactory.newQuery(Assignment.class, root); 210 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 211 212 if (c != null) { 213 assignments.addAll(c); 214 } 215 216 return assignments; 217 } 218 219 public Assignment getAssignment(String tkAssignmentId) { 220 Criteria crit = new Criteria(); 221 crit.addEqualTo("tkAssignmentId", tkAssignmentId); 222 Query query = QueryFactory.newQuery(Assignment.class, crit); 223 return (Assignment) this.getPersistenceBrokerTemplate().getObjectByQuery(query); 224 } 225 226 // KPME-1129 Kagata 227 @SuppressWarnings({"rawtypes", "unchecked"}) 228 public List<Assignment> getActiveAssignmentsForJob(String principalId, Long jobNumber, Date asOfDate) { 229 List<Assignment> assignments = new ArrayList<Assignment>(); 230 Criteria root = new Criteria(); 231 232 root.addEqualTo("principalId", principalId); 233 root.addEqualTo("jobNumber", jobNumber); 234 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Assignment.class, asOfDate, ASSIGNMENT_EQUAL_TO_FIELD, false)); 235 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false)); 236 root.addEqualTo("active", true); 237 238 Criteria activeFilter = new Criteria(); // Inner Join For Activity 239 activeFilter.addEqualTo("active", true); 240 root.addAndCriteria(activeFilter); 241 242 Query query = QueryFactory.newQuery(Assignment.class, root); 243 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 244 245 if (c != null) { 246 assignments.addAll(c); 247 } 248 249 return assignments; 250 } 251 252 @Override 253 @SuppressWarnings("unchecked") 254 public List<Assignment> searchAssignments(Date fromEffdt, Date toEffdt, String principalId, String jobNumber, String dept, String workArea, 255 String active, String showHistory) { 256 257 List<Assignment> results = new ArrayList<Assignment>(); 258 259 Criteria root = new Criteria(); 260 261 Criteria effectiveDateFilter = new Criteria(); 262 if (fromEffdt != null) { 263 effectiveDateFilter.addGreaterOrEqualThan("effectiveDate", fromEffdt); 264 } 265 if (toEffdt != null) { 266 effectiveDateFilter.addLessOrEqualThan("effectiveDate", toEffdt); 267 } 268 if (fromEffdt == null && toEffdt == null) { 269 effectiveDateFilter.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate()); 270 } 271 root.addAndCriteria(effectiveDateFilter); 272 273 if (StringUtils.isNotBlank(principalId)) { 274 root.addLike("principalId", principalId); 275 } 276 277 if (StringUtils.isNotBlank(jobNumber)) { 278 root.addLike("jobNumber", jobNumber); 279 } 280 281 if (StringUtils.isNotBlank(dept)) { 282 Criteria workAreaCriteria = new Criteria(); 283 Date asOfDate = toEffdt != null ? toEffdt : TKUtils.getCurrentDate(); 284 Collection<WorkArea> workAreasForDept = TkServiceLocator.getWorkAreaService().getWorkAreas(dept,asOfDate); 285 if (CollectionUtils.isNotEmpty(workAreasForDept)) { 286 List<Long> longWorkAreas = new ArrayList<Long>(); 287 for(WorkArea cwa : workAreasForDept){ 288 longWorkAreas.add(cwa.getWorkArea()); 289 } 290 workAreaCriteria.addIn("workArea", longWorkAreas); 291 } 292 root.addAndCriteria(workAreaCriteria); 293 } 294 295 if (StringUtils.isNotBlank(workArea)) { 296 root.addLike("workArea", workArea); 297 } 298 299 if (StringUtils.isNotBlank(active)) { 300 Criteria activeFilter = new Criteria(); 301 if (StringUtils.equals(active, "Y")) { 302 activeFilter.addEqualTo("active", true); 303 } else if (StringUtils.equals(active, "N")) { 304 activeFilter.addEqualTo("active", false); 305 } 306 root.addAndCriteria(activeFilter); 307 } 308 309 if (StringUtils.equals(showHistory, "N")) { 310 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQueryWithFilter(Assignment.class, effectiveDateFilter, ASSIGNMENT_EQUAL_TO_FIELD, false)); 311 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false)); 312 } 313 314 Query query = QueryFactory.newQuery(Assignment.class, root); 315 results.addAll(getPersistenceBrokerTemplate().getCollectionByQuery(query)); 316 317 return results; 318 } 319 320 @Override 321 public Assignment getMaxTimestampAssignment(String principalId) { 322 Criteria root = new Criteria(); 323 Criteria crit = new Criteria(); 324 325 crit.addEqualTo("principalId", principalId); 326 ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(Assignment.class, crit); 327 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"}); 328 329 root.addEqualTo("principalId", principalId); 330 root.addEqualTo("timestamp", timestampSubQuery); 331 332 Query query = QueryFactory.newQuery(Assignment.class, root); 333 return (Assignment) this.getPersistenceBrokerTemplate().getObjectByQuery(query); 334 } 335 336 public List<String> getPrincipalIds(List<String> workAreaList, Date effdt, Date startDate, Date endDate) { 337 List<Assignment> results = this.getAssignments(workAreaList, effdt, startDate, endDate); 338 Set<String> pids = new HashSet<String>(); 339 for(Assignment anAssignment : results) { 340 if(anAssignment != null) { 341 pids.add(anAssignment.getPrincipalId()); 342 } 343 } 344 List<String> ids = new ArrayList<String>(); 345 ids.addAll(pids); 346 return ids; 347 } 348 349 public List<Assignment> getAssignments(List<String> workAreaList, Date effdt, Date startDate, Date endDate) { 350 List<Assignment> results = new ArrayList<Assignment>(); 351 352 Criteria activeRoot = new Criteria(); 353 Criteria activEeffdtCrit = new Criteria(); 354 Criteria effdtCrit = new Criteria(); 355 Criteria inactiveRoot = new Criteria(); 356 357 ReportQueryByCriteria effdtSubQuery = OjbSubQueryUtil.getEffectiveDateSubQueryWithoutFilter(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false); 358 ReportQueryByCriteria activeEffdtSubQuery = OjbSubQueryUtil.getEffectiveDateSubQuery(Assignment.class, effdt, ASSIGNMENT_EQUAL_TO_FIELD, false); 359 ReportQueryByCriteria timestampSubQuery = OjbSubQueryUtil.getTimestampSubQuery(Assignment.class, ASSIGNMENT_EQUAL_TO_FIELD, false); 360 361 inactiveRoot.addEqualTo("active", "N"); 362 inactiveRoot.addIn("workArea", workAreaList); 363 inactiveRoot.addGreaterOrEqualThan("effectiveDate", startDate); 364 inactiveRoot.addLessOrEqualThan("effectiveDate", endDate); 365 inactiveRoot.addEqualTo("effectiveDate", effdtSubQuery); 366 inactiveRoot.addEqualTo("timestamp", timestampSubQuery); 367 368 activeRoot.addIn("workArea", workAreaList); 369 activeRoot.addEqualTo("active", "Y"); 370 activeRoot.addEqualTo("effectiveDate", activeEffdtSubQuery); 371 activeRoot.addEqualTo("timestamp", timestampSubQuery); 372 activeRoot.addOrCriteria(inactiveRoot); 373 374 Query query = QueryFactory.newQuery(Assignment.class, activeRoot); 375 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 376 if (c != null) { 377 results.addAll(c); 378 } 379 380 return results; 381 } 382 383 }