You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ho...@apache.org on 2024/01/30 21:00:36 UTC

(solr) 03/05: Switch localparam name: fq -> preFilter

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

hossman pushed a commit to branch jira/SOLR-16858
in repository https://gitbox.apache.org/repos/asf/solr.git

commit b22740f7797e067dadad406e38865c3e04ebfcbe
Author: Chris Hostetter <ho...@apache.org>
AuthorDate: Mon Jan 29 15:24:34 2024 -0700

    Switch localparam name: fq -> preFilter
---
 .../org/apache/solr/search/neural/KnnQParser.java  | 29 ++++++------
 .../org/apache/solr/search/QueryEqualityTest.java  | 20 ++++----
 .../apache/solr/search/neural/KnnQParserTest.java  | 55 +++++++++++++---------
 3 files changed, 57 insertions(+), 47 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java b/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java
index 5599fd8dbe2..252a4fcabc7 100644
--- a/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java
+++ b/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java
@@ -22,7 +22,6 @@ import java.util.Collections;
 import java.util.List;
 import org.apache.lucene.search.Query;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.request.SolrQueryRequest;
@@ -36,6 +35,7 @@ import org.apache.solr.search.SyntaxError;
 
 public class KnnQParser extends QParser {
 
+  static final String PRE_FILTER = "preFilter";
   static final String EXCLUDE_TAGS = "excludeTags";
   static final String INCLUDE_TAGS = "includeTags";
 
@@ -123,19 +123,20 @@ public class KnnQParser extends QParser {
       }
     }
 
-    // Explicit fq local params specifying the filter(s) to wrap
-    final String[] localFQs = getLocalParams().getParams(CommonParams.FQ);
-    if (null != localFQs) {
+    // Explicit local params specifying the filter(s) to wrap
+    final String[] preFilters = getLocalParams().getParams(PRE_FILTER);
+    if (null != preFilters) {
 
-      // We don't particularly care if localFQs is empty, the usage below will still work,
+      // We don't particularly care if preFilters is empty, the usage below will still work,
       // but SolrParams API says it should be null not empty...
-      assert 0 != localFQs.length : "SolrParams.getParams should return null, never zero len array";
+      assert 0 != preFilters.length
+          : "SolrParams.getParams should return null, never zero len array";
 
       if (haveGlobalFQTags) {
         throw new SolrException(
             SolrException.ErrorCode.BAD_REQUEST,
             "Knn Query Parser does not support combining "
-                + CommonParams.FQ
+                + PRE_FILTER
                 + " localparam with either "
                 + INCLUDE_TAGS
                 + " or "
@@ -143,25 +144,25 @@ public class KnnQParser extends QParser {
                 + " localparams");
       }
 
-      final List<Query> localParamFilters = new ArrayList<>(localFQs.length);
-      for (String fq : localFQs) {
-        final QParser parser = subQuery(fq, null);
+      final List<Query> preFilterQueries = new ArrayList<>(preFilters.length);
+      for (String f : preFilters) {
+        final QParser parser = subQuery(f, null);
         parser.setIsFilter(true);
 
-        // maybe null, ie: `fq=""`
+        // maybe null, ie: `preFilter=""`
         final Query filter = parser.getQuery();
         if (null != filter) {
-          localParamFilters.add(filter);
+          preFilterQueries.add(filter);
         }
       }
       try {
-        return req.getSearcher().getProcessedFilter(localParamFilters).filter;
+        return req.getSearcher().getProcessedFilter(preFilterQueries).filter;
       } catch (IOException e) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
       }
     }
 
-    // No explicit `fq` localparams specifying what we should filter on.
+    // No explicit `preFilter` localparams specifying what we should filter on.
     //
     // So now, if we're either a filter or a subquery, we have to default to
     // not wrapping anything...
diff --git a/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java b/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
index a72de3efd72..034da7f92ec 100644
--- a/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
+++ b/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
@@ -1358,40 +1358,40 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
               "knn",
               req0,
               "{!knn f=vector}" + qvec,
-              "{!knn f=vector fq=''}" + qvec,
+              "{!knn f=vector preFilter=''}" + qvec,
               "{!knn f=vector v=" + qvec + "}");
 
       try (SolrQueryRequest req1 = req("fq", "{!tag=t1}id:1", "xxx", "id:1")) {
-        // either global fq, or (same) fq as localparam
+        // either global fq, or (same) preFilter as localparam
         final Query fqOne =
             assertQueryEqualsAndReturn(
                 "knn",
                 req1,
                 "{!knn f=vector}" + qvec,
                 "{!knn f=vector includeTags=t1}" + qvec,
-                "{!knn f=vector fq='id:1'}" + qvec,
-                "{!knn f=vector fq=$xxx}" + qvec,
+                "{!knn f=vector preFilter='id:1'}" + qvec,
+                "{!knn f=vector preFilter=$xxx}" + qvec,
                 "{!knn f=vector v=" + qvec + "}");
         QueryUtils.checkUnequal(fqNull, fqOne);
 
         try (SolrQueryRequest req2 = req("fq", "{!tag=t2}id:2", "xxx", "id:1", "yyy", "")) {
-          // override global fq with local param to use different filter
+          // override global fq with local param to use different preFilter
           final Query fqOneOverride =
               assertQueryEqualsAndReturn(
                   "knn",
                   req2,
-                  "{!knn f=vector fq='id:1'}" + qvec,
-                  "{!knn f=vector fq=$xxx}" + qvec);
+                  "{!knn f=vector preFilter='id:1'}" + qvec,
+                  "{!knn f=vector preFilter=$xxx}" + qvec);
           QueryUtils.checkEqual(fqOne, fqOneOverride);
 
-          // override global fq with local param to use no filters
+          // override global fq with local param to use no preFilters
           final Query fqNullOverride =
               assertQueryEqualsAndReturn(
                   "knn",
                   req2,
-                  "{!knn f=vector fq=''}" + qvec,
+                  "{!knn f=vector preFilter=''}" + qvec,
                   "{!knn f=vector excludeTags=t2}" + qvec,
-                  "{!knn f=vector fq=$yyy}" + qvec);
+                  "{!knn f=vector preFilter=$yyy}" + qvec);
           QueryUtils.checkEqual(fqNull, fqNullOverride);
         }
       }
