You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ma...@apache.org on 2022/04/20 16:26:14 UTC
[solr] branch main updated: SOLR-16126: Allow FiltersQParser ({!filters param=[...]}) to tolerate empty param args (#777)
This is an automated email from the ASF dual-hosted git repository.
magibney pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 0e6d01cb571 SOLR-16126: Allow FiltersQParser ({!filters param=[...]}) to tolerate empty param args (#777)
0e6d01cb571 is described below
commit 0e6d01cb5715081529d59abf0d73845861c0176f
Author: Michael Gibney <mi...@michaelgibney.net>
AuthorDate: Wed Apr 20 12:26:09 2022 -0400
SOLR-16126: Allow FiltersQParser ({!filters param=[...]}) to tolerate empty param args (#777)
---
.../apache/solr/search/join/FiltersQParser.java | 4 ++--
.../solr/search/TestFiltersQueryCaching.java | 23 ++++++++++++++++++++++
.../org/apache/solr/search/join/BJQParserTest.java | 13 ++++++++----
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/search/join/FiltersQParser.java b/solr/core/src/java/org/apache/solr/search/join/FiltersQParser.java
index b2653d88080..64e3adef3bc 100644
--- a/solr/core/src/java/org/apache/solr/search/join/FiltersQParser.java
+++ b/solr/core/src/java/org/apache/solr/search/join/FiltersQParser.java
@@ -101,8 +101,8 @@ public class FiltersQParser extends QParser {
for (String filter : params == null ? new String[0] : params) {
if (filter == null || filter.length() == 0) {
- throw new SyntaxError(
- "Filter '" + filter + "' has been picked in " + stringIncludingLocalParams);
+ // it is ok to specify a filter param that is not present
+ continue;
}
// as a side effect, qparser is mapped by tags in req context
QParser parser = subQuery(filter, null);
diff --git a/solr/core/src/test/org/apache/solr/search/TestFiltersQueryCaching.java b/solr/core/src/test/org/apache/solr/search/TestFiltersQueryCaching.java
index cf797fef425..72edc410184 100644
--- a/solr/core/src/test/org/apache/solr/search/TestFiltersQueryCaching.java
+++ b/solr/core/src/test/org/apache/solr/search/TestFiltersQueryCaching.java
@@ -16,6 +16,10 @@
*/
package org.apache.solr.search;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.core.SolrCore;
@@ -194,4 +198,23 @@ public class TestFiltersQueryCaching extends SolrTestCaseJ4 {
assertEquals(3, (long) filterCacheMetrics.get("inserts")); // added top-level
assertEquals(6, (long) filterCacheMetrics.get("hits"));
}
+
+ @Test
+ public void testAbsentParams() throws Exception {
+ // no `fqs` at all
+ doTestAbsentParams(Collections.emptyList(), NUM_DOCS);
+ // simple term query `fqs`
+ doTestAbsentParams(List.of("fqs", "{!term f=field_s v='d0'}"), 1);
+ // empty `fqs`
+ doTestAbsentParams(List.of("fqs", ""), NUM_DOCS);
+ }
+
+ private static void doTestAbsentParams(Collection<String> fqsArgs, int expectNumFound)
+ throws Exception {
+ List<String> request = new ArrayList<>();
+ request.addAll(List.of("q", "*:*", "indent", "true", "fq", "{!filters param=$fqs}"));
+ request.addAll(fqsArgs);
+ assertJQ(
+ req(request.toArray(new String[request.size()])), "/response/numFound==" + expectNumFound);
+ }
}
diff --git a/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java b/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java
index 46077112eec..bde3716177c 100644
--- a/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java
+++ b/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java
@@ -30,7 +30,6 @@ import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.join.ScoreMode;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.metrics.MetricsMap;
import org.apache.solr.metrics.SolrMetricManager;
import org.apache.solr.request.SolrQueryRequest;
@@ -568,12 +567,18 @@ public class BJQParserTest extends SolrTestCaseJ4 {
"child_s:[* TO *]"),
"//*[@numFound='18']");
- assertQEx(
- "expecting exception on weird param",
+ /*
+ The below is admittedly a weird request; but QParser param dereferencing provides no way to
+ distinguish between `{!filters param=}` and `{!filters param=$fqs}` where `fqs` param is
+ absent. Because we want to support the latter case, we must also support the former, even it
+ would arguably make sense to throw a syntax error in the former case.
+ */
+ assertQ(
+ "should support weird absent param spec",
req(
"q", "{!filters v=$gchq param=}\"",
"gchq", "child_s:[* TO *]"),
- ErrorCode.BAD_REQUEST);
+ "//*[@numFound='18']");
assertQ( // omit main query
req(