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; }