1 /**
2 * Copyright 2005-2015 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.krms.framework.engine;
17
18 /**
19 * <p>Enumeration for simple collection operators used by {@link CollectionOfComparablesTermBasedProposition}. The
20 * operators encapsulate logic for how to collate results and when to short circuit as a collection is being
21 * processed. Correct usage is best summarized by this code block:</p>
22 * <pre>
23 * for (Comparable<T> item : comparableItems) {
24 * collatedResult = collectionOper.reduce(compare(item, compareValue), collatedResult);
25 * if (collectionOper.shortCircuit(collatedResult)) break;
26 * }
27 * </pre>
28 *
29 * @author Kuali Rice Team (rice.collab@kuali.org)
30 *
31 */
32 public enum CollectionOperator {
33
34 ONE_OR_MORE(false) {
35 @Override
36 public boolean reduce(boolean elementResult, boolean collatedResult) {
37 return elementResult || collatedResult;
38 }
39
40 @Override
41 public boolean shortCircuit(boolean collatedResult) {
42 return collatedResult;
43 }
44 },
45
46 ALL(true) {
47 @Override
48 public boolean reduce(boolean elementResult, boolean collatedResult) {
49 return elementResult && collatedResult;
50 }
51
52 @Override
53 public boolean shortCircuit(boolean collatedResult) {
54 return !collatedResult;
55 }
56 },
57
58 NONE(true) {
59 @Override
60 public boolean reduce(boolean elementResult, boolean collatedResult) {
61 return !elementResult && collatedResult;
62 }
63
64 @Override
65 public boolean shortCircuit(boolean collatedResult) {
66 return !collatedResult;
67 }
68 };
69
70 private final boolean initialCollationResult;
71
72 private CollectionOperator(boolean initialCollationResult) {
73 this.initialCollationResult = initialCollationResult;
74 }
75
76 /**
77 * This method takes the collated result thus far and the result for the next element,
78 * and produces the next collated result.
79 *
80 * @return the new collated result
81 */
82 public abstract boolean reduce(boolean elementResult, boolean collatedResult);
83
84 /**
85 * This method lets the engine know if it can short circuit its iteration through the list based on the
86 * collated result. The condition when short circuiting can be done varies with the operator.
87 *
88 * @param collatedResult
89 * @return true if short circuiting can be done to optimize processing
90 */
91 public abstract boolean shortCircuit(boolean collatedResult);
92
93 /**
94 * when the result for the first item in the collection is calculated, there isn't yet a collated result
95 * to use in the {@link #reduce(boolean, boolean)} method. Different operators require different
96 * initial values to function correctly, so this property holds the correct initial collated value for the
97 * given operator instance.
98 */
99 public boolean getInitialCollatedResult() {
100 return initialCollationResult;
101 }
102
103 }