diff --git a/solr/core/src/test/org/apache/solr/search/neural/KnnQParserTest.java b/solr/core/src/test/org/apache/solr/search/neural/KnnQParserTest.java
index 197540b2c7b..12dd843b05d 100644
--- a/solr/core/src/test/org/apache/solr/search/neural/KnnQParserTest.java
+++ b/solr/core/src/test/org/apache/solr/search/neural/KnnQParserTest.java
@@ -470,13 +470,13 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
         "//result[@numFound='1']",
         "//result/doc[1]/str[@name='id'][.='4']");
 
-    // topK=4 w/localparam fq -> 1,4,7,9
+    // topK=4 w/localparam preFilter -> 1,4,7,9
     assertQ(
         req(
             CommonParams.Q,
             "id:(3 4 9 2)",
             "fq",
-            "{!knn f=vector topK=4 fq='id:(1 4 7 8 9)'}" + vectorToSearch,
+            "{!knn f=vector topK=4 preFilter='id:(1 4 7 8 9)'}" + vectorToSearch,
             "fq",
             "id:(4 20 9)",
             "fl",
@@ -519,10 +519,10 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
         "//result/doc[3]/str[@name='id'][.='3']",
         "//result/doc[4]/str[@name='id'][.='8']");
 
-    // knn subquery should still accept `fq` local param
+    // knn subquery should still accept `preFilter` local param
     // filt -> topK -> 4,2,3,7,9
     assertQ(
-        req(common, "q", "*:* AND {!knn f=vector topK=5 fq='" + filt + "' v=$vec}"),
+        req(common, "q", "*:* AND {!knn f=vector topK=5 preFilter='" + filt + "' v=$vec}"),
         "//result[@numFound='5']",
         "//result/doc[1]/str[@name='id'][.='4']",
         "//result/doc[2]/str[@name='id'][.='2']",
@@ -530,7 +530,8 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
         "//result/doc[4]/str[@name='id'][.='7']",
         "//result/doc[5]/str[@name='id'][.='9']");
 
-    // knn subquery should still accept `fq` local param, and not pre-filter on any global fq params
+    // knn subquery should still accept `preFilter` local param, and not pre-filter on any global fq
+    // params
     // filt -> topK -> 4,2,3,7,9 -> fq -> 3,9
     assertQ(
         req(
@@ -538,7 +539,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
             "fq",
             "id:(1 9 20 3 5 6 8)",
             "q",
-            "*:* AND {!knn f=vector topK=5 fq='" + filt + "' v=$vec}"),
+            "*:* AND {!knn f=vector topK=5 preFilter='" + filt + "' v=$vec}"),
         "//result[@numFound='2']",
         "//result/doc[1]/str[@name='id'][.='3']",
         "//result/doc[2]/str[@name='id'][.='9']");
@@ -549,7 +550,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
             "fq",
             "id:(1 9 20 3 5 6 8)",
             "q",
-            "id:8^=100 OR {!knn f=vector topK=5 fq='" + filt + "' v=$vec}"),
+            "id:8^=100 OR {!knn f=vector topK=5 preFilter='" + filt + "' v=$vec}"),
         "//result[@numFound='3']",
         "//result/doc[1]/str[@name='id'][.='8']",
         "//result/doc[2]/str[@name='id'][.='3']",
