diff --git a/src/java/org/apache/lucene/search/DateFilter.java b/src/java/org/apache/lucene/search/DateFilter.java
index 1e40fb9ea96..a8cc8e9b1ce 100644
--- a/src/java/org/apache/lucene/search/DateFilter.java
+++ b/src/java/org/apache/lucene/search/DateFilter.java
@@ -71,116 +71,116 @@ import org.apache.lucene.index.IndexReader;
* {@link DateField}.
*/
public class DateFilter extends Filter {
- String field;
+ String field;
- String start = DateField.MIN_DATE_STRING();
- String end = DateField.MAX_DATE_STRING();
+ String start = DateField.MIN_DATE_STRING();
+ String end = DateField.MAX_DATE_STRING();
- private DateFilter(String f) {
- field = f;
+ private DateFilter(String f) {
+ field = f;
+ }
+
+ /**
+ * Constructs a filter for field f
matching dates
+ * between from
and to
inclusively.
+ */
+ public DateFilter(String f, Date from, Date to) {
+ field = f;
+ start = DateField.dateToString(from);
+ end = DateField.dateToString(to);
+ }
+
+ /**
+ * Constructs a filter for field f
matching times
+ * between from
and to
inclusively.
+ */
+ public DateFilter(String f, long from, long to) {
+ field = f;
+ start = DateField.timeToString(from);
+ end = DateField.timeToString(to);
+ }
+
+ /**
+ * Constructs a filter for field f
matching
+ * dates on or before before date
.
+ */
+ public static DateFilter Before(String field, Date date) {
+ DateFilter result = new DateFilter(field);
+ result.end = DateField.dateToString(date);
+ return result;
+ }
+
+ /**
+ * Constructs a filter for field f
matching times
+ * on or before time
.
+ */
+ public static DateFilter Before(String field, long time) {
+ DateFilter result = new DateFilter(field);
+ result.end = DateField.timeToString(time);
+ return result;
+ }
+
+ /**
+ * Constructs a filter for field f
matching
+ * dates on or after date
.
+ */
+ public static DateFilter After(String field, Date date) {
+ DateFilter result = new DateFilter(field);
+ result.start = DateField.dateToString(date);
+ return result;
+ }
+
+ /**
+ * Constructs a filter for field f
matching
+ * times on or after time
.
+ */
+ public static DateFilter After(String field, long time) {
+ DateFilter result = new DateFilter(field);
+ result.start = DateField.timeToString(time);
+ return result;
+ }
+
+ /**
+ * Returns a BitSet with true for documents which should be
+ * permitted in search results, and false for those that should
+ * not.
+ */
+ public BitSet bits(IndexReader reader) throws IOException {
+ BitSet bits = new BitSet(reader.maxDoc());
+ TermEnum enumerator = reader.terms(new Term(field, start));
+ TermDocs termDocs = reader.termDocs();
+ if (enumerator.term() == null) {
+ return bits;
}
- /**
- * Constructs a filter for field f
matching dates
- * between from
and to
inclusively.
- */
- public DateFilter(String f, Date from, Date to) {
- field = f;
- start = DateField.dateToString(from);
- end = DateField.dateToString(to);
- }
-
- /**
- * Constructs a filter for field f
matching times
- * between from
and to
inclusively.
- */
- public DateFilter(String f, long from, long to) {
- field = f;
- start = DateField.timeToString(from);
- end = DateField.timeToString(to);
- }
-
- /**
- * Constructs a filter for field f
matching
- * dates on or before before date
.
- */
- public static DateFilter Before(String field, Date date) {
- DateFilter result = new DateFilter(field);
- result.end = DateField.dateToString(date);
- return result;
- }
-
- /**
- * Constructs a filter for field f
matching times
- * on or before time
.
- */
- public static DateFilter Before(String field, long time) {
- DateFilter result = new DateFilter(field);
- result.end = DateField.timeToString(time);
- return result;
- }
-
- /**
- * Constructs a filter for field f
matching
- * dates on or after date
.
- */
- public static DateFilter After(String field, Date date) {
- DateFilter result = new DateFilter(field);
- result.start = DateField.dateToString(date);
- return result;
- }
-
- /**
- * Constructs a filter for field f
matching
- * times on or after time
.
- */
- public static DateFilter After(String field, long time) {
- DateFilter result = new DateFilter(field);
- result.start = DateField.timeToString(time);
- return result;
- }
-
- /**
- * Returns a BitSet with true for documents which should be
- * permitted in search results, and false for those that should
- * not.
- */
- public BitSet bits(IndexReader reader) throws IOException {
- BitSet bits = new BitSet(reader.maxDoc());
- TermEnum enumerator = reader.terms(new Term(field, start));
- TermDocs termDocs = reader.termDocs();
- if (enumerator.term() == null) {
- return bits;
- }
-
+ try {
+ Term stop = new Term(field, end);
+ while (enumerator.term().compareTo(stop) <= 0) {
+ termDocs.seek(enumerator.term());
try {
- Term stop = new Term(field, end);
- while (enumerator.term().compareTo(stop) <= 0) {
- termDocs.seek(enumerator.term());
- try {
- while (termDocs.next()) {
- bits.set(termDocs.doc());
- }
- } finally {
- termDocs.close();
- }
- if (!enumerator.next()) {
- break;
- }
- }
+ while (termDocs.next()) {
+ bits.set(termDocs.doc());
+ }
} finally {
- enumerator.close();
+ termDocs.close();
}
- return bits;
+ if (!enumerator.next()) {
+ break;
+ }
+ }
+ } finally {
+ enumerator.close();
}
+ return bits;
+ }
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(field);
- buffer.append(":");
- buffer.append(DateField.stringToDate(start).toString());
- buffer.append("-");
- buffer.append(DateField.stringToDate(end).toString());
- return buffer.toString();
- }
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(field);
+ buffer.append(":");
+ buffer.append(DateField.stringToDate(start).toString());
+ buffer.append("-");
+ buffer.append(DateField.stringToDate(end).toString());
+ return buffer.toString();
+ }
}
diff --git a/src/java/org/apache/lucene/search/Hits.java b/src/java/org/apache/lucene/search/Hits.java
index 05227723924..5c24b7a2e42 100644
--- a/src/java/org/apache/lucene/search/Hits.java
+++ b/src/java/org/apache/lucene/search/Hits.java
@@ -61,144 +61,146 @@ import org.apache.lucene.document.Document;
/** A ranked list of documents, used to hold search results. */
public final class Hits {
- private Query query;
- private Searcher searcher;
- private Filter filter = null;
+ private Query query;
+ private Searcher searcher;
+ private Filter filter = null;
- private int length; // the total number of hits
- private Vector hitDocs = new Vector(); // cache of hits retrieved
+ private int length; // the total number of hits
+ private Vector hitDocs = new Vector(); // cache of hits retrieved
- private HitDoc first; // head of LRU cache
- private HitDoc last; // tail of LRU cache
- private int numDocs = 0; // number cached
- private int maxDocs = 200; // max to cache
+ private HitDoc first; // head of LRU cache
+ private HitDoc last; // tail of LRU cache
+ private int numDocs = 0; // number cached
+ private int maxDocs = 200; // max to cache
- Hits(Searcher s, Query q, Filter f) throws IOException {
- query = q;
- searcher = s;
- filter = f;
- getMoreDocs(50); // retrieve 100 initially
+ Hits(Searcher s, Query q, Filter f) throws IOException {
+ query = q;
+ searcher = s;
+ filter = f;
+ getMoreDocs(50); // retrieve 100 initially
+ }
+
+ /**
+ * Tries to add new documents to hitDocs.
+ * Ensures that the hit numbered min
has been retrieved.
+ */
+ private final void getMoreDocs(int min) throws IOException {
+ if (hitDocs.size() > min) {
+ min = hitDocs.size();
}
- // Tries to add new documents to hitDocs.
- // Ensures that the hit numbered min
has been retrieved.
- private final void getMoreDocs(int min) throws IOException {
- if (hitDocs.size() > min) {
- min = hitDocs.size();
- }
+ int n = min * 2; // double # retrieved
+ TopDocs topDocs = searcher.search(query, filter, n);
+ length = topDocs.totalHits;
+ ScoreDoc[] scoreDocs = topDocs.scoreDocs;
- int n = min * 2; // double # retrieved
- TopDocs topDocs = searcher.search(query, filter, n);
- length = topDocs.totalHits;
- ScoreDoc[] scoreDocs = topDocs.scoreDocs;
-
- float scoreNorm = 1.0f;
- if (length > 0 && scoreDocs[0].score > 1.0f) {
- scoreNorm = 1.0f / scoreDocs[0].score;
- }
-
- int end = scoreDocs.length < length ? scoreDocs.length : length;
- for (int i = hitDocs.size(); i < end; i++) {
- hitDocs.addElement(new HitDoc(scoreDocs[i].score * scoreNorm,
- scoreDocs[i].doc));
- }
+ float scoreNorm = 1.0f;
+ if (length > 0 && scoreDocs[0].score > 1.0f) {
+ scoreNorm = 1.0f / scoreDocs[0].score;
}
- /** Returns the total number of hits available in this set. */
- public final int length() {
- return length;
+ int end = scoreDocs.length < length ? scoreDocs.length : length;
+ for (int i = hitDocs.size(); i < end; i++) {
+ hitDocs.addElement(new HitDoc(scoreDocs[i].score * scoreNorm,
+ scoreDocs[i].doc));
+ }
+ }
+
+ /** Returns the total number of hits available in this set. */
+ public final int length() {
+ return length;
+ }
+
+ /** Returns the nth document in this set.
+
Documents are cached, so that repeated requests for the same element may + return the same Document object. */ + public final Document doc(int n) throws IOException { + HitDoc hitDoc = hitDoc(n); + + // Update LRU cache of documents + remove(hitDoc); // remove from list, if there + addToFront(hitDoc); // add to front of list + if (numDocs > maxDocs) { // if cache is full + HitDoc oldLast = last; + remove(last); // flush last + oldLast.doc = null; // let doc get gc'd } - /** Returns the nth document in this set. -
Documents are cached, so that repeated requests for the same element may
- return the same Document object. */
- public final Document doc(int n) throws IOException {
- HitDoc hitDoc = hitDoc(n);
-
- // Update LRU cache of documents
- remove(hitDoc); // remove from list, if there
- addToFront(hitDoc); // add to front of list
- if (numDocs > maxDocs) { // if cache is full
- HitDoc oldLast = last;
- remove(last); // flush last
- oldLast.doc = null; // let doc get gc'd
- }
-
- if (hitDoc.doc == null) {
- hitDoc.doc = searcher.doc(hitDoc.id); // cache miss: read document
- }
-
- return hitDoc.doc;
+ if (hitDoc.doc == null) {
+ hitDoc.doc = searcher.doc(hitDoc.id); // cache miss: read document
}
- /** Returns the score for the nth document in this set. */
- public final float score(int n) throws IOException {
- return hitDoc(n).score;
+ return hitDoc.doc;
+ }
+
+ /** Returns the score for the nth document in this set. */
+ public final float score(int n) throws IOException {
+ return hitDoc(n).score;
+ }
+
+ /** Returns the id for the nth document in this set. */
+ public final int id(int n) throws IOException {
+ return hitDoc(n).id;
+ }
+
+
+ private final HitDoc hitDoc(int n) throws IOException {
+ if (n >= length) {
+ throw new IndexOutOfBoundsException("Not a valid hit number: " + n);
}
- /** Returns the id for the nth document in this set. */
- public final int id(int n) throws IOException {
- return hitDoc(n).id;
+ if (n >= hitDocs.size()) {
+ getMoreDocs(n);
}
+ return (HitDoc) hitDocs.elementAt(n);
+ }
- private final HitDoc hitDoc(int n) throws IOException {
- if (n >= length) {
- throw new IndexOutOfBoundsException("Not a valid hit number: " + n);
- }
-
- if (n >= hitDocs.size()) {
- getMoreDocs(n);
- }
-
- return (HitDoc) hitDocs.elementAt(n);
+ private final void addToFront(HitDoc hitDoc) { // insert at front of cache
+ if (first == null) {
+ last = hitDoc;
+ } else {
+ first.prev = hitDoc;
}
- private final void addToFront(HitDoc hitDoc) { // insert at front of cache
- if (first == null) {
- last = hitDoc;
- } else {
- first.prev = hitDoc;
- }
+ hitDoc.next = first;
+ first = hitDoc;
+ hitDoc.prev = null;
- hitDoc.next = first;
- first = hitDoc;
- hitDoc.prev = null;
+ numDocs++;
+ }
- numDocs++;
+ private final void remove(HitDoc hitDoc) { // remove from cache
+ if (hitDoc.doc == null) { // it's not in the list
+ return; // abort
}
- private final void remove(HitDoc hitDoc) { // remove from cache
- if (hitDoc.doc == null) { // it's not in the list
- return; // abort
- }
-
- if (hitDoc.next == null) {
- last = hitDoc.prev;
- } else {
- hitDoc.next.prev = hitDoc.prev;
- }
-
- if (hitDoc.prev == null) {
- first = hitDoc.next;
- } else {
- hitDoc.prev.next = hitDoc.next;
- }
-
- numDocs--;
+ if (hitDoc.next == null) {
+ last = hitDoc.prev;
+ } else {
+ hitDoc.next.prev = hitDoc.prev;
}
+
+ if (hitDoc.prev == null) {
+ first = hitDoc.next;
+ } else {
+ hitDoc.prev.next = hitDoc.next;
+ }
+
+ numDocs--;
+ }
}
final class HitDoc {
- float score;
- int id;
- Document doc = null;
+ float score;
+ int id;
+ Document doc = null;
- HitDoc next; // in doubly-linked cache
- HitDoc prev; // in doubly-linked cache
+ HitDoc next; // in doubly-linked cache
+ HitDoc prev; // in doubly-linked cache
- HitDoc(float s, int i) {
- score = s;
- id = i;
- }
+ HitDoc(float s, int i) {
+ score = s;
+ id = i;
+ }
}
diff --git a/src/java/org/apache/lucene/search/QueryFilter.java b/src/java/org/apache/lucene/search/QueryFilter.java
index f87b1158470..dc3b466c6c0 100644
--- a/src/java/org/apache/lucene/search/QueryFilter.java
+++ b/src/java/org/apache/lucene/search/QueryFilter.java
@@ -70,37 +70,38 @@ import org.apache.lucene.index.IndexReader;
* once per day.
*/
public class QueryFilter extends Filter {
- private Query query;
- private transient WeakHashMap cache = new WeakHashMap();
+ private Query query;
+ private transient WeakHashMap cache = new WeakHashMap();
- /** Constructs a filter which only matches documents matching
- * query
.
- */
- public QueryFilter(Query query) {
- this.query = query;
+ /** Constructs a filter which only matches documents matching
+ * query
.
+ */
+ public QueryFilter(Query query) {
+ this.query = query;
+ }
+
+ public BitSet bits(IndexReader reader) throws IOException {
+
+ synchronized (cache) { // check cache
+ BitSet cached = (BitSet) cache.get(reader);
+ if (cached != null) {
+ return cached;
+ }
}
- public BitSet bits(IndexReader reader) throws IOException {
+ final BitSet bits = new BitSet(reader.maxDoc());
- synchronized (cache) { // check cache
- BitSet cached = (BitSet) cache.get(reader);
- if (cached != null)
- return cached;
- }
-
- final BitSet bits = new BitSet(reader.maxDoc());
-
- new IndexSearcher(reader).search(query, new HitCollector() {
- public final void collect(int doc, float score) {
- bits.set(doc); // set bit for hit
- }
- });
+ new IndexSearcher(reader).search(query, new HitCollector() {
+ public final void collect(int doc, float score) {
+ bits.set(doc); // set bit for hit
+ }
+ });
- synchronized (cache) { // update cache
- cache.put(reader, bits);
- }
-
- return bits;
+ synchronized (cache) { // update cache
+ cache.put(reader, bits);
}
+
+ return bits;
+ }
}