You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by gs...@apache.org on 2021/06/01 16:54:26 UTC

[lucene] branch main updated: LUCENE-9956: Make getBaseQuery, getDrillDownQueries API from DrillDownQuery public (#138)

This is an automated email from the ASF dual-hosted git repository.

gsmiller pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/main by this push:
     new 27b009c  LUCENE-9956: Make getBaseQuery, getDrillDownQueries API from DrillDownQuery public  (#138)
27b009c is described below

commit 27b009c5d04c4a2169929ef19be5de7f7fa3ec87
Author: Gautam Worah <wo...@gmail.com>
AuthorDate: Tue Jun 1 09:54:18 2021 -0700

    LUCENE-9956: Make getBaseQuery, getDrillDownQueries API from DrillDownQuery public  (#138)
    
    Co-authored-by: Gautam Worah <ga...@amazon.com>
---
 lucene/CHANGES.txt                                 |  2 +
 .../org/apache/lucene/facet/DrillDownQuery.java    | 44 ++++++++++++++++++----
 .../apache/lucene/facet/TestDrillDownQuery.java    | 22 +++++++++++
 3 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index b3d9b1d..6f799d2 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -123,6 +123,8 @@ API Changes
 
 * LUCENE-9454: Analyzer no longer has a mutable version field. (Alan Woodward)
 
+* LUCENE-9956: Expose the getBaseQuery, getDrillDownQueries APIs from DrillDownQuery (Gautam Worah)
+
 Improvements
 
 * LUCENE-9960: Avoid unnecessary top element replacement for equal elements in PriorityQueue. (Dawid Weiss)
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/DrillDownQuery.java b/lucene/facet/src/java/org/apache/lucene/facet/DrillDownQuery.java
index 5797801..a4d47aa 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/DrillDownQuery.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/DrillDownQuery.java
@@ -18,10 +18,12 @@ package org.apache.lucene.facet;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause.Occur;
@@ -53,6 +55,8 @@ public final class DrillDownQuery extends Query {
   private final Query baseQuery;
   private final List<BooleanQuery.Builder> dimQueries = new ArrayList<>();
   private final Map<String, Integer> drillDownDims = new LinkedHashMap<>();
+  private final List<Query> builtDimQueries = new ArrayList<>();
+  private final Set<Integer> dirtyDimQueryIndex = new HashSet<>();
 
   /** Used by clone() and DrillSideways */
   DrillDownQuery(
@@ -64,6 +68,10 @@ public final class DrillDownQuery extends Query {
     this.dimQueries.addAll(dimQueries);
     this.drillDownDims.putAll(drillDownDims);
     this.config = config;
+    for (int i = 0; i < this.dimQueries.size(); i++) {
+      this.builtDimQueries.add(null);
+      this.dirtyDimQueryIndex.add(i);
+    }
   }
 
   /** Used by DrillSideways */
@@ -76,6 +84,10 @@ public final class DrillDownQuery extends Query {
     this.dimQueries.addAll(other.dimQueries);
     this.drillDownDims.putAll(other.drillDownDims);
     this.config = config;
+    for (int i = 0; i < this.dimQueries.size(); i++) {
+      this.builtDimQueries.add(null);
+      this.dirtyDimQueryIndex.add(i);
+    }
   }
 
   /**
@@ -111,14 +123,17 @@ public final class DrillDownQuery extends Query {
    * on the dimension than the indexed facet ordinals.
    */
   public void add(String dim, Query subQuery) {
+    assert dimQueries.size() == builtDimQueries.size();
     assert drillDownDims.size() == dimQueries.size();
     if (drillDownDims.containsKey(dim) == false) {
       drillDownDims.put(dim, drillDownDims.size());
       BooleanQuery.Builder builder = new BooleanQuery.Builder();
       dimQueries.add(builder);
+      builtDimQueries.add(null);
     }
     final int index = drillDownDims.get(dim);
     dimQueries.get(index).add(subQuery, Occur.SHOULD);
+    dirtyDimQueryIndex.add(index);
   }
 
   @Override
@@ -164,22 +179,35 @@ public final class DrillDownQuery extends Query {
     if (baseQuery != null) {
       bq.add(baseQuery, Occur.MUST);
     }
-    for (BooleanQuery.Builder builder : dimQueries) {
-      bq.add(builder.build(), Occur.FILTER);
+    for (Query query : getDrillDownQueries()) {
+      bq.add(query, Occur.FILTER);
     }
+
     return bq.build();
   }
 
-  Query getBaseQuery() {
+  /**
+   * Returns the internal baseQuery of the DrillDownQuery
+   *
+   * @return The baseQuery used on initialization of DrillDownQuery
+   */
+  public Query getBaseQuery() {
     return baseQuery;
   }
 
-  Query[] getDrillDownQueries() {
-    Query[] dimQueries = new Query[this.dimQueries.size()];
-    for (int i = 0; i < dimQueries.length; ++i) {
-      dimQueries[i] = this.dimQueries.get(i).build();
+  /**
+   * Returns the dimension queries added either via {@link #add(String, Query)} or {@link
+   * #add(String, String...)}
+   *
+   * @return The array of dimQueries
+   */
+  public Query[] getDrillDownQueries() {
+    for (Integer dirtyDimIndex : dirtyDimQueryIndex) {
+      builtDimQueries.set(dirtyDimIndex, this.dimQueries.get(dirtyDimIndex).build());
     }
-    return dimQueries;
+    dirtyDimQueryIndex.clear();
+
+    return builtDimQueries.toArray(new Query[0]);
   }
 
   Map<String, Integer> getDims() {
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
index e69090f..be06ef3 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
@@ -17,6 +17,7 @@
 package org.apache.lucene.facet;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Random;
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.analysis.MockTokenizer;
@@ -529,4 +530,25 @@ public class TestDrillDownQuery extends FacetTestCase {
 
     IOUtils.close(taxoReader, reader, writer, dir, taxoDir);
   }
+
+  public void testGetDrillDownQueries() throws Exception {
+    DrillDownQuery q = new DrillDownQuery(config);
+    q.add("a", "1");
+    q.add("b", "1");
+
+    Query[] drillDownQueries = q.getDrillDownQueries();
+    Query[] drillDownQueriesCopy = q.getDrillDownQueries();
+
+    assert Arrays.equals(drillDownQueries, drillDownQueriesCopy);
+
+    q.add("c", "1");
+    q.add("a", "2");
+    q.add("a", "3");
+    Query[] drillDownQueriesModified = q.getDrillDownQueries();
+    Query[] drillDownQueriesModifiedCopy = q.getDrillDownQueries();
+
+    // the cached builtDimQueries object is now stale
+    assert Arrays.equals(drillDownQueriesModified, drillDownQueriesCopy) == false;
+    assert Arrays.equals(drillDownQueriesModified, drillDownQueriesModifiedCopy);
+  }
 }