@@ -577,11 +578,14 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
       for (SolrQueryRequest req :
           Arrays.asList(
               req(common, "q", "{!knn f=vector topK=10}" + vectorToSearch, "fq", filt),
-              req(common, "q", "{!knn f=vector fq=\"" + filt + "\" topK=10}" + vectorToSearch),
               req(
                   common,
                   "q",
-                  "{!knn f=vector fq=$my_filt topK=10}" + vectorToSearch,
+                  "{!knn f=vector preFilter=\"" + filt + "\" topK=10}" + vectorToSearch),
+              req(
+                  common,
+                  "q",
+                  "{!knn f=vector preFilter=$my_filt topK=10}" + vectorToSearch,
                   "my_filt",
                   filt))) {
         assertQ(
@@ -602,11 +606,16 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
               req(
                   common,
                   "q",
-                  "{!knn f=vector fq=\"" + fx + "\" fq=\"" + fy + "\" topK=4}" + vectorToSearch),
+                  "{!knn f=vector preFilter=\""
+                      + fx
+                      + "\" preFilter=\""
+                      + fy
+                      + "\" topK=4}"
+                      + vectorToSearch),
               req(
                   common,
                   "q",
-                  "{!knn f=vector fq=$fx fq=$fy topK=4}" + vectorToSearch,
+                  "{!knn f=vector preFilter=$fx preFilter=$fy topK=4}" + vectorToSearch,
                   "fx",
                   fx,
                   "fy",
@@ -614,7 +623,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
               req(
                   common,
                   "q",
-                  "{!knn f=vector fq=$multi_filt topK=4}" + vectorToSearch,
+                  "{!knn f=vector preFilter=$multi_filt topK=4}" + vectorToSearch,
                   "multi_filt",
                   fx,
                   "multi_filt",
@@ -630,16 +639,16 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
     }
 
     assertQEx(
-        "knn fq localparm incompatible with include/exclude localparams",
-        "does not support combining fq localparam with either",
+        "knn preFilter localparm incompatible with include/exclude localparams",
+        "does not support combining preFilter localparam with either",
         // shouldn't matter if global fq w/tag even exists, usage is an error
-        req("q", "{!knn f=vector fq='id:1' includeTags=xxx}" + vectorToSearch),
+        req("q", "{!knn f=vector preFilter='id:1' includeTags=xxx}" + vectorToSearch),
         SolrException.ErrorCode.BAD_REQUEST);
     assertQEx(
-        "knn fq localparm incompatible with include/exclude localparams",
-        "does not support combining fq localparam with either",
+        "knn preFilter localparm incompatible with include/exclude localparams",
+        "does not support combining preFilter localparam with either",
         // shouldn't matter if global fq w/tag even exists, usage is an error
-        req("q", "{!knn f=vector fq='id:1' excludeTags=xxx}" + vectorToSearch),
+        req("q", "{!knn f=vector preFilter='id:1' excludeTags=xxx}" + vectorToSearch),
         SolrException.ErrorCode.BAD_REQUEST);
   }
 
@@ -647,10 +656,10 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
   public void knnQueryWithFilterQuery_localParamOverridesGlobalFilters() {
     final String vectorToSearch = "[1.0, 2.0, 3.0, 4.0]";
 
-    // trivial case: empty fq localparam means no pre-filtering
+    // trivial case: empty preFilter localparam means no pre-filtering
     assertQ(
         req(
-            "q", "{!knn f=vector fq='' topK=5}" + vectorToSearch,
+            "q", "{!knn f=vector preFilter='' topK=5}" + vectorToSearch,
             "fq", "-id:4",
             "fl", "id"),
         "//result[@numFound='4']",
@@ -662,7 +671,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
     // localparam prefiltering, global fqs applied independently
     assertQ(
         req(
-            "q", "{!knn f=vector fq='id:(3 4 9 2 7 8)' topK=5}" + vectorToSearch,
+            "q", "{!knn f=vector preFilter='id:(3 4 9 2 7 8)' topK=5}" + vectorToSearch,
             "fq", "-id:4",
             "fl", "id"),
         "//result[@numFound='4']",
@@ -715,8 +724,8 @@ public class KnnQParserTest extends SolrTestCaseJ4 {
     // Only 7 matches both of the the regular fq params
     for (SolrQueryRequest req :
         Arrays.asList(
-            // explicit local empty fq
-            req(common, "q", "{!knn f=vector fq='' topK=6}" + vectorToSearch),
+            // explicit local empty preFilter
+            req(common, "q", "{!knn f=vector preFilter='' topK=6}" + vectorToSearch),
             // diff ways of explicitly including none of the global fq params
             req(common, "q", "{!knn f=vector includeTags='' topK=6}" + vectorToSearch),
             req(common, "q", "{!knn f=vector includeTags=bogus topK=6}" + vectorToSearch),