Coverage Report - org.kuali.rice.krms.framework.engine.CollectionOperator
 
Classes in this File Line Coverage Branch Coverage Complexity
CollectionOperator
100%
8/8
N/A
1.3
CollectionOperator$1
100%
3/3
75%
3/4
1.3
CollectionOperator$2
100%
3/3
83%
5/6
1.3
CollectionOperator$3
100%
3/3
83%
5/6
1.3
 
 1  
 package org.kuali.rice.krms.framework.engine;
 2  
 
 3  
 /**
 4  
  * <p>Enumeration for simple collection operators used by {@link CollectionOfComparablesTermBasedProposition}.  The
 5  
  * operators encapsulate logic for how to collate results and when to short circuit as a collection is being
 6  
  * processed.  Correct usage is best summarized by this code block:</p>
 7  
  * <pre>
 8  
  * for (Comparable<T> item : comparableItems) {
 9  
  *     collatedResult = collectionOper.reduce(compare(item, compareValue), collatedResult);
 10  
  *     if (collectionOper.shortCircuit(collatedResult)) break;
 11  
  * }
 12  
  * </pre>
 13  
  * 
 14  
  * @author Kuali Rice Team (rice.collab@kuali.org)
 15  
  *
 16  
  */
 17  4
 public enum CollectionOperator {
 18  
 
 19  1
         ONE_OR_MORE(false) {
 20  
                 @Override
 21  
                 public boolean reduce(boolean elementResult, boolean collatedResult) {
 22  9
                         return elementResult || collatedResult;
 23  
                 }
 24  
                 
 25  
                 @Override
 26  
                 public boolean shortCircuit(boolean collatedResult) {
 27  9
                         return collatedResult;
 28  
                 }
 29  
         },
 30  
         
 31  1
         ALL(true) {
 32  
                 @Override
 33  
                 public boolean reduce(boolean elementResult, boolean collatedResult) {
 34  8
                         return elementResult && collatedResult;
 35  
                 }
 36  
 
 37  
                 @Override
 38  
                 public boolean shortCircuit(boolean collatedResult) {
 39  8
                         return !collatedResult;
 40  
                 }
 41  
         },
 42  
         
 43  1
         NONE(true) {
 44  
                 @Override
 45  
                 public boolean reduce(boolean elementResult, boolean collatedResult) {
 46  7
                         return !elementResult && collatedResult;
 47  
                 }
 48  
 
 49  
                 @Override
 50  
                 public boolean shortCircuit(boolean collatedResult) {
 51  7
                         return !collatedResult;
 52  
                 }
 53  
         };
 54  
         
 55  
         private final boolean initialCollationResult;
 56  
         
 57  3
         private CollectionOperator(boolean initialCollationResult) {
 58  3
                 this.initialCollationResult = initialCollationResult;
 59  3
         }
 60  
         
 61  
         /**
 62  
          * This method takes the collated result thus far and the result for the next element,
 63  
          * and produces the next collated result.
 64  
          * 
 65  
          * @return the new collated result
 66  
          */
 67  
         public abstract boolean reduce(boolean elementResult, boolean collatedResult);
 68  
         
 69  
         /**
 70  
          * This method lets the engine know if it can short circuit its iteration through the list based on the 
 71  
          * collated result.  The condition when short circuiting can be done varies with the operator.
 72  
          * 
 73  
          * @param collatedResult
 74  
          * @return true if short circuiting can be done to optimize processing
 75  
          */
 76  
         public abstract boolean shortCircuit(boolean collatedResult);
 77  
         
 78  
         /**
 79  
          * when the result for the first item in the collection is calculated, there isn't yet a collated result 
 80  
          * to use in the {@link #reduce(boolean, boolean)} method.  Different operators require different
 81  
          * initial values to function correctly, so this property holds the correct initial collated value for the 
 82  
          * given operator instance.
 83  
          */
 84  
         public boolean getInitialCollatedResult() {
 85  20
                 return initialCollationResult;
 86  
         }
 87  
         
 88  
 }