Index: lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java
===================================================================
--- lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java (revision 1495103)
+++ lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java (working copy)
@@ -1164,4 +1164,33 @@
assertEquals("[isla de muerta/8, i love lucy/7]", suggester.lookup("i", false, 3).toString());
assertEquals("[i love lucy/7]", suggester.lookup("i ", false, 3).toString());
}
+
+ public void testTooManyExpansions() throws Exception {
+
+ final Analyzer a = new Analyzer() {
+ @Override
+ protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
+ Tokenizer tokenizer = new MockTokenizer(reader, MockTokenizer.SIMPLE, true);
+
+ return new TokenStreamComponents(tokenizer) {
+ @Override
+ public TokenStream getTokenStream() {
+ Token a = new Token("a", 0, 1);
+ a.setPositionIncrement(1);
+ Token b = new Token("b", 0, 1);
+ b.setPositionIncrement(0);
+ return new CannedTokenStream(new Token[] {a, b});
+ }
+
+ @Override
+ protected void setReader(final Reader reader) throws IOException {
+ }
+ };
+ }
+ };
+
+ AnalyzingSuggester suggester = new AnalyzingSuggester(a, a, 0, 256, 1);
+ suggester.build(new TermFreqArrayIterator(new TermFreq[] {new TermFreq("a", 1)}));
+ assertEquals("[a/1]", suggester.lookup("a", false, 1).toString());
+ }
}
Index: lucene/CHANGES.txt
===================================================================
--- lucene/CHANGES.txt (revision 1495103)
+++ lucene/CHANGES.txt (working copy)
@@ -167,6 +167,9 @@
when the sum of those shapes contain the query shape but none do individually.
A flag was added to use the original faster algorithm. (David Smiley)
+* LUCENE-4971: Fixed NPE in AnalyzingSuggester when there are too many
+ graph expansions. (Alexey Kudinov via Mike McCandless)
+
Optimizations
* LUCENE-4936: Improve numeric doc values compression in case all values share
Index: lucene/core/src/java/org/apache/lucene/util/automaton/SpecialOperations.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/util/automaton/SpecialOperations.java (revision 1495103)
+++ lucene/core/src/java/org/apache/lucene/util/automaton/SpecialOperations.java (working copy)
@@ -219,7 +219,7 @@
/**
* Returns the set of accepted strings, assuming that at most
* limit strings are accepted. If more than limit
- * strings are accepted, null is returned. If limit<0, then
+ * strings are accepted, the first limit strings found are returned. If limit<0, then
* the limit is infinite.
*/
public static Set getFiniteStrings(Automaton a, int limit) {
@@ -227,11 +227,9 @@
if (a.isSingleton()) {
if (limit > 0) {
strings.add(Util.toUTF32(a.singleton, new IntsRef()));
- } else {
- return null;
}
} else if (!getFiniteStrings(a.initial, new HashSet(), strings, new IntsRef(), limit)) {
- return null;
+ return strings;
}
return strings;
}