Return-Path: Delivered-To: apmail-lucene-java-commits-archive@www.apache.org Received: (qmail 36736 invoked from network); 21 Nov 2009 12:01:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 21 Nov 2009 12:01:55 -0000 Received: (qmail 13902 invoked by uid 500); 21 Nov 2009 12:01:55 -0000 Delivered-To: apmail-lucene-java-commits-archive@lucene.apache.org Received: (qmail 13815 invoked by uid 500); 21 Nov 2009 12:01:55 -0000 Mailing-List: contact java-commits-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: java-dev@lucene.apache.org Delivered-To: mailing list java-commits@lucene.apache.org Received: (qmail 13806 invoked by uid 99); 21 Nov 2009 12:01:54 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 21 Nov 2009 12:01:54 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 21 Nov 2009 12:01:51 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id BEE80238888E; Sat, 21 Nov 2009 12:01:30 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r882888 - in /lucene/java/trunk/src: java/org/apache/lucene/search/NumericRangeQuery.java test/org/apache/lucene/search/TestNumericRangeQuery32.java Date: Sat, 21 Nov 2009 12:01:30 -0000 To: java-commits@lucene.apache.org From: uschindler@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091121120130.BEE80238888E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: uschindler Date: Sat Nov 21 12:01:29 2009 New Revision: 882888 URL: http://svn.apache.org/viewvc?rev=882888&view=rev Log: Improvement in NumericRangeTermEnum to reuse the term and not intern the field name everytime. It also throws UnsupportedOperationException in endEnum() method, which is not used, and should not be used by client code/subclasses (undefined behaviour). Also adds a test for the TermEnum. Modified: lucene/java/trunk/src/java/org/apache/lucene/search/NumericRangeQuery.java lucene/java/trunk/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java Modified: lucene/java/trunk/src/java/org/apache/lucene/search/NumericRangeQuery.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/NumericRangeQuery.java?rev=882888&r1=882887&r2=882888&view=diff ============================================================================== --- lucene/java/trunk/src/java/org/apache/lucene/search/NumericRangeQuery.java (original) +++ lucene/java/trunk/src/java/org/apache/lucene/search/NumericRangeQuery.java Sat Nov 21 12:01:29 2009 @@ -389,6 +389,7 @@ private final IndexReader reader; private final LinkedList rangeBounds = new LinkedList(); + private final Term termTemplate = new Term(field); private String currentUpperBound = null; NumericRangeTermEnum(final IndexReader reader) throws IOException { @@ -482,8 +483,7 @@ /** this is a dummy, it is not used by this class. */ @Override protected boolean endEnum() { - assert false; // should never be called - return (currentTerm == null); + throw new UnsupportedOperationException("not implemented"); } /** @@ -504,7 +504,7 @@ // if a current term exists, the actual enum is initialized: // try change to next term, if no such term exists, fall-through if (currentTerm != null) { - assert actualEnum!=null; + assert actualEnum != null; if (actualEnum.next()) { currentTerm = actualEnum.term(); if (termCompare(currentTerm)) return true; @@ -513,7 +513,10 @@ // if all above fails, we go forward to the next enum, // if one is available currentTerm = null; - if (rangeBounds.size() < 2) return false; + if (rangeBounds.size() < 2) { + assert rangeBounds.size() == 0; + return false; + } // close the current enum and read next bounds if (actualEnum != null) { actualEnum.close(); @@ -525,7 +528,7 @@ // next enum found. // if this behavior is changed/modified in the superclass, // this enum will not work anymore! - setEnum(reader.terms(new Term(field, lowerBound))); + setEnum(reader.terms(termTemplate.createTerm(lowerBound))); return (currentTerm != null); } Modified: lucene/java/trunk/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java?rev=882888&r1=882887&r2=882888&view=diff ============================================================================== --- lucene/java/trunk/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java (original) +++ lucene/java/trunk/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java Sat Nov 21 12:01:29 2009 @@ -25,6 +25,7 @@ import org.apache.lucene.document.NumericField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriter.MaxFieldLength; +import org.apache.lucene.index.Term; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.NumericUtils; @@ -437,4 +438,37 @@ assertFalse(q2.equals(q1)); } + private void testEnum(int lower, int upper) throws Exception { + NumericRangeQuery q = NumericRangeQuery.newIntRange("field4", 4, lower, upper, true, true); + FilteredTermEnum termEnum = q.getEnum(searcher.getIndexReader()); + try { + int count = 0; + do { + final Term t = termEnum.term(); + if (t != null) { + final int val = NumericUtils.prefixCodedToInt(t.text()); + assertTrue("value not in bounds", val >= lower && val <= upper); + count++; + } else break; + } while (termEnum.next()); + assertFalse(termEnum.next()); + System.out.println("TermEnum on 'field4' for range [" + lower + "," + upper + "] contained " + count + " terms."); + } finally { + termEnum.close(); + } + } + + public void testEnum() throws Exception { + int count=3000; + int lower=(distance*3/2)+startOffset, upper=lower + count*distance + (distance/3); + // test enum with values + testEnum(lower, upper); + // test empty enum + testEnum(upper, lower); + // test empty enum outside of bounds + lower = distance*noDocs+startOffset; + upper = 2 * lower; + testEnum(lower, upper); + } + }