diff --git a/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java index 8b8b184b0ad..55ed7e670f4 100644 --- a/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java +++ b/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java @@ -352,4 +352,42 @@ public class TestBooleanQuery extends LuceneTestCase { dir.close(); } + public void testOneClauseRewriteOptimization() throws Exception { + final float BOOST = 3.5F; + final String FIELD = "content"; + final String VALUE = "foo"; + + Directory dir = newDirectory(); + (new RandomIndexWriter(random(), dir)).shutdown(); + IndexReader r = DirectoryReader.open(dir); + + TermQuery expected = new TermQuery(new Term(FIELD, VALUE)); + expected.setBoost(BOOST); + + final int numLayers = atLeast(3); + boolean needBoost = true; + Query actual = new TermQuery(new Term(FIELD, VALUE)); + + for (int i = 0; i < numLayers; i++) { + if (needBoost && 0 == TestUtil.nextInt(random(),0,numLayers)) { + needBoost = false; + actual.setBoost(BOOST); + } + + BooleanQuery bq = new BooleanQuery(); + bq.add(actual, random().nextBoolean() + ? BooleanClause.Occur.SHOULD : BooleanClause.Occur.MUST); + actual = bq; + } + if (needBoost) { + actual.setBoost(BOOST); + } + + assertEquals(numLayers + ": " + actual.toString(), + expected, actual.rewrite(r)); + + r.close(); + dir.close(); + } + }