From 4fa3e7700394c257ce02ec807d8ab1e3d987df6f Mon Sep 17 00:00:00 2001 From: "@deniszgonjanin" Date: Tue, 2 Jul 2013 12:50:56 -0400 Subject: [PATCH 1/3] expose SOLR range facets in search results --- ckan/controllers/package.py | 1 + ckan/lib/search/query.py | 9 ++++++--- ckan/logic/action/get.py | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ckan/controllers/package.py b/ckan/controllers/package.py index 84f302c7180..de4eafdb749 100644 --- a/ckan/controllers/package.py +++ b/ckan/controllers/package.py @@ -262,6 +262,7 @@ def pager_url(q=None, page=None): ) c.facets = query['facets'] c.search_facets = query['search_facets'] + c.facet_ranges = query['facet_ranges'] c.page.items = query['results'] except SearchError, se: log.error('Dataset search error: %r', se.args) diff --git a/ckan/lib/search/query.py b/ckan/lib/search/query.py index a1c8d9d9580..6794b4fbfda 100644 --- a/ckan/lib/search/query.py +++ b/ckan/lib/search/query.py @@ -15,7 +15,8 @@ VALID_SOLR_PARAMETERS = set([ 'q', 'fl', 'fq', 'rows', 'sort', 'start', 'wt', 'qf', 'bf', 'boost', 'facet', 'facet.mincount', 'facet.limit', 'facet.field', - 'extras', 'fq_list', 'tie', 'defType', 'mm' + 'extras', 'fq_list', 'tie', 'defType', 'mm', + 'facet.range.end', 'facet.range', 'facet.range.gap', 'facet.range.start' ]) # for (solr) package searches, this specifies the fields that are searched @@ -349,8 +350,7 @@ def run(self, query): # http://wiki.apache.org/solr/DisMaxQParserPlugin#mm_.28Minimum_.27Should.27_Match.29 query['mm'] = query.get('mm', '2<-1 5<80%') query['qf'] = query.get('qf', QUERY_FIELDS) - - + conn = make_connection() log.debug('Package query: %r' % query) try: @@ -385,6 +385,9 @@ def run(self, query): self.facets = data.get('facet_counts', {}).get('facet_fields', {}) for field, values in self.facets.iteritems(): self.facets[field] = dict(zip(values[0::2], values[1::2])) + + self.facet_ranges = data.get('facet_counts', {}).get('facet_ranges', {}) + except Exception, e: log.exception(e) raise SearchError(e) diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index 74a3d1fc504..f7c3115d2ff 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -1303,6 +1303,7 @@ def package_search(context, data_dict): count = query.count facets = query.facets + facet_ranges = query.facet_ranges else: count = 0 facets = {} @@ -1311,6 +1312,7 @@ def package_search(context, data_dict): search_results = { 'count': count, 'facets': facets, + 'facet_ranges': facet_ranges, 'results': results, 'sort': data_dict['sort'] } From 19233a5e50cae7e8cbe02e0ad52712861598395c Mon Sep 17 00:00:00 2001 From: "@deniszgonjanin" Date: Tue, 2 Jul 2013 16:31:48 -0400 Subject: [PATCH 2/3] properly parse range facet url parameters into the filter query --- ckan/controllers/package.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ckan/controllers/package.py b/ckan/controllers/package.py index de4eafdb749..0484be53cd0 100644 --- a/ckan/controllers/package.py +++ b/ckan/controllers/package.py @@ -198,7 +198,12 @@ def pager_url(q=None, page=None): and len(value) and not param.startswith('_'): if not param.startswith('ext_'): c.fields.append((param, value)) - fq += ' %s:"%s"' % (param, value) + + #if value starts with [, assume range facet filter query + if value.startswith("["): + fq += ' %s:%s' % (param, value) + else: + fq += ' %s:"%s"' % (param, value) if param not in c.fields_grouped: c.fields_grouped[param] = [value] else: From c51cfea754b446ed28d5544231e0103d037f2076 Mon Sep 17 00:00:00 2001 From: "@deniszgonjanin" Date: Wed, 3 Jul 2013 11:18:23 -0400 Subject: [PATCH 3/3] improper conflict resolution --- ckan/controllers/package.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ckan/controllers/package.py b/ckan/controllers/package.py index 5f85a287f17..cf699fc9679 100644 --- a/ckan/controllers/package.py +++ b/ckan/controllers/package.py @@ -205,7 +205,6 @@ def pager_url(q=None, page=None): else: fq += ' %s:"%s"' % (param, value) fields_grouped.setdefault(param, []).append(value) ->>>>>>> 5ef0435d3cdbc21b76562a8573b130bda7a6d2a3 else: search_extras[param] = value c.fields_grouped = fields_grouped