Пример #1
0
 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',
                           })
Пример #2
0
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)
    }
Пример #3
0
 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',
                                    })
Пример #4
0
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'),
    }
Пример #5
0
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,
                },
            }
        }
Пример #6
0
 def setUp(self):
     self.facet = search.RangeFacet('some_field')