From 72d3f294606d4975182076babaac1847b267c862 Mon Sep 17 00:00:00 2001 From: David Wayne Smiley Date: Fri, 19 Dec 2014 16:55:39 +0000 Subject: [PATCH] LUCENE-6121: QueryBuilder put 2nd reset() to where it was, and add test to ensure no double-reset if there is no term attribute. git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1646794 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/lucene/util/QueryBuilder.java | 20 ++++++++----- .../apache/lucene/util/TestQueryBuilder.java | 29 +++++++++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java b/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java index 06861cd8aaf..1cb8b49255c 100644 --- a/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java +++ b/lucene/core/src/java/org/apache/lucene/util/QueryBuilder.java @@ -200,8 +200,8 @@ public class QueryBuilder { int numTokens = 0; int positionCount = 0; boolean severalTokensAtSamePosition = false; - boolean hasMoreTokens = false; - + boolean hasMoreTokens = false; + try (TokenStream source = analyzer.tokenStream(field, queryText)) { buffer = new CachingTokenFilter(source); buffer.reset(); @@ -225,19 +225,25 @@ public class QueryBuilder { } catch (IOException e) { // ignore } - - // rewind the buffer stream - buffer.reset();//will never through on subsequent reset calls } } catch (IOException e) { throw new RuntimeException("Error analyzing query text", e); } + // rewind the buffer stream + try { + if (numTokens > 0) { + buffer.reset();//will never throw; the buffer is cached + } + } catch (IOException e) { + throw new RuntimeException(e); + } + BytesRef bytes = termAtt == null ? null : termAtt.getBytesRef(); - if (numTokens == 0) + if (numTokens == 0) { return null; - else if (numTokens == 1) { + } else if (numTokens == 1) { try { boolean hasNext = buffer.incrementToken(); assert hasNext == true; diff --git a/lucene/core/src/test/org/apache/lucene/util/TestQueryBuilder.java b/lucene/core/src/test/org/apache/lucene/util/TestQueryBuilder.java index 7c0715dd19e..31c6e311c5a 100644 --- a/lucene/core/src/test/org/apache/lucene/util/TestQueryBuilder.java +++ b/lucene/core/src/test/org/apache/lucene/util/TestQueryBuilder.java @@ -19,6 +19,7 @@ package org.apache.lucene.util; import java.io.IOException; import java.io.Reader; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.MockAnalyzer; @@ -355,4 +356,32 @@ public class TestQueryBuilder extends LuceneTestCase { expected.setSlop(3); assertEquals(expected, builder.createPhraseQuery("field", "中国", 3)); } + + public void testNoTermAttribute() { + //Can't use MockTokenizer because it adds TermAttribute and we don't want that + Analyzer analyzer = new Analyzer() { + @Override + protected TokenStreamComponents createComponents(String fieldName) { + return new TokenStreamComponents( + new Tokenizer() { + boolean wasReset = false; + @Override + public void reset() throws IOException { + super.reset(); + assertFalse(wasReset); + wasReset = true; + } + + @Override + public boolean incrementToken() throws IOException { + assertTrue(wasReset); + return false; + } + } + ); + } + }; + QueryBuilder builder = new QueryBuilder(analyzer); + assertNull(builder.createBooleanQuery("field", "whatever")); + } }