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.roles.dao; 017 018 import java.sql.Date; 019 import java.util.ArrayList; 020 import java.util.Collection; 021 import java.util.List; 022 023 import org.apache.commons.collections.CollectionUtils; 024 import org.apache.commons.lang.StringUtils; 025 import org.apache.ojb.broker.query.Criteria; 026 import org.apache.ojb.broker.query.Query; 027 import org.apache.ojb.broker.query.QueryFactory; 028 import org.apache.ojb.broker.query.ReportQueryByCriteria; 029 import org.kuali.hr.job.Job; 030 import org.kuali.hr.time.roles.TkRole; 031 import org.kuali.hr.time.service.base.TkServiceLocator; 032 import org.kuali.hr.time.util.TKUtils; 033 import org.kuali.hr.time.util.TkConstants; 034 import org.kuali.hr.time.workarea.WorkArea; 035 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; 036 import org.kuali.rice.krad.service.KRADServiceLocator; 037 038 public class TkRoleDaoSpringOjbImpl extends PlatformAwareDaoBaseOjb implements TkRoleDao { 039 040 public List<TkRole> findAllRoles(String principalId, Date asOfDate) { 041 return findRoles(principalId, asOfDate, null, null, null, null); 042 } 043 044 @SuppressWarnings("unchecked") 045 @Override 046 public List<TkRole> findPositionRoles(String positionNumber, Date asOfDate, String roleName, Long workArea, String department, String chart) { 047 List<TkRole> roles = new ArrayList<TkRole>(); 048 049 Criteria root = new Criteria(); 050 Criteria effdt = new Criteria(); 051 Criteria timestamp = new Criteria(); 052 ReportQueryByCriteria effdtSubQuery; 053 ReportQueryByCriteria timestampSubQuery; 054 055 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 056 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber"); 057 effdt.addLessOrEqualThan("effectiveDate", asOfDate); 058 059 // EFFECTIVE DATE -- 060 061 // Adding criteria to nest an AND that has multiple ORs to select 062 // the correct ID / date combination. 063 Criteria orWrapperEd = new Criteria(); 064 Criteria nstWaEd = new Criteria(); 065 Criteria nstDptEd = new Criteria(); 066 Criteria nstChrEd = new Criteria(); 067 068 // Inner AND to allow for all null chart/dept/work area 069 Criteria nullAndWrapper = new Criteria(); 070 nullAndWrapper.addIsNull("workArea"); 071 nullAndWrapper.addIsNull("department"); 072 nullAndWrapper.addIsNull("chart"); 073 074 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR 075 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR 076 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR 077 orWrapperEd.addOrCriteria(nstWaEd); 078 orWrapperEd.addOrCriteria(nstDptEd); 079 orWrapperEd.addOrCriteria(nstChrEd); 080 081 // Inner AND to allow for all null chart/dept/work area 082 orWrapperEd.addOrCriteria(nullAndWrapper); 083 084 // Add the inner OR criteria to effective date 085 effdt.addAndCriteria(orWrapperEd); 086 087 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt); 088 effdtSubQuery.setAttributes(new String[]{"max(effectiveDate)"}); 089 090 091 // TIMESTAMP -- 092 093 //Configure the actual "criteria" in the where clause 094 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 095 timestamp.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber"); 096 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate"); 097 098 // Adding criteria to nest an AND that has multiple ORs to select 099 // the correct ID / date combination. 100 orWrapperEd = new Criteria(); 101 nstWaEd = new Criteria(); 102 nstDptEd = new Criteria(); 103 nstChrEd = new Criteria(); 104 105 // Inner AND to allow for all null chart/dept/work area 106 nullAndWrapper = new Criteria(); 107 nullAndWrapper.addIsNull("workArea"); 108 nullAndWrapper.addIsNull("department"); 109 nullAndWrapper.addIsNull("chart"); 110 111 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR 112 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR 113 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR 114 orWrapperEd.addOrCriteria(nstWaEd); 115 orWrapperEd.addOrCriteria(nstDptEd); 116 orWrapperEd.addOrCriteria(nstChrEd); 117 118 // Inner AND to allow for all null chart/dept/work area 119 orWrapperEd.addOrCriteria(nullAndWrapper); 120 121 // Add the inner OR criteria to effective date 122 timestamp.addAndCriteria(orWrapperEd); 123 124 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp); 125 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"}); 126 127 128 // Filter by Max(EffDt) / Max(Timestamp) 129 root.addEqualTo("effectiveDate", effdtSubQuery); 130 root.addEqualTo("timestamp", timestampSubQuery); 131 132 // Optional ROOT criteria added : 133 if (workArea != null) 134 root.addEqualTo("workArea", workArea); 135 if (StringUtils.isNotEmpty(department)) 136 root.addEqualTo("department", department); 137 if (chart != null) 138 root.addEqualTo("chart", chart); 139 if (roleName != null) 140 root.addEqualTo("roleName", roleName); 141 if (positionNumber != null) 142 root.addEqualTo("positionNumber", positionNumber); 143 144 // Filter for ACTIVE = 'Y' 145 Criteria activeFilter = new Criteria(); 146 activeFilter.addEqualTo("active", true); 147 root.addAndCriteria(activeFilter); 148 149 Query query = QueryFactory.newQuery(TkRole.class, root); 150 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 151 152 if (c != null) { 153 roles.addAll(c); 154 } 155 156 return roles; 157 } 158 159 @SuppressWarnings("unchecked") 160 @Override 161 public List<TkRole> findRoles(String principalId, Date asOfDate, String roleName, Long workArea, String department, String chart) { 162 List<TkRole> roles = new ArrayList<TkRole>(); 163 164 Criteria root = new Criteria(); 165 166 if (StringUtils.isNotEmpty(principalId)) { 167 root.addEqualTo("principalId", principalId); 168 } 169 170 if (asOfDate != null) { 171 Criteria effdt = new Criteria(); 172 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 173 effdt.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 174 effdt.addLessOrEqualThan("effectiveDate", asOfDate); 175 if (workArea != null || StringUtils.isNotEmpty(department) || StringUtils.isNotEmpty(chart)) { 176 if (workArea != null) 177 effdt.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); 178 if (department != null) 179 effdt.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); 180 if (chart != null) 181 effdt.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); 182 } 183 184 Criteria timestamp = new Criteria(); 185 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 186 timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 187 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate"); 188 if (workArea != null || StringUtils.isNotEmpty(department) || StringUtils.isNotEmpty(chart)) { 189 if (workArea != null) 190 timestamp.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); 191 if (department != null) 192 timestamp.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); 193 if (chart != null) 194 timestamp.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); 195 } 196 197 ReportQueryByCriteria timestampSubQuery; 198 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp); 199 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"}); 200 201 effdt.addEqualTo("timestamp", timestampSubQuery); 202 203 ReportQueryByCriteria effdtSubQuery; 204 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt); 205 effdtSubQuery.setAttributes(new String[]{"max(effectiveDate)"}); 206 207 root.addEqualTo("effectiveDate", effdtSubQuery); 208 } 209 210 if (StringUtils.isNotEmpty(roleName)) { 211 root.addEqualTo("roleName", roleName); 212 } 213 214 if (workArea != null) { 215 root.addEqualTo("workArea", workArea); 216 } 217 218 if (StringUtils.isNotEmpty(department)) { 219 Criteria departmentCriteria = new Criteria(); 220 departmentCriteria.addEqualTo("department", department); 221 Collection<WorkArea> collectionWorkAreas = TkServiceLocator.getWorkAreaService().getWorkAreas(department, asOfDate); 222 if (CollectionUtils.isNotEmpty(collectionWorkAreas)) { 223 List<Long> longWorkAreas = new ArrayList<Long>(); 224 for(WorkArea cwa : collectionWorkAreas){ 225 longWorkAreas.add(cwa.getWorkArea()); 226 } 227 Criteria workAreaCriteria = new Criteria(); 228 workAreaCriteria.addIn("workArea", longWorkAreas); 229 departmentCriteria.addOrCriteria(workAreaCriteria); 230 } 231 root.addAndCriteria(departmentCriteria); 232 } 233 234 if (StringUtils.isNotEmpty(chart)) { 235 root.addEqualTo("chart", chart); 236 } 237 238 root.addEqualTo("active", true); 239 240 Query query = QueryFactory.newQuery(TkRole.class, root); 241 // limit the number of the resultset 242 // TODO: hard coding the limits? probably not the most user friendly of ways to do this 243 query.setStartAtIndex(0); 244 query.setEndAtIndex(299); 245 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 246 247 if (c != null) { 248 roles.addAll(c); 249 } 250 251 if (StringUtils.isNotBlank(principalId)) { 252 //Fetch all the jobs and grab any position roles for this persons jobs 253 List<Job> lstActiveJobs = TkServiceLocator.getJobService().getJobs(principalId, asOfDate); 254 for (Job job : lstActiveJobs) { 255 if (job.getPositionNumber() != null) { 256 List<TkRole> lstRoles = findPositionRoles(job.getPositionNumber(), 257 asOfDate, roleName, workArea, department, chart); 258 roles.addAll(lstRoles); 259 } 260 } 261 } else if (workArea != null) { 262 List<TkRole> lstPosRoles = getPositionRolesForWorkArea(workArea, asOfDate); 263 for (TkRole tkRole : lstPosRoles) { 264 roles.add(tkRole); 265 } 266 } 267 return roles; 268 } 269 270 @SuppressWarnings("unchecked") 271 @Override 272 public List<TkRole> findInActiveRoles(String principalId, Date asOfDate, String roleName, Long workArea, String department, String chart) { 273 List<TkRole> roles = new ArrayList<TkRole>(); 274 275 Criteria root = new Criteria(); 276 277 if (StringUtils.isNotEmpty(principalId)) { 278 root.addEqualTo("principalId", principalId); 279 } 280 281 if (asOfDate != null) { 282 Criteria effdt = new Criteria(); 283 Criteria timestamp = new Criteria(); 284 ReportQueryByCriteria effdtSubQuery; 285 ReportQueryByCriteria timestampSubQuery; 286 287 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 288 effdt.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 289 effdt.addLessOrEqualThan("effectiveDate", asOfDate); 290 291 // EFFECTIVE DATE -- 292 293 // Adding criteria to nest an AND that has multiple ORs to select 294 // the correct ID / date combination. 295 Criteria orWrapperEd = new Criteria(); 296 Criteria nstWaEd = new Criteria(); 297 Criteria nstDptEd = new Criteria(); 298 Criteria nstChrEd = new Criteria(); 299 300 // Inner AND to allow for all null chart/dept/work area 301 Criteria nullAndWrapper = new Criteria(); 302 nullAndWrapper.addIsNull("workArea"); 303 nullAndWrapper.addIsNull("department"); 304 nullAndWrapper.addIsNull("chart"); 305 306 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR 307 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR 308 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR 309 orWrapperEd.addOrCriteria(nstWaEd); 310 orWrapperEd.addOrCriteria(nstDptEd); 311 orWrapperEd.addOrCriteria(nstChrEd); 312 313 // Inner AND to allow for all null chart/dept/work area 314 orWrapperEd.addOrCriteria(nullAndWrapper); 315 316 // Add the inner OR criteria to effective date 317 effdt.addAndCriteria(orWrapperEd); 318 319 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt); 320 effdtSubQuery.setAttributes(new String[]{"max(effectiveDate)"}); 321 322 323 // TIMESTAMP -- 324 325 //Configure the actual "criteria" in the where clause 326 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 327 timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 328 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate"); 329 330 // Adding criteria to nest an AND that has multiple ORs to select 331 // the correct ID / date combination. 332 orWrapperEd = new Criteria(); 333 nstWaEd = new Criteria(); 334 nstDptEd = new Criteria(); 335 nstChrEd = new Criteria(); 336 337 // Inner AND to allow for all null chart/dept/work area 338 nullAndWrapper = new Criteria(); 339 nullAndWrapper.addIsNull("workArea"); 340 nullAndWrapper.addIsNull("department"); 341 nullAndWrapper.addIsNull("chart"); 342 343 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR 344 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR 345 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR 346 orWrapperEd.addOrCriteria(nstWaEd); 347 orWrapperEd.addOrCriteria(nstDptEd); 348 orWrapperEd.addOrCriteria(nstChrEd); 349 350 // Inner AND to allow for all null chart/dept/work area 351 orWrapperEd.addOrCriteria(nullAndWrapper); 352 353 // Add the inner OR criteria to effective date 354 timestamp.addAndCriteria(orWrapperEd); 355 356 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp); 357 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"}); 358 359 // Filter by Max(EffDt) / Max(Timestamp) 360 //root.addEqualTo("effectiveDate", effdtSubQuery); 361 root.addEqualTo("timestamp", timestampSubQuery); 362 } 363 364 365 if (StringUtils.isNotEmpty(roleName)) { 366 root.addEqualTo("roleName", roleName); 367 } 368 369 if (workArea != null) { 370 root.addEqualTo("workArea", workArea); 371 } 372 373 if (StringUtils.isNotEmpty(department)) { 374 root.addEqualTo("department", department); 375 } 376 377 if (StringUtils.isNotEmpty(chart)) { 378 root.addEqualTo("chart", chart); 379 } 380 381 root.addEqualTo("active", false); 382 383 Query query = QueryFactory.newQuery(TkRole.class, root); 384 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 385 386 if (c != null) { 387 roles.addAll(c); 388 } 389 390 return roles; 391 } 392 393 @Override 394 public void saveOrUpdateRole(TkRole role) { 395 KRADServiceLocator.getBusinessObjectService().save(role); 396 } 397 398 @Override 399 public void saveOrUpdateRoles(List<TkRole> roles) { 400 if (roles != null) { 401 for (TkRole role : roles) { 402 saveOrUpdateRole(role); 403 } 404 } 405 } 406 407 @Override 408 public TkRole getRole(String tkRoleId) { 409 Criteria currentRecordCriteria = new Criteria(); 410 currentRecordCriteria.addEqualTo("hrRolesId", tkRoleId); 411 412 return (TkRole) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(TkRole.class, currentRecordCriteria)); 413 } 414 415 @Override 416 public TkRole getRolesByPosition(String positionNumber) { 417 Criteria currentRecordCriteria = new Criteria(); 418 Criteria effdt = new Criteria(); 419 currentRecordCriteria.addEqualTo("positionNumber", positionNumber); 420 421 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber"); 422 effdt.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate()); 423 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt); 424 effdtSubQuery.setAttributes(new String[]{"max(effectiveDate)"}); 425 currentRecordCriteria.addEqualTo("effectiveDate", effdtSubQuery); 426 427 // Filter for ACTIVE = 'Y' 428 Criteria activeFilter = new Criteria(); 429 activeFilter.addEqualTo("active", true); 430 currentRecordCriteria.addAndCriteria(activeFilter); 431 432 433 TkRole tkRole = (TkRole) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(TkRole.class, currentRecordCriteria)); 434 return tkRole; 435 } 436 437 @Override 438 public TkRole getInactiveRolesByPosition(String positionNumber) { 439 Criteria currentRecordCriteria = new Criteria(); 440 Criteria effdt = new Criteria(); 441 currentRecordCriteria.addEqualTo("positionNumber", positionNumber); 442 443 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber"); 444 effdt.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate()); 445 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt); 446 effdtSubQuery.setAttributes(new String[]{"max(effectiveDate)"}); 447 currentRecordCriteria.addEqualTo("effectiveDate", effdtSubQuery); 448 449 // Filter for ACTIVE = 'N' 450 Criteria activeFilter = new Criteria(); 451 activeFilter.addEqualTo("active", false); 452 currentRecordCriteria.addAndCriteria(activeFilter); 453 454 455 TkRole tkRole = (TkRole) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(TkRole.class, currentRecordCriteria)); 456 return tkRole; 457 } 458 459 460 @Override 461 public List<TkRole> getPositionRolesForWorkArea(Long workArea, Date asOfDate) { 462 List<TkRole> roles = new ArrayList<TkRole>(); 463 464 Criteria root = new Criteria(); 465 Criteria effdt = new Criteria(); 466 Criteria timestamp = new Criteria(); 467 ReportQueryByCriteria effdtSubQuery; 468 ReportQueryByCriteria timestampSubQuery; 469 470 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 471 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber"); 472 effdt.addLessOrEqualThan("effectiveDate", asOfDate); 473 474 // EFFECTIVE DATE -- 475 476 // Adding criteria to nest an AND that has multiple ORs to select 477 // the correct ID / date combination. 478 Criteria orWrapperEd = new Criteria(); 479 Criteria nstWaEd = new Criteria(); 480 Criteria nstDptEd = new Criteria(); 481 Criteria nstChrEd = new Criteria(); 482 483 // Inner AND to allow for all null chart/dept/work area 484 Criteria nullAndWrapper = new Criteria(); 485 nullAndWrapper.addIsNull("department"); 486 nullAndWrapper.addIsNull("chart"); 487 488 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR 489 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR 490 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR 491 orWrapperEd.addOrCriteria(nstWaEd); 492 orWrapperEd.addOrCriteria(nstDptEd); 493 orWrapperEd.addOrCriteria(nstChrEd); 494 495 // Inner AND to allow for all null chart/dept/work area 496 orWrapperEd.addOrCriteria(nullAndWrapper); 497 498 // Add the inner OR criteria to effective date 499 effdt.addAndCriteria(orWrapperEd); 500 501 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt); 502 effdtSubQuery.setAttributes(new String[]{"max(effectiveDate)"}); 503 504 505 // TIMESTAMP -- 506 507 //Configure the actual "criteria" in the where clause 508 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName"); 509 //timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 510 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate"); 511 512 // Adding criteria to nest an AND that has multiple ORs to select 513 // the correct ID / date combination. 514 orWrapperEd = new Criteria(); 515 nstWaEd = new Criteria(); 516 nstDptEd = new Criteria(); 517 nstChrEd = new Criteria(); 518 519 // Inner AND to allow for all null chart/dept/work area 520 nullAndWrapper = new Criteria(); 521 nullAndWrapper.addIsNull("department"); 522 nullAndWrapper.addIsNull("chart"); 523 524 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR 525 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR 526 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR 527 orWrapperEd.addOrCriteria(nstWaEd); 528 orWrapperEd.addOrCriteria(nstDptEd); 529 orWrapperEd.addOrCriteria(nstChrEd); 530 531 // Inner AND to allow for all null chart/dept/work area 532 orWrapperEd.addOrCriteria(nullAndWrapper); 533 534 // Add the inner OR criteria to effective date 535 timestamp.addAndCriteria(orWrapperEd); 536 537 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp); 538 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"}); 539 540 541 // Filter by Max(EffDt) / Max(Timestamp) 542 root.addEqualTo("effectiveDate", effdtSubQuery); 543 root.addEqualTo("timestamp", timestampSubQuery); 544 545 // Optional ROOT criteria added : 546 if (workArea != null) 547 root.addEqualTo("workArea", workArea); 548 root.addEqualTo("roleName", TkConstants.ROLE_TK_APPROVER); 549 550 // Filter for ACTIVE = 'Y' 551 Criteria activeFilter = new Criteria(); 552 activeFilter.addEqualTo("active", true); 553 root.addAndCriteria(activeFilter); 554 555 Query query = QueryFactory.newQuery(TkRole.class, root); 556 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 557 558 if (c != null) { 559 roles.addAll(c); 560 } 561 562 return roles; 563 } 564 }