Coverage Report - org.galagosearch.core.retrieval.traversal.WeightConversionTraversal
 
Classes in this File Line Coverage Branch Coverage Complexity
WeightConversionTraversal
91%
21/23
80%
8/10
0
 
 1  
 // BSD License (http://www.galagosearch.org/license)
 2  
 
 3  
 package org.galagosearch.core.retrieval.traversal;
 4  
 
 5  
 import java.io.IOException;
 6  
 import java.util.ArrayList;
 7  
 import org.galagosearch.core.retrieval.query.Node;
 8  
 import org.galagosearch.core.retrieval.query.Traversal;
 9  
 
 10  
 /**
 11  
  *
 12  
  * @author trevor
 13  
  */
 14  16
 public class WeightConversionTraversal implements Traversal {
 15  
     public void beforeNode(Node object) throws Exception {
 16  
         // do nothing
 17  56
     }
 18  
 
 19  
     public String getWeight(Node weightNode) {
 20  20
         if (weightNode.getOperator().equals("inside")) {
 21  8
             if (weightNode.getInternalNodes().size() != 2) {
 22  0
                 return "1";
 23  
             } else {
 24  8
                 Node inner = weightNode.getInternalNodes().get(0);
 25  8
                 Node outer = weightNode.getInternalNodes().get(1);
 26  8
                 return inner.getDefaultParameter() + "." + outer.getDefaultParameter();
 27  
             }
 28  
         } else {
 29  12
             return weightNode.getDefaultParameter();
 30  
         }
 31  
     }
 32  
 
 33  
     public Node afterNode(Node node) throws Exception {
 34  64
         ArrayList<Node> children = node.getInternalNodes();
 35  64
         if (node.getOperator().equals("weight")) {
 36  
             // first, verify that the appropriate children are weights
 37  12
             if (children.size() % 2 == 1) {
 38  0
                 throw new IOException("A weighted node cannot have an odd number of internal nodes: " +
 39  
                         node.getInternalNodes().size());
 40  
             }
 41  
                         
 42  
             // now, reassemble everything:
 43  12
             ArrayList<Node> newChildren = new ArrayList<Node>();
 44  32
             for (int i = 0; i < children.size(); i += 2) {
 45  20
                 Node weightNode = children.get(i);
 46  20
                 Node childNode = children.get(i+1);
 47  
                 
 48  20
                 ArrayList<Node> newChild = new ArrayList<Node>();
 49  20
                 newChild.add(childNode);
 50  20
                 Node scaledNode = new Node("scale", getWeight(weightNode), newChild);
 51  20
                 newChildren.add(scaledNode);
 52  
             }
 53  
 
 54  12
             return new Node("combine", newChildren);
 55  
         } else {
 56  52
             return node;
 57  
         }
 58  
     }
 59  
 }