[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: Otis Gospodnetic <otis_gospodnetic () yahoo ! com>
Date: 2005-04-26 2:36:36
Message-ID: 20050426023636.82866.qmail () web31103 ! mail ! mud ! yahoo ! com
[Download RAW message or body]
Hello,
Would it be better to explicitly check for out of bounds hitNumber
instead of catching ArrayIndexOutOfBoundsException?
if (hitNumber > hits.length()) {
throw new NoSuchElementException();
}
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.
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
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic