def test_search(self): s = SolrSearcher('http://example.com:8180/solr') with patch.object(s.solrs_read[0], '_send_request'): s.solrs_read[0]._send_request.return_value = '''{ "grouped":{ "company":{ "matches":0, "ngroups":0, "groups":[{ "groupValue":"1", "doclist":{"numFound":9,"start":0,"docs":[ { "id":"111", "name":"Test 1", "company":"1"}, { "id":"222", "name":"Test 2", "company":"1"}, { "id":"333", "name":"Test 3", "company":"1"}] }}, { "groupValue":"3", "doclist":{"numFound":1,"start":0,"docs":[ { "id":"555", "name":"Test 5", "company":"3"}] }}]}}, "facet_counts":{ "facet_queries":{ "{!ex=price cache=false}price:[* TO 100]":0}, "facet_fields":{ "category":[ "1",5, "2",2], "tag":[ "100",10, "200",20, "1000",30]}, "facet_dates":{}, "facet_ranges":{}}, "stats":{ "stats_fields":{ "price":{ "min":3.5, "max":892.0, "count":1882931, "missing":556686, "sum":5.677964302447648E13, "sumOfSquares":2.452218850256837E26, "mean":3.0154924967763808E7, "stddev":1.1411980204045008E10}}}}''' def category_mapper(ids): return dict((id, {'id': int(id), 'name': id}) for id in ids) q = s.search() q = q.facet_field('category', mincount=5, limit=10, _local_params={'ex': 'category'}, _instance_mapper=category_mapper) q = q.facet_field('tag', _local_params={'ex': 'tag'}) q = q.facet_query(price__lte=100, _local_params=[('ex', 'price'), ('cache', 'false')]) q = q.group('company', limit=3) q = q.filter(category=13, _local_params={'tag': 'category'}) q = q.stats('price') q = q.order_by('-date_created') q = q.offset(48).limit(24) raw_query = str(q) ## Usecases for using facet values with object mapping # # 1 # for fv in q.results.get_facet_field('category').values: # print fv.instance, fv.count # # 2 # tag_facet = q.results.get_facet_field('tag') # tags = db.session.query(Tag).filter(Tag.id.in_(tag_facet.values)).all() # tags_map = dict((str(t.id), t) for t in tags) # for fv in tag_facet.values: # tag = tags_map.get(fv.value) # print tag, fv.count # # 2.5 # def iter_tag_counts(tag_facet): # ids = [tag_id for tag_id, count in tag_facet.counts] # tags = db.session.query(Tag).filter(Tag.id.in_(tag_facet.values)) # tags_map = dict((str(t.id), t) for t in tags) # for tag_id, count in tag_facet.counts: # yield tags_map[tag_id], count # tag_counts = iter_tag_counts(tag_facet) # for tag, count in tag_counts: # print tag, count self.assertTrue('facet=true' in raw_query) self.assertTrue('facet.field=%s' % quote_plus('{!ex=category}category') in raw_query) self.assertTrue('f.category.facet.mincount=5' in raw_query) self.assertTrue('f.category.facet.limit=10' in raw_query) self.assertTrue('facet.field=%s' % quote_plus('{!ex=tag}tag') in raw_query) self.assertTrue('facet.query=%s' % quote_plus('{!ex=price cache=false}price:[* TO 100]') in raw_query) self.assertTrue('group=true' in raw_query) self.assertTrue('group.limit=3' in raw_query) self.assertTrue('group.field=company' in raw_query) self.assertTrue('fq=%s' % quote_plus('{!tag=category}category:13') in raw_query) self.assertTrue('stats=true' in raw_query) self.assertTrue('stats.field=price' in raw_query) self.assertTrue('sort=date_created+desc' in raw_query) self.assertTrue('start=48' in raw_query) self.assertTrue('rows=24' in raw_query) r = q.results self.assertEqual(len(r.docs), 2) self.assertEqual(r.docs[0].id, '111') self.assertEqual(r.docs[0].name, 'Test 1') self.assertEqual(r.docs[0].grouped_count, 8) self.assertEqual(r.docs[0].grouped_docs[-1].id, '333') self.assertEqual(r.docs[0].grouped_docs[-1].name, 'Test 3') self.assertEqual(r.docs[1].id, '555') self.assertEqual(r.docs[1].name, 'Test 5') self.assertEqual(len(r.docs[0].grouped_docs), 2) self.assertEqual(len(r.facet_fields), 2) category_facet = r.get_facet_field('category') self.assertEqual(len(category_facet.values), 2) self.assertEqual(category_facet.values[0].value, '1') self.assertEqual(category_facet.values[0].count, 5) self.assertEqual(category_facet.values[0].instance, {'id': 1, 'name': '1'}) self.assertEqual(category_facet.values[1].value, '2') self.assertEqual(category_facet.values[1].count, 2) self.assertEqual(category_facet.values[1].instance, {'id': 2, 'name': '2'}) tag_facet = r.get_facet_field('tag') self.assertEqual(len(tag_facet.values), 3) self.assertEqual(tag_facet.values[-1].value, '1000') self.assertEqual(tag_facet.values[-1].count, 30) self.assertEqual(len(r.facet_queries), 1) price_stats = r.get_stats_field('price') self.assertEqual(len(r.stats_fields), 1) self.assertEqual(price_stats.min, 3.5) self.assertEqual(price_stats.max, 892.0) self.assertEqual(price_stats.count, 1882931) self.assertEqual(price_stats.missing, 556686)
def test_queryfilter(self): s = SolrSearcher('http://example.com:8180/solr') with patch.object(s.solrs_read[0], '_send_request'): s.solrs_read[0]._send_request.return_value = '''{ "grouped":{ "company":{ "matches":0, "ngroups":0, "groups":[]}}, "facet_counts":{ "facet_queries":{ "date_created__today":28, "date_created__week_ago":105}, "facet_fields":{ "category":[ "100",500, "5",10, "2",5, "1",2, "13",1]}, "facet_dates":{}, "facet_ranges":{}}}''' q = s.search() qf = QueryFilter() qf.add_filter( CategoryFilter( 'category', mincount=1, _local_params={'cache': 'false'})) qf.add_filter( FacetQueryFilter( 'date_created', FacetQueryFilterValue( 'today', date_created__gte='NOW/DAY-1DAY'), FacetQueryFilterValue( 'week_ago', date_created__gte='NOW/DAY-7DAY'))) qf.add_filter(RangeFilter('price')) params = { 'category': ['5', '13'], 'date_created': ['today'], 'price__gte': ['100'], 'price__lte': ['200'], } q = qf.apply(q, params) raw_query = str(q) self.assertTrue('facet=true' in raw_query) self.assertTrue('facet.field=%s' % quote_plus('{!ex=category cache=false}category') in raw_query) self.assertTrue('facet.query=%s' % quote_plus('{!ex=date_created key=date_created__today}date_created:[NOW/DAY-1DAY TO *]') in raw_query) self.assertTrue('facet.query=%s' % quote_plus('{!ex=date_created key=date_created__week_ago}date_created:[NOW/DAY-7DAY TO *]') in raw_query) # self.assertTrue('stats=true' in raw_query) # self.assertTrue('stats.field=price' in raw_query) self.assertTrue('fq=%s' % quote_plus('{!tag=category}(category:5 OR category:13)') in raw_query) self.assertTrue('fq=%s' % quote_plus('{!tag=date_created}date_created:[NOW/DAY-1DAY TO *]') in raw_query) self.assertTrue('fq=%s' % quote_plus('{!tag=price}price:[100 TO *] AND price:[* TO 200]') in raw_query) results = q.results with patch.object(s.solrs_read[0], '_send_request'): s.solrs_read[0]._send_request.return_value = '''{ "response":{"numFound":800,"start":0,"docs":[] }, "stats":{ "stats_fields":{ "price":{ "min":3.5, "max":892.0, "count":1882931, "missing":556686, "sum":5.677964302447648E13, "sumOfSquares":2.452218850256837E26, "mean":3.0154924967763808E7, "stddev":1.1411980204045008E10}}}}''' qf.process_results(results) category_filter = qf.get_filter('category') self.assertTrue(isinstance(category_filter, CategoryFilter)) self.assertEqual(category_filter.name, 'category') self.assertEqual(category_filter.all_values[0].value, '100') self.assertEqual(category_filter.all_values[0].count, 500) self.assertEqual(category_filter.all_values[0].selected, False) self.assertEqual(category_filter.all_values[1].value, '5') self.assertEqual(category_filter.all_values[1].count, 10) self.assertEqual(category_filter.all_values[1].selected, True) self.assertEqual(category_filter.all_values[2].value, '2') self.assertEqual(category_filter.all_values[2].count, 5) self.assertEqual(category_filter.all_values[2].selected, False) self.assertEqual(category_filter.all_values[3].value, '1') self.assertEqual(category_filter.all_values[3].count, 2) self.assertEqual(category_filter.all_values[3].selected, False) self.assertEqual(category_filter.all_values[4].value, '13') self.assertEqual(category_filter.all_values[4].count, 1) self.assertEqual(category_filter.all_values[4].selected, True) price_filter = qf.get_filter('price') self.assertEqual(price_filter.from_value, '100') self.assertEqual(price_filter.to_value, '200') self.assertEqual(price_filter.min, 3.5) self.assertEqual(price_filter.max, 892.0) date_created_filter = qf.get_filter('date_created') self.assertEqual(date_created_filter.get_value('today').count, 28) self.assertEqual(date_created_filter.get_value('today').selected, True) self.assertEqual(date_created_filter.get_value('week_ago').count, 105)
def test_queryfilter(self): s = SolrSearcher('http://example.com:8180/solr') with patch.object(s.solrs_read[0], '_send_request'): s.solrs_read[0]._send_request.return_value = '''{ "grouped":{ "company":{ "matches":0, "ngroups":0, "groups":[]}}, "facet_counts":{ "facet_queries":{ "date_created__today":28, "date_created__week_ago":105}, "facet_fields":{ "category":[ "100",500, "5",10, "2",5, "1",2, "13",1]}, "facet_dates":{}, "facet_ranges":{}}}''' q = s.search() qf = QueryFilter() qf.add_filter( CategoryFilter('category', mincount=1, _local_params={'cache': 'false'})) qf.add_filter( FacetQueryFilter( 'date_created', FacetQueryFilterValue('today', date_created__gte='NOW/DAY-1DAY'), FacetQueryFilterValue('week_ago', date_created__gte='NOW/DAY-7DAY'))) qf.add_filter(RangeFilter('price')) params = { 'category': ['5', '13'], 'date_created': ['today'], 'price__gte': ['100'], 'price__lte': ['200'], } q = qf.apply(q, params) raw_query = str(q) self.assertTrue('facet=true' in raw_query) self.assertTrue( 'facet.field=%s' % quote_plus('{!ex=category cache=false}category') in raw_query) self.assertTrue('facet.query=%s' % quote_plus( '{!ex=date_created key=date_created__today}date_created:[NOW/DAY-1DAY TO *]' ) in raw_query) self.assertTrue('facet.query=%s' % quote_plus( '{!ex=date_created key=date_created__week_ago}date_created:[NOW/DAY-7DAY TO *]' ) in raw_query) # self.assertTrue('stats=true' in raw_query) # self.assertTrue('stats.field=price' in raw_query) self.assertTrue( 'fq=%s' % quote_plus('{!tag=category}(category:5 OR category:13)') in raw_query) self.assertTrue('fq=%s' % quote_plus( '{!tag=date_created}date_created:[NOW/DAY-1DAY TO *]') in raw_query) self.assertTrue( 'fq=%s' % quote_plus('{!tag=price}price:[100 TO *] AND price:[* TO 200]') in raw_query) results = q.results with patch.object(s.solrs_read[0], '_send_request'): s.solrs_read[0]._send_request.return_value = '''{ "response":{"numFound":800,"start":0,"docs":[] }, "stats":{ "stats_fields":{ "price":{ "min":3.5, "max":892.0, "count":1882931, "missing":556686, "sum":5.677964302447648E13, "sumOfSquares":2.452218850256837E26, "mean":3.0154924967763808E7, "stddev":1.1411980204045008E10}}}}''' qf.process_results(results) category_filter = qf.get_filter('category') self.assertTrue(isinstance(category_filter, CategoryFilter)) self.assertEqual(category_filter.name, 'category') self.assertEqual(category_filter.all_values[0].value, '100') self.assertEqual(category_filter.all_values[0].count, 500) self.assertEqual(category_filter.all_values[0].selected, False) self.assertEqual(category_filter.all_values[1].value, '5') self.assertEqual(category_filter.all_values[1].count, 10) self.assertEqual(category_filter.all_values[1].selected, True) self.assertEqual(category_filter.all_values[2].value, '2') self.assertEqual(category_filter.all_values[2].count, 5) self.assertEqual(category_filter.all_values[2].selected, False) self.assertEqual(category_filter.all_values[3].value, '1') self.assertEqual(category_filter.all_values[3].count, 2) self.assertEqual(category_filter.all_values[3].selected, False) self.assertEqual(category_filter.all_values[4].value, '13') self.assertEqual(category_filter.all_values[4].count, 1) self.assertEqual(category_filter.all_values[4].selected, True) price_filter = qf.get_filter('price') self.assertEqual(price_filter.from_value, '100') self.assertEqual(price_filter.to_value, '200') self.assertEqual(price_filter.min, 3.5) self.assertEqual(price_filter.max, 892.0) date_created_filter = qf.get_filter('date_created') self.assertEqual( date_created_filter.get_value('today').count, 28) self.assertEqual( date_created_filter.get_value('today').selected, True) self.assertEqual( date_created_filter.get_value('week_ago').count, 105)
def test_search(self): s = SolrSearcher('http://example.com:8180/solr') with patch.object(s.solrs_read[0], '_send_request'): s.solrs_read[0]._send_request.return_value = '''{ "grouped":{ "company":{ "matches":0, "ngroups":0, "groups":[{ "groupValue":"1", "doclist":{"numFound":9,"start":0,"docs":[ { "id":"111", "name":"Test 1", "company":"1"}, { "id":"222", "name":"Test 2", "company":"1"}, { "id":"333", "name":"Test 3", "company":"1"}] }}, { "groupValue":"3", "doclist":{"numFound":1,"start":0,"docs":[ { "id":"555", "name":"Test 5", "company":"3"}] }}]}}, "facet_counts":{ "facet_queries":{ "{!ex=price cache=false}price:[* TO 100]":0}, "facet_fields":{ "category":[ "1",5, "2",2], "tag":[ "100",10, "200",20, "1000",30]}, "facet_dates":{}, "facet_ranges":{}}, "stats":{ "stats_fields":{ "price":{ "min":3.5, "max":892.0, "count":1882931, "missing":556686, "sum":5.677964302447648E13, "sumOfSquares":2.452218850256837E26, "mean":3.0154924967763808E7, "stddev":1.1411980204045008E10}}}}''' def category_mapper(ids): return dict((id, {'id': int(id), 'name': id}) for id in ids) q = s.search() q = q.facet_field('category', mincount=5, limit=10, _local_params={'ex': 'category'}, _instance_mapper=category_mapper) q = q.facet_field('tag', _local_params={'ex': 'tag'}) q = q.facet_query(price__lte=100, _local_params=[('ex', 'price'), ('cache', 'false')]) q = q.group('company', limit=3) q = q.filter(category=13, _local_params={'tag': 'category'}) q = q.stats('price') q = q.order_by('-date_created') q = q.offset(48).limit(24) raw_query = str(q) ## Usecases for using facet values with object mapping # # 1 # for fv in q.results.get_facet_field('category').values: # print fv.instance, fv.count # # 2 # tag_facet = q.results.get_facet_field('tag') # tags = db.session.query(Tag).filter(Tag.id.in_(tag_facet.values)).all() # tags_map = dict((str(t.id), t) for t in tags) # for fv in tag_facet.values: # tag = tags_map.get(fv.value) # print tag, fv.count # # 2.5 # def iter_tag_counts(tag_facet): # ids = [tag_id for tag_id, count in tag_facet.counts] # tags = db.session.query(Tag).filter(Tag.id.in_(tag_facet.values)) # tags_map = dict((str(t.id), t) for t in tags) # for tag_id, count in tag_facet.counts: # yield tags_map[tag_id], count # tag_counts = iter_tag_counts(tag_facet) # for tag, count in tag_counts: # print tag, count self.assertTrue('facet=true' in raw_query) self.assertTrue('facet.field=%s' % quote_plus('{!ex=category}category') in raw_query) self.assertTrue('f.category.facet.mincount=5' in raw_query) self.assertTrue('f.category.facet.limit=10' in raw_query) self.assertTrue('facet.field=%s' % quote_plus('{!ex=tag}tag') in raw_query) self.assertTrue( 'facet.query=%s' % quote_plus('{!ex=price cache=false}price:[* TO 100]') in raw_query) self.assertTrue('group=true' in raw_query) self.assertTrue('group.limit=3' in raw_query) self.assertTrue('group.field=company' in raw_query) self.assertTrue( 'fq=%s' % quote_plus('{!tag=category}category:13') in raw_query) self.assertTrue('stats=true' in raw_query) self.assertTrue('stats.field=price' in raw_query) self.assertTrue('sort=date_created+desc' in raw_query) self.assertTrue('start=48' in raw_query) self.assertTrue('rows=24' in raw_query) r = q.results self.assertEqual(len(r.docs), 2) self.assertEqual(r.docs[0].id, '111') self.assertEqual(r.docs[0].name, 'Test 1') self.assertEqual(r.docs[0].grouped_count, 8) self.assertEqual(r.docs[0].grouped_docs[-1].id, '333') self.assertEqual(r.docs[0].grouped_docs[-1].name, 'Test 3') self.assertEqual(r.docs[1].id, '555') self.assertEqual(r.docs[1].name, 'Test 5') self.assertEqual(len(r.docs[0].grouped_docs), 2) self.assertEqual(len(r.facet_fields), 2) category_facet = r.get_facet_field('category') self.assertEqual(len(category_facet.values), 2) self.assertEqual(category_facet.values[0].value, '1') self.assertEqual(category_facet.values[0].count, 5) self.assertEqual(category_facet.values[0].instance, { 'id': 1, 'name': '1' }) self.assertEqual(category_facet.values[1].value, '2') self.assertEqual(category_facet.values[1].count, 2) self.assertEqual(category_facet.values[1].instance, { 'id': 2, 'name': '2' }) tag_facet = r.get_facet_field('tag') self.assertEqual(len(tag_facet.values), 3) self.assertEqual(tag_facet.values[-1].value, '1000') self.assertEqual(tag_facet.values[-1].count, 30) self.assertEqual(len(r.facet_queries), 1) price_stats = r.get_stats_field('price') self.assertEqual(len(r.stats_fields), 1) self.assertEqual(price_stats.min, 3.5) self.assertEqual(price_stats.max, 892.0) self.assertEqual(price_stats.count, 1882931) self.assertEqual(price_stats.missing, 556686)