package org.fastcatsearch.ir.search;
import org.fastcatsearch.ir.search.posting.NodeReader;
public class TermDocTreeReader {
private NodeReader root;
public void addNode(NodeReader node) {
if (root == null) {
root = node;
} else {
root = new BigramTreeNode(root, node);
}
}
public int next(TermDocCollector termDocCollector) {
if(root == null){
return -1;
}
int docNo = root.next();
if (docNo != -1) {
root.fill(termDocCollector);
return docNo;
}
return -1;
}
class BigramTreeNode extends NodeReader {
private NodeReader node1;
private NodeReader node2;
private int docNo1;
private int docNo2;
private TermDocCollector tempTermDocCollector;
public BigramTreeNode(NodeReader node1, NodeReader node2) {
this.node1 = node1;
this.node2 = node2;
tempTermDocCollector = new TermDocCollector(2);
docNo1 = node1.next();
docNo2 = node2.next();
logger.debug("BigramTreeNode doc >> {} : {}", docNo1, docNo2);
}
@Override
public int next() {
tempTermDocCollector.clear();
if (docNo1 == -1 && docNo2 == -1) {
return -1;
} else if (docNo1 == docNo2) {
node1.fill(tempTermDocCollector);
node2.fill(tempTermDocCollector);
int docNo = docNo1;
docNo1 = node1.next();
docNo2 = node2.next();
return docNo;
} else if ((docNo1 >= 0 && docNo1 < docNo2) || docNo2 == -1) {
node1.fill(tempTermDocCollector);
int docNo = docNo1;
docNo1 = node1.next();
return docNo;
} else if ((docNo2 >= 0 && docNo1 > docNo2) || docNo1 == -1) {
node2.fill(tempTermDocCollector);
int docNo = docNo2;
docNo2 = node2.next();
return docNo;
}
return -1;
}
@Override
public void fill(TermDocCollector termDocCollector) {
termDocCollector.addAll(tempTermDocCollector);
}
@Override
public void close() {
node1.close();
node2.close();
}
}
public void close() {
root.close();
}
}