You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2012/03/07 19:33:07 UTC
svn commit: r1298034 - in /lucene/dev/trunk/lucene: contrib/
contrib/memory/src/test/org/apache/lucene/index/memory/
core/src/java/org/apache/lucene/codecs/
core/src/java/org/apache/lucene/search/
core/src/java/org/apache/lucene/search/spans/ core/src/...
Author: mikemccand
Date: Wed Mar 7 18:33:06 2012
New Revision: 1298034
URL: http://svn.apache.org/viewvc?rev=1298034&view=rev
Log:
LUCENE-3831: fix SpanWeight to not pass null field to postings APIs
Modified:
lucene/dev/trunk/lucene/contrib/CHANGES.txt
lucene/dev/trunk/lucene/contrib/memory/src/test/org/apache/lucene/index/memory/MemoryIndexTest.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java
lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/TestSpans.java
Modified: lucene/dev/trunk/lucene/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/contrib/CHANGES.txt?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/contrib/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/contrib/CHANGES.txt Wed Mar 7 18:33:06 2012
@@ -242,6 +242,10 @@ Bug Fixes
that take stopwords and stem exclusion tables also initialize
the default stem overrides (e.g. kind/kinder, fiets). (Robert Muir)
+ * LUCENE-3831: avoid NPE if the SpanQuery has a null field (eg a
+ SpanOrQuery with no clauses added). (Alan Woodward via Mike
+ McCandless).
+
Documentation
* LUCENE-3599: Javadocs for DistanceUtils.haversine() were incorrectly
Modified: lucene/dev/trunk/lucene/contrib/memory/src/test/org/apache/lucene/index/memory/MemoryIndexTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/contrib/memory/src/test/org/apache/lucene/index/memory/MemoryIndexTest.java?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/contrib/memory/src/test/org/apache/lucene/index/memory/MemoryIndexTest.java (original)
+++ lucene/dev/trunk/lucene/contrib/memory/src/test/org/apache/lucene/index/memory/MemoryIndexTest.java Wed Mar 7 18:33:06 2012
@@ -21,6 +21,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;
@@ -40,11 +41,16 @@ import org.apache.lucene.index.DocsEnum;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.RegexpQuery;
import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
+import org.apache.lucene.search.spans.SpanOrQuery;
+import org.apache.lucene.search.spans.SpanQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util._TestUtil;
@@ -225,4 +231,28 @@ public class MemoryIndexTest extends Bas
assertTrue(disi.nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
reader.close();
}
+
+ // LUCENE-3831
+ public void testNullPointerException() throws IOException {
+ RegexpQuery regex = new RegexpQuery(new Term("field", "worl."));
+ SpanQuery wrappedquery = new SpanMultiTermQueryWrapper<RegexpQuery>(regex);
+
+ MemoryIndex mindex = new MemoryIndex();
+ mindex.addField("field", new MockAnalyzer(random).tokenStream("field", new StringReader("hello there")));
+
+ // This throws an NPE
+ assertEquals(0, mindex.search(wrappedquery), 0.00001f);
+ }
+
+ // LUCENE-3831
+ public void testPassesIfWrapped() throws IOException {
+ RegexpQuery regex = new RegexpQuery(new Term("field", "worl."));
+ SpanQuery wrappedquery = new SpanOrQuery(new SpanMultiTermQueryWrapper<RegexpQuery>(regex));
+
+ MemoryIndex mindex = new MemoryIndex();
+ mindex.addField("field", new MockAnalyzer(random).tokenStream("field", new StringReader("hello there")));
+
+ // This passes though
+ assertEquals(0, mindex.search(wrappedquery), 0.00001f);
+ }
}
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java Wed Mar 7 18:33:06 2012
@@ -197,6 +197,7 @@ public class BlockTermsReader extends Fi
@Override
public Terms terms(String field) throws IOException {
+ assert field != null;
return fields.get(field);
}
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java Wed Mar 7 18:33:06 2012
@@ -211,6 +211,7 @@ public class BlockTreeTermsReader extend
@Override
public Terms terms(String field) throws IOException {
+ assert field != null;
return fields.get(field);
}
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java Wed Mar 7 18:33:06 2012
@@ -584,8 +584,9 @@ public class IndexSearcher {
Weight weight = query.createWeight(this);
float v = weight.getValueForNormalization();
float norm = getSimilarity().queryNorm(v);
- if (Float.isInfinite(norm) || Float.isNaN(norm))
+ if (Float.isInfinite(norm) || Float.isNaN(norm)) {
norm = 1.0f;
+ }
weight.normalize(norm, 1.0f);
return weight;
}
@@ -812,6 +813,8 @@ public class IndexSearcher {
final int docCount;
final long sumTotalTermFreq;
final long sumDocFreq;
+
+ assert field != null;
Terms terms = MultiFields.getTerms(reader, field);
if (terms == null) {
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java Wed Mar 7 18:33:06 2012
@@ -57,9 +57,12 @@ public class SpanWeight extends Weight {
termContexts.put(term, state);
i++;
}
- stats = similarity.computeWeight(query.getBoost(),
- searcher.collectionStatistics(query.getField()),
- termStats);
+ final String field = query.getField();
+ if (field != null) {
+ stats = similarity.computeWeight(query.getBoost(),
+ searcher.collectionStatistics(query.getField()),
+ termStats);
+ }
}
@Override
@@ -67,18 +70,24 @@ public class SpanWeight extends Weight {
@Override
public float getValueForNormalization() throws IOException {
- return stats.getValueForNormalization();
+ return stats == null ? 1.0f : stats.getValueForNormalization();
}
@Override
public void normalize(float queryNorm, float topLevelBoost) {
- stats.normalize(queryNorm, topLevelBoost);
+ if (stats != null) {
+ stats.normalize(queryNorm, topLevelBoost);
+ }
}
@Override
public Scorer scorer(AtomicReaderContext context, boolean scoreDocsInOrder,
boolean topScorer, Bits acceptDocs) throws IOException {
- return new SpanScorer(query.getSpans(context, acceptDocs, termContexts), this, similarity.sloppySimScorer(stats, context));
+ if (stats == null) {
+ return null;
+ } else {
+ return new SpanScorer(query.getSpans(context, acceptDocs, termContexts), this, similarity.sloppySimScorer(stats, context));
+ }
}
@Override
Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/TestSpans.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/TestSpans.java?rev=1298034&r1=1298033&r2=1298034&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/TestSpans.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/TestSpans.java Wed Mar 7 18:33:06 2012
@@ -17,31 +17,31 @@ package org.apache.lucene.search.spans;
* limitations under the License.
*/
+import java.io.IOException;
+
+import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReaderContext;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.CheckHits;
import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.CheckHits;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.similarities.DefaultSimilarity;
import org.apache.lucene.search.similarities.Similarity;
import org.apache.lucene.store.Directory;
-import org.apache.lucene.analysis.MockAnalyzer;
-import org.apache.lucene.index.AtomicReaderContext;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriterConfig;
-import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.IndexReaderContext;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.StringField;
-import org.apache.lucene.document.TextField;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.ReaderUtil;
-import java.io.IOException;
-
public class TestSpans extends LuceneTestCase {
private IndexSearcher searcher;
private IndexReader reader;