View Javadoc

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  public class WeightConversionTraversal implements Traversal {
15      public void beforeNode(Node object) throws Exception {
16          // do nothing
17      }
18  
19      public String getWeight(Node weightNode) {
20          if (weightNode.getOperator().equals("inside")) {
21              if (weightNode.getInternalNodes().size() != 2) {
22                  return "1";
23              } else {
24                  Node inner = weightNode.getInternalNodes().get(0);
25                  Node outer = weightNode.getInternalNodes().get(1);
26                  return inner.getDefaultParameter() + "." + outer.getDefaultParameter();
27              }
28          } else {
29              return weightNode.getDefaultParameter();
30          }
31      }
32  
33      public Node afterNode(Node node) throws Exception {
34          ArrayList<Node> children = node.getInternalNodes();
35          if (node.getOperator().equals("weight")) {
36              // first, verify that the appropriate children are weights
37              if (children.size() % 2 == 1) {
38                  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              ArrayList<Node> newChildren = new ArrayList<Node>();
44              for (int i = 0; i < children.size(); i += 2) {
45                  Node weightNode = children.get(i);
46                  Node childNode = children.get(i+1);
47                  
48                  ArrayList<Node> newChild = new ArrayList<Node>();
49                  newChild.add(childNode);
50                  Node scaledNode = new Node("scale", getWeight(weightNode), newChild);
51                  newChildren.add(scaledNode);
52              }
53  
54              return new Node("combine", newChildren);
55          } else {
56              return node;
57          }
58      }
59  }