From 068e64fc981219126c8b2df2156904c621f7993a Mon Sep 17 00:00:00 2001 From: iverase Date: Wed, 16 Feb 2022 09:47:00 +0100 Subject: [PATCH 1/4] LUCENE-10415: FunctionScoreQuery and IndexOrDocValuesQuery delegate Weight#count --- .../lucene/search/IndexOrDocValuesQuery.java | 9 +++++ .../search/TestIndexOrDocValuesQuery.java | 39 +++++++++++++++++++ .../queries/function/FunctionScoreQuery.java | 5 +++ .../function/TestFunctionScoreQuery.java | 16 ++++++++ 4 files changed, 69 insertions(+) diff --git a/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java b/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java index c9338b71ef85..1a12addf488b 100644 --- a/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java @@ -142,6 +142,15 @@ public BulkScorer bulkScorer(LeafReaderContext context) throws IOException { return indexWeight.bulkScorer(context); } + @Override + public int count(LeafReaderContext context) throws IOException { + final int count = indexWeight.count(context); + if (count != -1) { + return count; + } + return dvWeight.count(context); + } + @Override public ScorerSupplier scorerSupplier(LeafReaderContext context) throws IOException { final ScorerSupplier indexScorerSupplier = indexWeight.scorerSupplier(context); diff --git a/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java index 8fb6be0930c5..a052bb0617e7 100644 --- a/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java +++ b/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java @@ -26,6 +26,7 @@ import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.Directory; @@ -182,4 +183,42 @@ public void testUseIndexForSelectiveMultiValueQueries() throws IOException { w.close(); dir.close(); } + + // Weight#count is delegated to the inner weight + public void testQueryMatchesCount() throws Exception { + Directory dir = newDirectory(); + IndexWriter w = + new IndexWriter( + dir, + newIndexWriterConfig() + // relies on costs and PointValues.estimateCost so we need the default codec + .setCodec(TestUtil.getDefaultCodec())); + final int numDocs = random().nextInt(5000); + for (int i = 0; i < numDocs; ++i) { + Document doc = new Document(); + doc.add(new LongPoint("f2", 42L)); + doc.add(new SortedNumericDocValuesField("f2", 42L)); + w.addDocument(doc); + } + w.forceMerge(1); + IndexReader reader = DirectoryReader.open(w); + IndexSearcher searcher = newSearcher(reader); + + final IndexOrDocValuesQuery query = + new IndexOrDocValuesQuery( + LongPoint.newExactQuery("f2", 42), + SortedNumericDocValuesField.newSlowRangeQuery("f2", 42, 42L)); + + final int searchCount = searcher.count(query); + final Weight weight = searcher.createWeight(query, ScoreMode.COMPLETE, 1); + int weightCount = 0; + for (LeafReaderContext leafReaderContext : reader.leaves()) { + weightCount += weight.count(leafReaderContext); + } + assertEquals(searchCount, weightCount); + + reader.close(); + w.close(); + dir.close(); + } } diff --git a/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionScoreQuery.java b/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionScoreQuery.java index aed12ff4d3fe..2d207690153c 100644 --- a/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionScoreQuery.java +++ b/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionScoreQuery.java @@ -253,6 +253,11 @@ public float getMaxScore(int upTo) throws IOException { }; } + @Override + public int count(LeafReaderContext context) throws IOException { + return inner.count(context); + } + @Override public boolean isCacheable(LeafReaderContext ctx) { return inner.isCacheable(ctx) && valueSource.isCacheable(ctx); diff --git a/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionScoreQuery.java b/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionScoreQuery.java index a7751c753def..d74c3823e9d7 100644 --- a/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionScoreQuery.java +++ b/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionScoreQuery.java @@ -30,6 +30,7 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; @@ -361,4 +362,19 @@ public void testScoreCalledTwice() throws Exception { } } } + + // Weight#count is delegated to the inner weight + public void testQueryMatchesCount() throws Exception { + TermQuery query = new TermQuery(new Term(TEXT_FIELD, "first")); + FunctionScoreQuery fq = + FunctionScoreQuery.boostByValue(query, DoubleValuesSource.fromIntField("iii")); + + final int searchCount = searcher.count(fq); + final Weight weight = searcher.createWeight(fq, ScoreMode.COMPLETE, 1); + int weightCount = 0; + for (LeafReaderContext leafReaderContext : reader.leaves()) { + weightCount += weight.count(leafReaderContext); + } + assertEquals(searchCount, weightCount); + } } From 526fb76d8b5aceb3a93d88ed064d29806e8a9c9d Mon Sep 17 00:00:00 2001 From: iverase Date: Wed, 16 Feb 2022 09:48:49 +0100 Subject: [PATCH 2/4] add entry in CHANGES.txt --- lucene/CHANGES.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 1542da15a0db..76eb5768488a 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -615,6 +615,8 @@ Improvements * LUCENE-10062: Switch taxonomy faceting to use numeric doc values for storing ordinals instead of binary doc values with its own custom encoding. (Greg Miller) + +* LUCENE-10415: FunctionScoreQuery and IndexOrDocValuesQuery delegate Weight#count. (Ignacio Vera) Bug fixes --------------------- From 9bc4323c5327885c367ece44db3591940ea7ded8 Mon Sep 17 00:00:00 2001 From: iverase Date: Wed, 16 Feb 2022 09:56:39 +0100 Subject: [PATCH 3/4] spotless --- .../search/TestIndexOrDocValuesQuery.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java index a052bb0617e7..0277e4a2dd9d 100644 --- a/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java +++ b/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java @@ -187,12 +187,12 @@ public void testUseIndexForSelectiveMultiValueQueries() throws IOException { // Weight#count is delegated to the inner weight public void testQueryMatchesCount() throws Exception { Directory dir = newDirectory(); - IndexWriter w = - new IndexWriter( - dir, - newIndexWriterConfig() - // relies on costs and PointValues.estimateCost so we need the default codec - .setCodec(TestUtil.getDefaultCodec())); + IndexWriter w = + new IndexWriter( + dir, + newIndexWriterConfig() + // relies on costs and PointValues.estimateCost so we need the default codec + .setCodec(TestUtil.getDefaultCodec())); final int numDocs = random().nextInt(5000); for (int i = 0; i < numDocs; ++i) { Document doc = new Document(); @@ -203,11 +203,11 @@ public void testQueryMatchesCount() throws Exception { w.forceMerge(1); IndexReader reader = DirectoryReader.open(w); IndexSearcher searcher = newSearcher(reader); - + final IndexOrDocValuesQuery query = - new IndexOrDocValuesQuery( - LongPoint.newExactQuery("f2", 42), - SortedNumericDocValuesField.newSlowRangeQuery("f2", 42, 42L)); + new IndexOrDocValuesQuery( + LongPoint.newExactQuery("f2", 42), + SortedNumericDocValuesField.newSlowRangeQuery("f2", 42, 42L)); final int searchCount = searcher.count(query); final Weight weight = searcher.createWeight(query, ScoreMode.COMPLETE, 1); From e3f06e7da98bce54fd30883c464537f754fd48dc Mon Sep 17 00:00:00 2001 From: iverase Date: Thu, 17 Feb 2022 07:16:44 +0100 Subject: [PATCH 4/4] move entry in CHANGES.txt to right place --- lucene/CHANGES.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 76eb5768488a..55321960de1c 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -154,6 +154,8 @@ New Features the number of matching range docs when each doc has at-most one point and the points are 1-dimensional. (Gautam Worah, Ignacio Vera, Adrien Grand) +* LUCENE-10415: FunctionScoreQuery and IndexOrDocValuesQuery delegate Weight#count. (Ignacio Vera) + Improvements --------------------- @@ -181,7 +183,7 @@ Improvements * LUCENE-10371: Make IndexRearranger able to arrange segment in a determined order. (Patrick Zhai) - + Optimizations --------------------- @@ -614,9 +616,7 @@ Improvements (David Smiley) * LUCENE-10062: Switch taxonomy faceting to use numeric doc values for storing ordinals instead of binary doc values - with its own custom encoding. (Greg Miller) - -* LUCENE-10415: FunctionScoreQuery and IndexOrDocValuesQuery delegate Weight#count. (Ignacio Vera) + with its own custom encoding. (Greg Miller) Bug fixes ---------------------