def test_labels_ranges_mismatch(self): with pytest.raises(ValueError): search.RangeFacet(field='some_field', ranges=self.ranges, labels={ 'first': 'First range', 'second': 'Second range', }) with pytest.raises(ValueError): search.RangeFacet(field='some_field', ranges=self.ranges, labels={ 'first': 'First range', 'second': 'Second range', 'unknown': 'Third range', })
class FakeSearchWithRange(FakeSearch): facets = { 'range': search.RangeFacet(field='a_range_field', ranges=[('none', (None, 1)), ('little', (1, 5)), ('quite', (5, 10)), ('heavy', (10, None))], labels=RANGE_LABELS) }
def setUp(self): self.ranges = [('first', (None, 1)), ('second', (1, 5)), ('third', (5, None))] self.facet = search.RangeFacet(field='some_field', ranges=self.ranges, labels={ 'first': 'First range', 'second': 'Second range', 'third': 'Third range', })
class FakeSearch(search.ModelSearchAdapter): model = Fake fields = [ 'title^2', 'description', ] facets = { 'tag': search.TermFacet('tags'), 'other': search.TermFacet('other'), 'range': search.RangeFacet('a_num_field'), 'daterange': search.DateRangeFacet('a_daterange_field'), 'bool': search.BoolFacet('boolean'), 'extra': search.ExtrasFacet('extras'), } sorts = { 'title': search.Sort('title.raw'), 'description': search.Sort('description.raw'), }
class OrganizationSearch(search.ModelSearchAdapter): model = Organization fuzzy = True fields = ( 'name^6', 'acronym^6', 'description', ) sorts = { 'name': search.Sort('name.raw'), 'reuses': search.Sort('metrics.reuses'), 'datasets': search.Sort('metrics.datasets'), 'followers': search.Sort('metrics.followers'), 'views': search.Sort('metrics.views'), 'created': search.Sort('created'), } facets = { 'reuses': search.RangeFacet('metrics.reuses'), 'badge': search.TermFacet('badges', labelizer=organization_badge_labelizer), 'permitted_reuses': search.RangeFacet('metrics.permitted_reuses'), 'datasets': search.RangeFacet('metrics.datasets'), 'followers': search.RangeFacet('metrics.followers'), } mapping = { 'properties': { 'name': { 'type': 'string', 'analyzer': search.i18n_analyzer, 'fields': { 'raw': { 'type': 'string', 'index': 'not_analyzed' } } }, 'acronym': { 'type': 'string', 'index': 'not_analyzed', }, 'description': { 'type': 'string', 'analyzer': search.i18n_analyzer }, 'badges': { 'type': 'string', 'index_name': 'badges', 'index': 'not_analyzed' }, 'url': { 'type': 'string' }, 'created': { 'type': 'date', 'format': 'date_hour_minute_second' }, 'metrics': search.metrics_mapping(Organization), 'org_suggest': { 'type': 'completion', 'index_analyzer': 'simple', 'search_analyzer': 'simple', 'payloads': True, }, } } boosters = [ search.GaussDecay('metrics.followers', max_followers, decay=0.8), search.GaussDecay('metrics.reuses', max_reuses, decay=0.9), search.GaussDecay('metrics.datasets', max_datasets, decay=0.9), ] @classmethod def is_indexable(cls, org): return org.deleted is None @classmethod def serialize(cls, organization): completions = cls.completer_tokenize(organization.name) completions.append(organization.id) if organization.acronym: completions.append(organization.acronym) return { 'name': organization.name, 'acronym': organization.acronym, 'description': organization.description, 'url': organization.url, 'metrics': organization.metrics, 'badges': [badge.kind for badge in organization.badges], 'created': organization.created_at.strftime('%Y-%m-%dT%H:%M:%S'), 'org_suggest': { 'input': completions, 'output': str(organization.id), 'payload': { 'name': organization.name, 'acronym': organization.acronym, 'image_url': organization.logo(40), 'slug': organization.slug, }, } }
def setUp(self): self.facet = search.RangeFacet('some_field')