Coverage Report - org.galagosearch.tupleflow.Select
 
Classes in this File Line Coverage Branch Coverage Complexity
Select
0%
0/40
0%
0/20
0
 
 1  
 // BSD License (http://www.galagosearch.org/license)
 2  
 package org.galagosearch.tupleflow;
 3  
 
 4  
 import java.io.IOException;
 5  
 import java.lang.reflect.InvocationTargetException;
 6  
 import java.util.Comparator;
 7  
 import org.galagosearch.tupleflow.execution.ErrorHandler;
 8  
 import org.galagosearch.tupleflow.execution.Verification;
 9  
 
 10  
 /**
 11  
  * Takes two inputs, keys and values.  Each item in the values list that matches
 12  
  * a key is sent to the next stage.  Items are assumed to be sorted in order 
 13  
  * by "order".  That order also determines equality.
 14  
  * 
 15  
  * @author trevor
 16  
  */
 17  
 public class Select<T> implements ExNihiloSource<T> {
 18  
     TypeReader<T> keys;
 19  
     TypeReader<T> values;
 20  
     public Processor<T> processor;
 21  
     Class<T> klass;
 22  
     Order<T> order;
 23  
 
 24  
     public Select(TupleFlowParameters parameters) throws IOException, ClassNotFoundException,
 25  
             NoSuchMethodException, IllegalArgumentException, InvocationTargetException,
 26  0
             InstantiationException, IllegalAccessException {
 27  0
         keys = parameters.getTypeReader("keys");
 28  0
         values = parameters.getTypeReader("values");
 29  0
         klass = (Class<T>) Class.forName(parameters.getXML().get("class"));
 30  0
         String orderSpec = parameters.getXML().get("order");
 31  
 
 32  0
         org.galagosearch.tupleflow.Type<T> type = (org.galagosearch.tupleflow.Type<T>) klass.
 33  
                 getConstructor().newInstance();
 34  0
         order = type.getOrder(orderSpec);
 35  0
     }
 36  
 
 37  
     public void run() throws IOException {
 38  0
         T key = keys.read();
 39  0
         T value = values.read();
 40  0
         Comparator<T> lessThan = order.lessThan();
 41  
 
 42  0
         while (key != null && value != null) {
 43  0
             int compare = lessThan.compare(key, value);
 44  
 
 45  0
             if (compare < 0) {
 46  0
                 key = keys.read();
 47  0
             } else if (compare > 0) {
 48  0
                 value = values.read();
 49  
             } else {
 50  0
                 processor.process(value);
 51  0
                 value = values.read();
 52  
             }
 53  0
         }
 54  
 
 55  0
         while (key != null) {
 56  0
             key = keys.read();
 57  
         }
 58  0
         while (value != null) {
 59  0
             value = values.read();
 60  
         }
 61  0
     }
 62  
 
 63  
     public Class<T> getOutputClass(TupleFlowParameters parameters) throws ClassNotFoundException {
 64  0
         return (Class<T>) Class.forName(parameters.getXML().get("class"));
 65  
     }
 66  
 
 67  
     public void setProcessor(Step next) throws IncompatibleProcessorException {
 68  0
         Linkage.link(this, next);
 69  0
     }
 70  
 
 71  
     public static void verify(TupleFlowParameters parameters, ErrorHandler handler) throws ClassNotFoundException {
 72  0
         if (!Verification.requireParameters(new String[]{"class", "order"}, parameters.getXML(),
 73  
                                             handler)) {
 74  0
             return;
 75  
         }
 76  0
         String className = parameters.getXML().get("class");
 77  0
         String[] order = parameters.getXML().get("order").split(" ");
 78  
         boolean result;
 79  
 
 80  0
         result = Verification.requireClass(className, handler);
 81  0
         result = result && Verification.requireOrder(className, order, handler);
 82  
 
 83  0
         if (!result) {
 84  0
             return;
 85  
         }
 86  0
         Class klass = Class.forName(className);
 87  0
         Verification.verifyTypeReader("keys", klass, order, parameters, handler);
 88  0
         Verification.verifyTypeReader("values", klass, order, parameters, handler);
 89  0
     }
 90  
 }