diff --git a/Changelog b/Changelog index 942e6e2..db5884e 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,7 @@ +* 0.7 : unreleased + - Ensure 'more like this' results are transformed using a query's + execute() `constructor`, as are normal query results. (@davidjb) + * 0.6 : 2012-01-01 - Change license to MIT/X11 - Integrate with Django Paginator (thanks @rlskoeser) diff --git a/sunburnt/search.py b/sunburnt/search.py index 70c3940..75de953 100644 --- a/sunburnt/search.py +++ b/sunburnt/search.py @@ -475,7 +475,11 @@ def results_as(self, constructor): def transform_result(self, result, constructor): if constructor is not dict: - result.result.docs = [constructor(**d) for d in result.result.docs] + construct_docs = lambda docs: [constructor(**d) for d in docs] + result.result.docs = construct_docs(result.result.docs) + for key in result.more_like_these: + result.more_like_these[key].docs = \ + construct_docs(result.more_like_these[key].docs) # in future, highlighting chould be made available to # custom constructors; perhaps document additional # arguments result constructors are required to support, or check for diff --git a/sunburnt/test_search.py b/sunburnt/test_search.py index d688c12..a184cdf 100644 --- a/sunburnt/test_search.py +++ b/sunburnt/test_search.py @@ -593,3 +593,71 @@ def check_transform_results(highlighting, constructor, solr_highlights): def test_transform_result(): for highlighting, constructor, solr_highlights in solr_highlights_data: yield check_transform_results, highlighting, constructor, solr_highlights + +#Test More Like This results +class MltMockResponse(MockResponse): + + def extra_response_parts(self): + contents = [] + create_doc = lambda value: E.doc(E.str({'name':'string_field'}, value)) + #Main response result + contents.append( + E.result({'name': 'response'}, + create_doc('zero') + ) + ) + #More like this results + contents.append( + E.lst({'name':'moreLikeThis'}, + E.result({'name': 'zero', 'numFound': '3', 'start': '0'}, + create_doc('one'), + create_doc('two'), + create_doc('three') + ) + ) + ) + return contents + +class MltMockConnection(MockConnection): + def _handle_request(self, uri_obj, params, method, body, headers): + if method == 'GET' and uri_obj.path.endswith('/select/'): + return self.MockStatus(200), MltMockResponse(0, 1).xml_response() + +mlt_interface = SolrInterface("http://test.example.com/", + http_connection=MltMockConnection()) + +class DummyDocument(object): + + def __init__(self, **kw): + self.kw = kw + + def __repr__(self): + return "DummyDocument<%r>" % self.kw + + def get(self, key): + return self.kw.get(key) + +def make_dummydoc(**kwargs): + return DummyDocument(**kwargs) + +solr_mlt_transform_data = ( + (dict, dict), + (DummyDocument, DummyDocument), + (make_dummydoc, DummyDocument), + ) + +def check_mlt_transform_results(constructor, _type): + q = mlt_interface.query('zero') + query = q.mlt(fields='string_field') + response = q.execute(constructor=constructor) + + for doc in response.result.docs: + assert isinstance(doc, _type) + + for key in response.more_like_these: + for doc in response.more_like_these[key].docs: + assert isinstance(doc, _type) + +def test_mlt_transform_result(): + for constructor, _type in solr_mlt_transform_data: + yield check_mlt_transform_results, constructor, _type