Return-Path: Delivered-To: apmail-lucene-java-commits-archive@www.apache.org Received: (qmail 39823 invoked from network); 3 Apr 2008 16:42:31 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 3 Apr 2008 16:42:31 -0000 Received: (qmail 1839 invoked by uid 500); 3 Apr 2008 16:42:30 -0000 Delivered-To: apmail-lucene-java-commits-archive@lucene.apache.org Received: (qmail 1815 invoked by uid 500); 3 Apr 2008 16:42:30 -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 1804 invoked by uid 99); 3 Apr 2008 16:42:30 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Apr 2008 09:42:30 -0700 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.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Apr 2008 16:41:57 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E385F1A9832; Thu, 3 Apr 2008 09:42:08 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r644400 - in /lucene/java/trunk/src: java/org/apache/lucene/index/CheckIndex.java java/org/apache/lucene/index/DocumentsWriterFieldData.java java/org/apache/lucene/index/IndexWriter.java test/org/apache/lucene/index/TestIndexWriter.java Date: Thu, 03 Apr 2008 16:42:07 -0000 To: java-commits@lucene.apache.org From: mikemccand@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080403164208.E385F1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mikemccand Date: Thu Apr 3 09:42:06 2008 New Revision: 644400 URL: http://svn.apache.org/viewvc?rev=644400&view=rev Log: LUCENE-1255: if position is negative, silently change it to 0 Modified: lucene/java/trunk/src/java/org/apache/lucene/index/CheckIndex.java lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriterFieldData.java lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java Modified: lucene/java/trunk/src/java/org/apache/lucene/index/CheckIndex.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/CheckIndex.java?rev=644400&r1=644399&r2=644400&view=diff ============================================================================== --- lucene/java/trunk/src/java/org/apache/lucene/index/CheckIndex.java (original) +++ lucene/java/trunk/src/java/org/apache/lucene/index/CheckIndex.java Thu Apr 3 09:42:06 2008 @@ -223,7 +223,7 @@ final int pos = termPositions.nextPosition(); if (pos < 0) throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + " is out of bounds"); - if (pos <= lastPos) + if (pos < lastPos) throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + " < lastPos " + lastPos); } } Modified: lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriterFieldData.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriterFieldData.java?rev=644400&r1=644399&r2=644400&view=diff ============================================================================== --- lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriterFieldData.java (original) +++ lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriterFieldData.java Thu Apr 3 09:42:06 2008 @@ -239,11 +239,13 @@ try { offsetEnd = offset-1; - Token token; for(;;) { - token = stream.next(localToken); + Token token = stream.next(localToken); if (token == null) break; position += (token.getPositionIncrement() - 1); + // LUCENE-1255: don't allow negative positon + if (position < 0) + position = 0; addPosition(token); if (++length >= maxFieldLength) { if (threadState.docWriter.infoStream != null) Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java?rev=644400&r1=644399&r2=644400&view=diff ============================================================================== --- lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java (original) +++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java Thu Apr 3 09:42:06 2008 @@ -1692,8 +1692,11 @@ throw oom; } finally { synchronized(this) { - if (!closed) + if (!closed) { closing = false; + if (infoStream != null) + message("hit exception while closing"); + } notifyAll(); } } Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java?rev=644400&r1=644399&r2=644400&view=diff ============================================================================== --- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java (original) +++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java Thu Apr 3 09:42:06 2008 @@ -30,6 +30,7 @@ import org.apache.lucene.analysis.WhitespaceAnalyzer; import org.apache.lucene.analysis.WhitespaceTokenizer; import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.SinkTokenizer; import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; @@ -40,6 +41,9 @@ import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Hits; import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.spans.SpanTermQuery; +import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.RAMDirectory; @@ -3548,5 +3552,47 @@ for(int i=0;i<20;i++) assertEquals(expected[i], utf16a.result[i]); } + } + + // LUCENE-1255 + public void testNegativePositions() throws Throwable { + SinkTokenizer tokens = new SinkTokenizer(); + Token t = new Token(); + t.setTermText("a"); + t.setPositionIncrement(0); + tokens.add(t); + t.setTermText("b"); + t.setPositionIncrement(1); + tokens.add(t); + t.setTermText("c"); + tokens.add(t); + + MockRAMDirectory dir = new MockRAMDirectory(); + IndexWriter w = new IndexWriter(dir, false, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); + Document doc = new Document(); + doc.add(new Field("field", tokens)); + w.addDocument(doc); + w.commit(); + + IndexSearcher s = new IndexSearcher(dir); + PhraseQuery pq = new PhraseQuery(); + pq.add(new Term("field", "a")); + pq.add(new Term("field", "b")); + pq.add(new Term("field", "c")); + Hits hits = s.search(pq); + assertEquals(1, hits.length()); + + Query q = new SpanTermQuery(new Term("field", "a")); + hits = s.search(q); + assertEquals(1, hits.length()); + TermPositions tps = s.getIndexReader().termPositions(new Term("field", "a")); + assertTrue(tps.next()); + assertEquals(1, tps.freq()); + assertEquals(0, tps.nextPosition()); + w.close(); + + assertTrue(_TestUtil.checkIndex(dir)); + s.close(); + dir.close(); } }