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;