def testFacetFieldFilter(self): context = Dummy() request = TestRequest(form={'facet.field': 'foo'}) fields = dict(foo={'foo': 2, 'bar': 4, '': 6, 'nil': 0}) # without a filter all values are included info = convertFacets(fields, context, request) self.assertEqual(len(info), 1) self.assertEqual([(c['name'], c['count']) for c in info[0]['counts']], [ ('', 6), ('bar', 4), ('foo', 2), ('nil', 0), ]) # let's filter out zero counts filter = lambda name, count: count > 0 info = convertFacets(fields, context, request, filter=filter) self.assertEqual(len(info), 1) self.assertEqual([(c['name'], c['count']) for c in info[0]['counts']], [ ('', 6), ('bar', 4), ('foo', 2), ]) # and also unnamed facets filter = lambda name, count: name and count > 0 info = convertFacets(fields, context, request, filter=filter) self.assertEqual(len(info), 1) self.assertEqual([(c['name'], c['count']) for c in info[0]['counts']], [ ('bar', 4), ('foo', 2), ])
def testFacetFieldFilter(self): context = Dummy() request = TestRequest(form={"facet.field": "foo"}) fields = dict(foo={"foo": 2, "bar": 4, "": 6, "nil": 0}) # without a filter all values are included view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 1) self.assertEqual( [(c["name"], c["count"]) for c in info[0]["counts"]], [("", 6), ("bar", 4), ("foo", 2), ("nil", 0)], ) # let's filter out zero counts filter = lambda name, count: count > 0 info = convertFacets(fields, view, filter=filter) self.assertEqual(len(info), 1) self.assertEqual( [(c["name"], c["count"]) for c in info[0]["counts"]], [("", 6), ("bar", 4), ("foo", 2)], ) # and also unnamed facets filter = lambda name, count: name and count > 0 info = convertFacets(fields, view, filter=filter) self.assertEqual(len(info), 1) self.assertEqual( [(c["name"], c["count"]) for c in info[0]["counts"]], [("bar", 4), ("foo", 2)], )
def testEmptyFacetField(self): context = Dummy() request = TestRequest(form={"facet.field": "Subject"}) fields = dict(Subject=dict()) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(info, [])
def testConvertFacetResponse(self): response = SolrResponse(getData("facet_xml_response.txt")) fields = response.facet_counts["facet_fields"] view = DummyView(request=TestRequest()) info = convertFacets(fields, view=view) # the info should consist of 2 dicts with # `counts`, `name` and `title` keys self.assertEqual([sorted(i) for i in info], [["counts", "name", "title"]] * 2) # next let's check the field names self.assertEqual([i["title"] for i in info], ["cat", "inStock"]) # and the fields contents cat, inStock = info self.assertEqual(cat["title"], "cat") self.assertEqual( [(c["name"], c["title"], c["count"]) for c in cat["counts"]], [ ("search", "Title of Search", 1), ("software", "Title of Software", 1), ("electronics", "Title of Electronics", 0), ("monitor", "Title of Monitor", 0), ], ) self.assertEqual(inStock["title"], "inStock") self.assertEqual([(c["name"], c["count"]) for c in inStock["counts"]], [("true", 1)])
def testEmptyFacetField(self): context = Dummy() request = TestRequest(form={'facet.field': 'Subject'}) fields = dict(Subject=dict()) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(info, [])
def testFacetLinksWithMultipleFacets(self): context = Dummy() request = TestRequest(form={'facet.field': ['foo', 'bar']}) fields = dict(foo=dict(Document=10, Folder=3, Event=5), bar=dict(private=2, published=4)) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 2) # check the facets for 'bar' bars = info[1]['counts'] self.assertEqual(len(bars), 2) params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(params(bars[0]['query']), [ 'facet.field=foo', 'fq=bar:"published"']) self.assertEqual(params(bars[1]['query']), [ 'facet.field=foo', 'fq=bar:"private"']) # and also the one for 'foo' foos = info[0]['counts'] self.assertEqual(len(foos), 3) self.assertEqual(params(foos[0]['query']), [ 'facet.field=bar', 'fq=foo:"Document"']) self.assertEqual(params(foos[1]['query']), [ 'facet.field=bar', 'fq=foo:"Event"']) self.assertEqual(params(foos[2]['query']), [ 'facet.field=bar', 'fq=foo:"Folder"'])
def testFacetLinksWithMultipleSelectedFacets(self): context = Dummy() request = TestRequest(form={"facet.field": "foo", "fq": "bar:private"}) fields = dict(foo=dict(Document=3, Folder=2)) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 1) counts = info[0]["counts"] params = lambda query: sorted(map(unquote, query.split("&"))) self.assertEqual(params(counts[0]["query"]), ["fq=bar:private", 'fq=foo:"Document"']) self.assertEqual(params(counts[1]["query"]), ["fq=bar:private", 'fq=foo:"Folder"'])
def testFacetFieldFilter(self): context = Dummy() request = TestRequest(form={"facet.field": "foo"}) fields = dict(foo={"foo": 2, "bar": 4, "": 6, "nil": 0}) # without a filter all values are included view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 1) self.assertEqual( [(c["name"], c["count"]) for c in info[0]["counts"]], [("", 6), ("bar", 4), ("foo", 2), ("nil", 0)] ) # let's filter out zero counts filter = lambda name, count: count > 0 info = convertFacets(fields, view, filter=filter) self.assertEqual(len(info), 1) self.assertEqual([(c["name"], c["count"]) for c in info[0]["counts"]], [("", 6), ("bar", 4), ("foo", 2)]) # and also unnamed facets filter = lambda name, count: name and count > 0 info = convertFacets(fields, view, filter=filter) self.assertEqual(len(info), 1) self.assertEqual([(c["name"], c["count"]) for c in info[0]["counts"]], [("bar", 4), ("foo", 2)])
def testFacetLinksWithMultipleSelectedFacets(self): context = Dummy() request = TestRequest(form={'facet.field': 'foo', 'fq': 'bar:private'}) fields = dict(foo=dict(Document=3, Folder=2)) info = convertFacets(fields, context, request) self.assertEqual(len(info), 1) counts = info[0]['counts'] params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(params(counts[0]['query']), ['fq=bar:private', 'fq=foo:"Document"']) self.assertEqual(params(counts[1]['query']), ['fq=bar:private', 'fq=foo:"Folder"'])
def testFacetLinksWithMultipleSelectedFacets(self): context = Dummy() request = TestRequest(form={'facet.field': 'foo', 'fq': 'bar:private'}) fields = dict(foo=dict(Document=3, Folder=2)) info = convertFacets(fields, context, request) self.assertEqual(len(info), 1) counts = info[0]['counts'] params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(params(counts[0]['query']), [ 'fq=bar:private', 'fq=foo:"Document"']) self.assertEqual(params(counts[1]['query']), [ 'fq=bar:private', 'fq=foo:"Folder"'])
def facets(self): """ prepare and return facetting info for the given SolrResponse """ results = self.kw.get('results', None) fcs = getattr(results, 'facet_counts', None) shown_types = self.shown_types if results is not None and fcs is not None: def facet_filter(name, count): return name and name in shown_types and count > 0 return convertFacets(fcs.get('facet_fields', {}), self, facet_filter) else: return None
def testFacetLinksWithSelectedFacet(self): context = Dummy() request = TestRequest(form={"foo": "bar", "facet.field": "bar"}) fields = dict(foo=dict(private=2, published=4)) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 1) counts = info[0]["counts"] self.assertEqual(len(counts), 2) params = lambda query: sorted(map(unquote, query.split("&"))) self.assertEqual(counts[0]["name"], "published") self.assertEqual(params(counts[0]["query"]), ["facet.field=bar", "foo=bar", 'fq=foo:"published"']) self.assertEqual(counts[1]["name"], "private") self.assertEqual(params(counts[1]["query"]), ["facet.field=bar", "foo=bar", 'fq=foo:"private"'])
def testFacetLinksWithSelectedFacet(self): context = Dummy() request = TestRequest(form={'foo': 'bar', 'facet.field': 'bar'}) fields = dict(foo=dict(private=2, published=4)) info = convertFacets(fields, context, request) self.assertEqual(len(info), 1) counts = info[0]['counts'] self.assertEqual(len(counts), 2) params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(counts[0]['name'], 'published') self.assertEqual(params(counts[0]['query']), [ 'facet.field=bar', 'foo=bar', 'fq=foo:"published"']) self.assertEqual(counts[1]['name'], 'private') self.assertEqual(params(counts[1]['query']), [ 'facet.field=bar', 'foo=bar', 'fq=foo:"private"'])
def testFacetLinksWithSelectedFacet(self): context = Dummy() request = TestRequest(form={'foo': 'bar', 'facet.field': 'bar'}) fields = dict(foo=dict(private=2, published=4)) info = convertFacets(fields, context, request) self.assertEqual(len(info), 1) counts = info[0]['counts'] self.assertEqual(len(counts), 2) params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(counts[0]['name'], 'published') self.assertEqual(params(counts[0]['query']), ['facet.field=bar', 'foo=bar', 'fq=foo:"published"']) self.assertEqual(counts[1]['name'], 'private') self.assertEqual(params(counts[1]['query']), ['facet.field=bar', 'foo=bar', 'fq=foo:"private"'])
def testNamedFacetTitleVocabulary(self): """Test use of IFacetTitleVocabularyFactory registrations If a IFacetTitleVocabularyFactory is registered under the same name as the facet field, use that to look up titles """ context = Dummy(facet_fields=['capsFacet']) request = TestRequest(form=dict(foo='bar')) fields = dict(capsFacet=dict(one=10, two=3, leavelowercase=5)) info = convertFacets(fields, context, request) self.assertEqual(len(info), 1) counts = info[0]['counts'] self.assertEqual(len(counts), 3) self.assertEqual(counts[0]['title'], 'ONE') self.assertEqual(counts[1]['title'], 'leavelowercase') self.assertEqual(counts[2]['title'], 'TWO')
def testConvertFacets(self): fields = dict( portal_type=dict(Document=10, Folder=3, Event=5, Topic=2)) info = convertFacets(fields, request=TestRequest()) # the info should consist of 1 dict with `field` and `counts` keys self.assertEqual([sorted(i) for i in info], [['counts', 'title']] * 1) # next let's check the field names self.assertEqual([i['title'] for i in info], ['portal_type']) # and the fields contents types, = info self.assertEqual(types['title'], 'portal_type') self.assertEqual([(c['name'], c['title'], c['count']) for c in types['counts']], [('Document', 'Title of Document', 10), ('Event', 'Title of Event', 5), ('Folder', 'Title of Folder', 3), ('Topic', 'Title of Topic', 2)])
def testFacetLinks(self): context = Dummy(facet_fields=["portal_type"]) request = TestRequest(form=dict(foo="bar")) fields = dict(portal_type=dict(Document=10, Folder=3, Event=5)) view = DummyView(context=context, request=request) info = convertFacets(fields, view) # let's check queries for the one and only facet field self.assertEqual(len(info), 1) counts = info[0]["counts"] self.assertEqual(len(counts), 3) params = lambda query: sorted(map(unquote, query.split("&"))) self.assertEqual(counts[0]["name"], "Document") self.assertEqual(params(counts[0]["query"]), ["foo=bar", 'fq=portal_type:"Document"']) self.assertEqual(counts[1]["name"], "Event") self.assertEqual(params(counts[1]["query"]), ["foo=bar", 'fq=portal_type:"Event"']) self.assertEqual(counts[2]["name"], "Folder") self.assertEqual(params(counts[2]["query"]), ["foo=bar", 'fq=portal_type:"Folder"'])
def testConvertFacets(self): fields = dict(portal_type=dict(Document=10, Folder=3, Event=5, Topic=2)) info = convertFacets(fields, request=TestRequest()) # the info should consist of 1 dict with `field` and `counts` keys self.assertEqual([sorted(i) for i in info], [['counts', 'title']] * 1) # next let's check the field names self.assertEqual([i['title'] for i in info], ['portal_type']) # and the fields contents types, = info self.assertEqual(types['title'], 'portal_type') self.assertEqual( [(c['name'], c['title'], c['count']) for c in types['counts']], [('Document', 'Title of Document', 10), ('Event', 'Title of Event', 5), ('Folder', 'Title of Folder', 3), ('Topic', 'Title of Topic', 2)])
def testNamedFacetTitleVocabulary(self): """Test use of IFacetTitleVocabularyFactory registrations If a IFacetTitleVocabularyFactory is registered under the same name as the facet field, use that to look up titles """ context = Dummy(facet_fields=["capsFacet"]) request = TestRequest(form=dict(foo="bar")) fields = dict(capsFacet=dict(one=10, two=3, leavelowercase=5)) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 1) counts = info[0]["counts"] self.assertEqual(len(counts), 3) self.assertEqual(counts[0]["title"], "ONE") self.assertEqual(counts[1]["title"], "leavelowercase") self.assertEqual(counts[2]["title"], "TWO")
def testFacetLinks(self): context = Dummy(facet_fields=['portal_type']) request = TestRequest(form=dict(foo='bar')) fields = dict(portal_type=dict(Document=10, Folder=3, Event=5)) info = convertFacets(fields, context, request) # let's check queries for the one and only facet field self.assertEqual(len(info), 1) counts = info[0]['counts'] self.assertEqual(len(counts), 3) params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(counts[0]['name'], 'Document') self.assertEqual(params(counts[0]['query']), [ 'foo=bar', 'fq=portal_type:"Document"']) self.assertEqual(counts[1]['name'], 'Event') self.assertEqual(params(counts[1]['query']), [ 'foo=bar', 'fq=portal_type:"Event"']) self.assertEqual(counts[2]['name'], 'Folder') self.assertEqual(params(counts[2]['query']), [ 'foo=bar', 'fq=portal_type:"Folder"'])
def testFacetLinks(self): context = Dummy(facet_fields=['portal_type']) request = TestRequest(form=dict(foo='bar')) fields = dict(portal_type=dict(Document=10, Folder=3, Event=5)) info = convertFacets(fields, context, request) # let's check queries for the one and only facet field self.assertEqual(len(info), 1) counts = info[0]['counts'] self.assertEqual(len(counts), 3) params = lambda query: sorted(map(unquote, query.split('&'))) self.assertEqual(counts[0]['name'], 'Document') self.assertEqual(params(counts[0]['query']), ['foo=bar', 'fq=portal_type:"Document"']) self.assertEqual(counts[1]['name'], 'Event') self.assertEqual(params(counts[1]['query']), ['foo=bar', 'fq=portal_type:"Event"']) self.assertEqual(counts[2]['name'], 'Folder') self.assertEqual(params(counts[2]['query']), ['foo=bar', 'fq=portal_type:"Folder"'])
def testConvertFacetResponse(self): response = SolrResponse(getData('facet_xml_response.txt')) fields = response.facet_counts['facet_fields'] info = convertFacets(fields, request=TestRequest()) # the info should consist of 2 dicts with `field` and `counts` keys self.assertEqual([sorted(i) for i in info], [['counts', 'title']] * 2) # next let's check the field names self.assertEqual([i['title'] for i in info], ['cat', 'inStock']) # and the fields contents cat, inStock = info self.assertEqual(cat['title'], 'cat') self.assertEqual([(c['name'], c['title'], c['count']) for c in cat['counts']], [('search', 'Title of Search', 1), ('software', 'Title of Software', 1), ('electronics', 'Title of Electronics', 0), ('monitor', 'Title of Monitor', 0)]) self.assertEqual(inStock['title'], 'inStock') self.assertEqual([(c['name'], c['count']) for c in inStock['counts']], [('true', 1)])
def testFacetLinksWithSelectedFacet(self): context = Dummy() request = TestRequest(form={"foo": "bar", "facet.field": "bar"}) fields = dict(foo=dict(private=2, published=4)) view = DummyView(context=context, request=request) info = convertFacets(fields, view) self.assertEqual(len(info), 1) counts = info[0]["counts"] self.assertEqual(len(counts), 2) params = lambda query: sorted(map(unquote, query.split("&"))) self.assertEqual(counts[0]["name"], "published") self.assertEqual( params(counts[0]["query"]), ["facet.field=bar", "foo=bar", 'fq=foo:"published"'], ) self.assertEqual(counts[1]["name"], "private") self.assertEqual( params(counts[1]["query"]), ["facet.field=bar", "foo=bar", 'fq=foo:"private"'], )
def testConvertFacets(self): fields = dict(portal_type=dict(Document=10, Folder=3, Event=5, Topic=2)) view = DummyView(context=Dummy(), request=TestRequest()) info = convertFacets(fields, view=view) # the info should consist of 1 dict with # `counts`, `name` and `title` keys self.assertEqual([sorted(i) for i in info], [["counts", "name", "title"]] * 1) # next let's check the field names self.assertEqual([i["title"] for i in info], ["portal_type"]) # and the fields contents types, = info self.assertEqual(types["title"], "portal_type") self.assertEqual( [(c["name"], c["title"], c["count"]) for c in types["counts"]], [ ("Document", "Title of Document", 10), ("Event", "Title of Event", 5), ("Folder", "Title of Folder", 3), ("Topic", "Title of Topic", 2), ], )
def testConvertFacetResponse(self): response = SolrResponse(getData('facet_xml_response.txt')) fields = response.facet_counts['facet_fields'] info = convertFacets(fields, request=TestRequest()) # the info should consist of 2 dicts with `field` and `counts` keys self.assertEqual([sorted(i) for i in info], [['counts', 'title']] * 2) # next let's check the field names self.assertEqual([i['title'] for i in info], ['cat', 'inStock']) # and the fields contents cat, inStock = info self.assertEqual(cat['title'], 'cat') self.assertEqual( [(c['name'], c['title'], c['count']) for c in cat['counts']], [('search', 'Title of Search', 1), ('software', 'Title of Software', 1), ('electronics', 'Title of Electronics', 0), ('monitor', 'Title of Monitor', 0)]) self.assertEqual(inStock['title'], 'inStock') self.assertEqual( [(c['name'], c['count']) for c in inStock['counts']], [('true', 1)])
def testConvertFacets(self): fields = dict( portal_type=dict(Document=10, Folder=3, Event=5, Topic=2)) view = DummyView(context=Dummy(), request=TestRequest()) info = convertFacets(fields, view=view) # the info should consist of 1 dict with # `counts`, `name` and `title` keys self.assertEqual([sorted(i) for i in info], [["counts", "name", "title"]] * 1) # next let's check the field names self.assertEqual([i["title"] for i in info], ["portal_type"]) # and the fields contents (types, ) = info self.assertEqual(types["title"], "portal_type") self.assertEqual( [(c["name"], c["title"], c["count"]) for c in types["counts"]], [ ("Document", "Title of Document", 10), ("Event", "Title of Event", 5), ("Folder", "Title of Folder", 3), ("Topic", "Title of Topic", 2), ], )
def testEmptyFacetField(self): context = Dummy() request = TestRequest(form={'facet.field': 'Subject'}) fields = dict(Subject=dict()) info = convertFacets(fields, context, request) self.assertEqual(info, [])