[prev in list] [next in list] [prev in thread] [next in thread]
List: lucene-dev
Subject: Re: svn commit: r164695 - in /lucene/java/trunk: CHANGES.txt src/java/org/apache/lucene/search/Hit.j
From: Erik Hatcher <erik () ehatchersolutions ! com>
Date: 2005-04-26 3:24:43
Message-ID: a646d18b02bd0e55a8c38401b4baf6bf () ehatchersolutions ! com
[Download RAW message or body]
On Apr 25, 2005, at 10:36 PM, Otis Gospodnetic wrote:
> Would it be better to explicitly check for out of bounds hitNumber
> instead of catching ArrayIndexOutOfBoundsException?
>
> if (hitNumber > hits.length()) {
> throw new NoSuchElementException();
> }
Good eye. I've added a test case that identified this issue since the
out of bound exception could never have occurred and then fixed the
issue.
> Also, is "a future for a hit" a typo, or does that actually mean
> something? This makes me think of Python's "future", but I'm not sure
> what this means in this context.
I've cleared this up.
Thanks,
Erik
>
> Thanks,
> Otis
>
>
>
> --- ehatcher@apache.org wrote:
>
>> Author: ehatcher
>> Date: Mon Apr 25 17:21:53 2005
>> New Revision: 164695
>>
>> URL: http://svn.apache.org/viewcvs?rev=164695&view=rev
>> Log:
>> Add Hits.iterator and corresponding HitIterator and Hit classes.
>> Contributed by Jeremy Rayner
>>
>> Added:
>> lucene/java/trunk/src/java/org/apache/lucene/search/Hit.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/search/HitIterator.java
>> lucene/java/trunk/src/test/org/apache/lucene/TestHitIterator.java
>> Modified:
>> lucene/java/trunk/CHANGES.txt
>> lucene/java/trunk/src/java/org/apache/lucene/search/Hits.java
>>
>> Modified: lucene/java/trunk/CHANGES.txt
>> URL:
>>
> http://svn.apache.org/viewcvs/lucene/java/trunk/CHANGES.txt?
> rev=164695&r1=164694&r2=164695&view=diff
>>
> =======================================================================
> =======
>> --- lucene/java/trunk/CHANGES.txt (original)
>> +++ lucene/java/trunk/CHANGES.txt Mon Apr 25 17:21:53 2005
>> @@ -91,6 +91,11 @@
>> which lets the caller get the Lucene version information
>> specified in
>> the Lucene Jar.
>> (Doug Cutting via Otis)
>> +
>> +15. Added Hits.iterator() method and corresponding HitIterator and
>> Hit objects.
>> + This provides standard java.util.Iterator iteration over Hits.
>> + Each call to the iterator's next() method returns a Hit object.
>> + (Jeremy Rayner via Erik)
>>
>> API Changes
>>
>>
>> Added: lucene/java/trunk/src/java/org/apache/lucene/search/Hit.java
>> URL:
>>
> http://svn.apache.org/viewcvs/lucene/java/trunk/src/java/org/apache/
> lucene/search/Hit.java?rev=164695&view=auto
>>
> =======================================================================
> =======
>> --- lucene/java/trunk/src/java/org/apache/lucene/search/Hit.java
>> (added)
>> +++ lucene/java/trunk/src/java/org/apache/lucene/search/Hit.java Mon
>> Apr 25 17:21:53 2005
>> @@ -0,0 +1,125 @@
>> +/**
>> + * Copyright 2005 The Apache Software Foundation
>> + *
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at
>> + *
>> + * http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions
>> and
>> + * limitations under the License.
>> + */
>> +
>> +package org.apache.lucene.search;
>> +
>> +import java.io.IOException;
>> +
>> +import org.apache.lucene.document.Document;
>> +
>> +/**
>> + * a lazy future for a hit, useful for iterators over instances of
>> Hits
>> + *
>> + * @author Jeremy Rayner
>> + */
>> +public class Hit implements java.io.Serializable {
>> +
>> + private float score;
>> + private int id;
>> + private Document doc = null;
>> +
>> + private boolean resolved = false;
>> +
>> + private Hits hits = null;
>> + private int hitNumber;
>> +
>> + /**
>> + * Constructed from {@link HitIterator}
>> + * @param hits Hits returned from a search
>> + * @param hitNumber Hit index in Hits
>> + */
>> + Hit(Hits hits, int hitNumber) {
>> + this.hits = hits;
>> + this.hitNumber = hitNumber;
>> + }
>> +
>> + /**
>> + * Returns document for this hit.
>> + *
>> + * @see {@link Hits#doc(int)}
>> + */
>> + public Document getDocument() throws IOException {
>> + if (!resolved) fetchTheHit();
>> + return doc;
>> + }
>> +
>> + /**
>> + * Returns score for this hit.
>> + *
>> + * @see {@link Hits#score(int)}
>> + */
>> + public float getScore() throws IOException {
>> + if (!resolved) fetchTheHit();
>> + return score;
>> + }
>> +
>> + /**
>> + * Returns id for this hit.
>> + *
>> + * @see {@link Hits#id(int)}
>> + */
>> + public int getId() throws IOException {
>> + if (!resolved) fetchTheHit();
>> + return id;
>> + }
>> +
>> + private void fetchTheHit() throws IOException {
>> + doc = hits.doc(hitNumber);
>> + score = hits.score(hitNumber);
>> + id = hits.id(hitNumber);
>> + resolved = true;
>> + }
>> +
>> + // provide some of the Document style interface (the simple stuff)
>> +
>> + /**
>> + * Returns the boost factor for this hit on any field of the
>> underlying document.
>> + *
>> + * @see {@link Document#getBoost()}
>> + */
>> + public float getBoost() throws IOException {
>> + return getDocument().getBoost();
>> + }
>> +
>> + /**
>> + * Returns the string value of the field with the given name if
>> any exist in
>> + * this document, or null. If multiple fields exist with this
>> name, this
>> + * method returns the first value added. If only binary fields
>> with this name
>> + * exist, returns null.
>> + *
>> + * @see {@link Document#get(String)}
>> + */
>> + public String get(String name) throws IOException {
>> + return getDocument().get(name);
>> + }
>> +
>> + /**
>> + * Prints the fields of the underlying document for human
>> consumption.
>> + * <p/>
>> + * If an IOException occurs whilst getting the document, returns
>> null
>> + *
>> + * @see {@link Document#toString()}
>> + */
>> + public String toString() {
>> + try {
>> + return getDocument().toString();
>> + } catch (IOException e) {
>> + return null;
>> + }
>> + }
>> +
>> +
>> +}
>>
>> Added:
>> lucene/java/trunk/src/java/org/apache/lucene/search/HitIterator.java
>> URL:
>>
> http://svn.apache.org/viewcvs/lucene/java/trunk/src/java/org/apache/
> lucene/search/HitIterator.java?rev=164695&view=auto
>>
> =======================================================================
> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/search/HitIterator.java
>> (added)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/search/HitIterator.java
>> Mon Apr 25 17:21:53 2005
>> @@ -0,0 +1,78 @@
>> +/**
>> + * Copyright 2005 The Apache Software Foundation
>> + *
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at
>> + *
>> + * http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions
>> and
>> + * limitations under the License.
>> + */
>> +
>> +package org.apache.lucene.search;
>> +
>> +import java.util.Iterator;
>> +import java.util.NoSuchElementException;
>> +
>> +/**
>> + * An iterator over {@link Hits} that provides lazy fetching of each
>> document.
>> + * {@link Hits#iterator()} returns an instance of this class. Calls
>> to {@link #next()}
>> + * return a {@link Hit} instance.
>> + *
>> + * @author Jeremy Rayner
>> + */
>> +public class HitIterator implements Iterator {
>> + private Hits hits;
>> + private int hitNumber = 0;
>> +
>> + /**
>> + * Constructed from {@link Hits#iterator()}.
>> + */
>> + HitIterator(Hits hits) {
>> + this.hits = hits;
>> + }
>> +
>> + /**
>> + * @return true if current hit is less than the total number of
>> {@link Hits}.
>> + */
>> + public boolean hasNext() {
>> + return hitNumber < hits.length();
>> + }
>> +
>> + /**
>> + * Returns a {@link Hit} instance representing the next hit in
>> {@link Hits}.
>> + *
>> + * @return Next {@link Hit}.
>> + */
>> + public Object next() {
>> + try {
>> + Object next = new Hit(hits, hitNumber);
>> + hitNumber++;
>> + return next;
>> + } catch (IndexOutOfBoundsException e) {
>> + throw new NoSuchElementException();
>> + }
>> + }
>> +
>> + /**
>> + * Unsupported operation.
>> + *
>> + * @throws UnsupportedOperationException
>> + */
>> + public void remove() {
>> + throw new UnsupportedOperationException();
>> + }
>> +
>> + /**
>> + * Returns the total number of hits.
>> + */
>> + public int length() {
>> + return hits.length();
>> + }
>> +}
>> +
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/search/Hits.java
>> URL:
>>
> http://svn.apache.org/viewcvs/lucene/java/trunk/src/java/org/apache/
> lucene/search/Hits.java?rev=164695&r1=164694&r2=164695&view=diff
>>
> =======================================================================
> =======
>> --- lucene/java/trunk/src/java/org/apache/lucene/search/Hits.java
>> (original)
>> +++ lucene/java/trunk/src/java/org/apache/lucene/search/Hits.java Mon
>> Apr 25 17:21:53 2005
>> @@ -18,6 +18,7 @@
>>
>> import java.io.IOException;
>> import java.util.Vector;
>> +import java.util.Iterator;
>>
>> import org.apache.lucene.document.Document;
>>
>> @@ -114,6 +115,13 @@
>> return hitDoc(n).id;
>> }
>>
>> + /**
>> + * Returns an {@link Iterator} to navigate the Hits. Each item
>> returned
>> + * from {@link Iterator#next()} is a {@link Hit}.
>> + */
>> + public Iterator iterator() {
>> + return new HitIterator(this);
>> + }
>>
>> private final HitDoc hitDoc(int n) throws IOException {
>> if (n >= length) {
>>
>> Added:
>> lucene/java/trunk/src/test/org/apache/lucene/TestHitIterator.java
>> URL:
>>
> http://svn.apache.org/viewcvs/lucene/java/trunk/src/test/org/apache/
> lucene/TestHitIterator.java?rev=164695&view=auto
>>
> =======================================================================
> =======
>> --- lucene/java/trunk/src/test/org/apache/lucene/TestHitIterator.java
>> (added)
>> +++ lucene/java/trunk/src/test/org/apache/lucene/TestHitIterator.java
>> Mon Apr 25 17:21:53 2005
>> @@ -0,0 +1,50 @@
>> +package org.apache.lucene;
>> +
>> +import junit.framework.TestCase;
>> +import org.apache.lucene.store.RAMDirectory;
>> +import org.apache.lucene.index.IndexWriter;
>> +import org.apache.lucene.index.Term;
>> +import org.apache.lucene.analysis.WhitespaceAnalyzer;
>> +import org.apache.lucene.document.Document;
>> +import org.apache.lucene.document.Field;
>> +import org.apache.lucene.search.IndexSearcher;
>> +import org.apache.lucene.search.TermQuery;
>> +import org.apache.lucene.search.Hits;
>> +import org.apache.lucene.search.Hit;
>> +import org.apache.lucene.search.HitIterator;
>> +
>> +/**
>> + * This test intentionally not put in the search package in order
>> + * to test HitIterator and Hit package protection.
>> + */
>> +public class TestHitIterator extends TestCase {
>> + public void testIterator() throws Exception {
>> + RAMDirectory directory = new RAMDirectory();
>> +
>> + IndexWriter writer = new IndexWriter(directory, new
>> WhitespaceAnalyzer(), true);
>> + Document doc = new Document();
>> + doc.add(new Field("field", "iterator test doc 1",
>> Field.Store.YES, Field.Index.TOKENIZED));
>> + writer.addDocument(doc);
>> +
>> + doc = new Document();
>> + doc.add(new Field("field", "iterator test doc 2",
>> Field.Store.YES, Field.Index.TOKENIZED));
>> + writer.addDocument(doc);
>> +
>> + writer.close();
>> +
>> + IndexSearcher searcher = new IndexSearcher(directory);
>> + Hits hits = searcher.search(new TermQuery(new Term("field",
>> "iterator")));
>> +
>> + HitIterator iterator = (HitIterator) hits.iterator();
>> + assertEquals(2, iterator.length());
>> + assertTrue(iterator.hasNext());
>> + Hit hit = (Hit) iterator.next();
>> + assertEquals("iterator test doc 1", hit.get("field"));
>> +
>> + assertTrue(iterator.hasNext());
>> + hit = (Hit) iterator.next();
>> + assertEquals("iterator test doc 2",
>> hit.getDocument().get("field"));
>> +
>> + assertFalse(iterator.hasNext());
>> + }
>> +}
>>
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-dev-help@lucene.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic