Elements of Java Style #1: Adhere to the style of the original. I wholeheartedly agree. Reverting my previous infraction of this rule

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@150023 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Erik Hatcher 2003-09-13 23:40:29 +00:00
parent 0b53524a11
commit e676d0f3d4
3 changed files with 243 additions and 240 deletions

View File

@ -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 <code>f</code> matching dates
* between <code>from</code> and <code>to</code> inclusively.
*/
public DateFilter(String f, Date from, Date to) {
field = f;
start = DateField.dateToString(from);
end = DateField.dateToString(to);
}
/**
* Constructs a filter for field <code>f</code> matching times
* between <code>from</code> and <code>to</code> inclusively.
*/
public DateFilter(String f, long from, long to) {
field = f;
start = DateField.timeToString(from);
end = DateField.timeToString(to);
}
/**
* Constructs a filter for field <code>f</code> matching
* dates on or before before <code>date</code>.
*/
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 <code>f</code> matching times
* on or before <code>time</code>.
*/
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 <code>f</code> matching
* dates on or after <code>date</code>.
*/
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 <code>f</code> matching
* times on or after <code>time</code>.
*/
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 <code>f</code> matching dates
* between <code>from</code> and <code>to</code> inclusively.
*/
public DateFilter(String f, Date from, Date to) {
field = f;
start = DateField.dateToString(from);
end = DateField.dateToString(to);
}
/**
* Constructs a filter for field <code>f</code> matching times
* between <code>from</code> and <code>to</code> inclusively.
*/
public DateFilter(String f, long from, long to) {
field = f;
start = DateField.timeToString(from);
end = DateField.timeToString(to);
}
/**
* Constructs a filter for field <code>f</code> matching
* dates on or before before <code>date</code>.
*/
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 <code>f</code> matching times
* on or before <code>time</code>.
*/
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 <code>f</code> matching
* dates on or after <code>date</code>.
*/
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 <code>f</code> matching
* times on or after <code>time</code>.
*/
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();
}
}

View File

@ -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 <code>min</code> 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 <code>min</code> 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.
<p>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.
<p>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;
}
}

View File

@ -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
* <code>query</code>.
*/
public QueryFilter(Query query) {
this.query = query;
/** Constructs a filter which only matches documents matching
* <code>query</code>.
*/
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;
}
}