1
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
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
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
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 }