/**
*
*/
package com.browseengine.bobo.search.section;
import java.io.IOException;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.util.PriorityQueue;
/**
* This class represents a section search query plan
*
*/
public abstract class SectionSearchQueryPlan {
public static final int NO_MORE_POSITIONS = Integer.MAX_VALUE;
public static final int NO_MORE_SECTIONS = Integer.MAX_VALUE;
protected int _curDoc;
protected int _curSec;
/*
* Priority queue of Nodes.
*/
static public class NodeQueue extends PriorityQueue<Object> {
public NodeQueue(int size) {
super(size);
}
@Override
protected boolean lessThan(Object objA, Object objB) {
SectionSearchQueryPlan nodeA = (SectionSearchQueryPlan) objA;
SectionSearchQueryPlan nodeB = (SectionSearchQueryPlan) objB;
if (nodeA._curDoc == nodeB._curDoc) {
return (nodeA._curSec < nodeB._curSec);
}
return (nodeA._curDoc < nodeB._curDoc);
}
}
public SectionSearchQueryPlan() {
_curDoc = -1;
_curSec = -1;
}
public int getDocId() {
return _curDoc;
}
public int getSecId() {
return _curSec;
}
public int fetch(int targetDoc) throws IOException {
while (fetchDoc(targetDoc) < DocIdSetIterator.NO_MORE_DOCS) {
if (fetchSec(0) < SectionSearchQueryPlan.NO_MORE_SECTIONS) return _curDoc;
}
return _curDoc;
}
abstract public int fetchDoc(int targetDoc) throws IOException;
abstract public int fetchSec(int targetSec) throws IOException;
protected int fetchPos() throws IOException {
return NO_MORE_POSITIONS;
}
}