diff --git a/changes/233.canada.feature b/changes/233.canada.feature new file mode 100644 index 00000000000..7e5c53edc6d --- /dev/null +++ b/changes/233.canada.feature @@ -0,0 +1 @@ +Added the capability for SOLR facet queries via the `facet.query` parameter. diff --git a/ckan/lib/search/query.py b/ckan/lib/search/query.py index 8a2cb4ed30e..7d434535269 100644 --- a/ckan/lib/search/query.py +++ b/ckan/lib/search/query.py @@ -31,7 +31,8 @@ 'q', 'fl', 'fq', 'rows', 'sort', 'start', 'wt', 'qf', 'bf', 'boost', 'facet', 'facet.mincount', 'facet.limit', 'facet.field', 'extras', 'fq_list', 'tie', 'defType', 'mm', 'df', - 'facet.range.end', 'facet.range', 'facet.range.gap', 'facet.range.start' # (canada fork only): add facet ranges + 'facet.range.end', 'facet.range', 'facet.range.gap', 'facet.range.start', # (canada fork only): add facet ranges + 'facet.query', # (canada fork only): add facet queries ]) # for (solr) package searches, this specifies the fields that are searched @@ -121,7 +122,6 @@ def _get_local_query_parser(q: str) -> str: q = q.strip() if not q.startswith("{!"): return qp_type - try: local_params = q[:q.rindex("}") + 1] parts = _parse_local_params(local_params) @@ -450,7 +450,7 @@ def run(self, def _check_query_parser(param: str, value: Any): if isinstance(value, str) and value.strip().startswith("{!"): if not _get_local_query_parser(value) in config["ckan.search.solr_allowed_query_parsers"]: - raise SearchError(f"Local parameters are not supported in param '{param}'.") + raise SearchError(f"Local parameters are not supported in param '{param}'.") for param in query.keys(): if isinstance(query[param], str): @@ -475,7 +475,7 @@ def _check_query_parser(param: str, value: Any): 'Unknown sort order' in e.args[0]: raise SearchQueryError('Invalid "sort" parameter') - if ("Failed to connect to server" in e.args[0] or + if ("Failed to connect to server" in e.args[0] or "Connection to server" in e.args[0]): log.warning("Connection Error: Failed to connect to Solr server.") raise SolrConnectionError("Solr returned an error while searching.") @@ -509,6 +509,7 @@ def _check_query_parser(param: str, value: Any): self.facets[field] = dict(zip(values[0::2], values[1::2])) self.facet_ranges = solr_response.facets.get('facet_ranges', {}) # (canada fork only): add facet ranges + self.facet_queries = solr_response.facets.get('facet_queries', {}) # (canada fork only): add facet queries return {'results': self.results, 'count': self.count} diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index a6acb2cd030..e96e890b049 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -2037,11 +2037,13 @@ def package_search(context: Context, data_dict: DataDict) -> ActionResult.Packag count = query.count facets = query.facets facet_ranges = query.facet_ranges # (canada fork only): add facet ranges + facet_queries = query.facet_queries # (canada fork only): add facet queries search_results: dict[str, Any] = { 'count': count, 'facets': facets, 'facet_ranges': facet_ranges, # (canada fork only): add facet ranges + 'facet_queries': facet_queries, # (canada fork only): add facet queries 'results': results, 'sort': data_dict['sort'] } diff --git a/ckan/views/dataset.py b/ckan/views/dataset.py index 6d9f30b31ce..6fd473e4895 100644 --- a/ckan/views/dataset.py +++ b/ckan/views/dataset.py @@ -340,6 +340,7 @@ def search(package_type: str) -> str: ) extra_vars[u'search_facets'] = query[u'search_facets'] extra_vars[u'facet_ranges'] = query[u'facet_ranges'] # (canada fork only): add facet ranges + extra_vars['facet_queries'] = query['facet_queries'] # (canada fork only): add facet queries extra_vars[u'page'].items = query[u'results'] except SearchQueryError as se: # User's search parameters are invalid, in such a way that is not