Roughed in the date_query facet. Not working yet.

This commit is contained in:
David Sauve 2009-08-07 14:22:40 -04:00
parent 10e1623890
commit 40863f7413
2 changed files with 46 additions and 5 deletions

View File

@ -183,11 +183,16 @@ class XapianSearchBackendTestCase(TestCase):
self.assertEqual(results['hits'], 3)
self.assertEqual(results['facets']['fields']['name'], [('david1', 1), ('david2', 1), ('david3', 1)])
# self.assertEqual(self.sb.search('', date_facets={'pub_date': {'start_date': datetime.date(2008, 2, 26), 'end_date': datetime.date(2008, 2, 26), 'gap': '/MONTH'}}), [])
# results = self.sb.search('Index*', date_facets={'pub_date': {'start_date': datetime.date(2008, 2, 26), 'end_date': datetime.date(2008, 2, 26), 'gap': '/MONTH'}})
# self.assertEqual(results['hits'], 3)
# self.assertEqual(results['facets'], {})
#
def test_date_facets(self):
self.sb.update(self.msi, self.sample_objs)
self.assertEqual(len(self.xapian_search('')), 3)
self.assertEqual(self.sb.search('', date_facets={'pub_date': {'start_date': datetime.date(2008, 2, 26), 'end_date': datetime.date(2008, 2, 26), 'gap': '/MONTH'}}), [])
results = self.sb.search('Index*', date_facets={'pub_date': {'start_date': datetime.date(2008, 2, 26), 'end_date': datetime.date(2008, 2, 26), 'gap': '/MONTH'}})
self.assertEqual(results['hits'], 3)
self.assertEqual(results['facets'], {})
# self.assertEqual(self.sb.search('', query_facets={'name': '[* TO e]'}), [])
# results = self.sb.search('Index*', query_facets={'name': '[* TO e]'})
# self.assertEqual(results['hits'], 3)

View File

@ -330,6 +330,10 @@ class SearchBackend(BaseSearchBackend):
facets_dict['fields'] = self._do_field_facets(
document, facets, facets_dict['fields']
)
if date_facets:
facets_dict['dates'] = self._do_date_facets(
document, schema, date_facets, facets_dict['dates']
)
if highlight and (len(query_string) > 0):
model_data['highlighted'] = {
self.content_field_name: self._do_highlight(
@ -467,6 +471,38 @@ class SearchBackend(BaseSearchBackend):
fields[match.group(1).lower()] = [(match.group(2), term[1])]
return fields
def _do_date_facets(self, document, schema, date_facets, dates):
"""
Private method that facets a document by date ranges
Required arguments:
`document` -- The document to parse
`schema` -- The database schema
`date_facets` -- A dictionary of date fields to facet with
keys for start_date, end_date, and gap:
eg. {'pub_date': 'start_date': datetime.date(2008, 2, 26), 'end_date': datetime.date(2008, 2, 26), 'gap': '/MONTH'}}
`start_date` -- The start date to facet
`end_date` -- The end date to facet
`gap` -- The size of the gap to facet. This is a string in
the format '(year|month|day|hour|minute|second+)s?=?(\d*)'
`dates` -- A list of dates that have already been faceted. This
will be extended with any new dates and counts found
in the `document`.
"""
for date_facet, facet_params in date_facets.iteritems():
if not date_facet in schema.keys():
raise SearchBackendError('The field name [%s] does not exist in the database schema' % date_facet)
match_dict = gap_re.search(facet_params['gap']).groupdict()
gap_type = match_dict['type']
gap_value = match_dict.get('value', 1)
date_value = self._to_date(document.get_value(schema.get(date_facet) + 1))
dates[date_facet] = {
'end': match_date.isoformat(), 'gap': facet_params['gap']
}
return dates
def _marshal_value(self, value):
"""
Private method that converts Python values to a string for Xapian values.