Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/233.canada.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added the capability for SOLR facet queries via the `facet.query` parameter.
9 changes: 5 additions & 4 deletions ckan/lib/search/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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):
Expand All @@ -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.")
Expand Down Expand Up @@ -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}

Expand Down
2 changes: 2 additions & 0 deletions ckan/logic/action/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -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']
}
Expand Down
1 change: 1 addition & 0 deletions ckan/views/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading