From 224e9f9ea36a6c39466fdb13cbc8c06bedfe8c76 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Thu, 1 Jun 2023 15:20:24 +0200 Subject: [PATCH 1/1] missing file --- src/search/utils.py | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/search/utils.py diff --git a/src/search/utils.py b/src/search/utils.py new file mode 100644 index 000000000..b2cbe8d94 --- /dev/null +++ b/src/search/utils.py @@ -0,0 +1,79 @@ +from django.db.models import Func +from django.contrib.postgres.search import SearchVector, SearchQuery, SearchQueryField, SearchHeadline as SH + + + +class UnaccentTSVector(Func): + function = 'UNACCENT' + template = '%(function)s(%(expressions)s::text)::tsvector' + + +class Unaccent(Func): + function = 'UNACCENT' + + +class ConcatTSVector(Func): + function = 'CONCAT' + template = '%(function)s(%(expressions)s)::tsvector' + + +class UnaccentTSQuery(Func): + function = 'UNACCENT' + template = '%(function)s(%(expressions)s::text)::tsquery' + output_field = SearchQueryField() + + +class TSV(Func): + function='to_tsvector' + template = '''unaccent( + %(function)s('polish', %(expressions)s)::text)::tsvector || + to_tsvector( + 'polish_simple', + unaccent(%(expressions)s) + )''' + + +def build_search_vector(*fields): + return TSV(*fields) + + +def build_search_query(*fields, **kwargs): + return UnaccentTSQuery(SearchQuery(*fields, **kwargs)) + + + +class SearchHeadline(SH): + + def __init__( + self, + expression, + query, + *, + config=None, + start_sel=None, + stop_sel=None, + max_words=None, + min_words=None, + short_word=None, + highlight_all=None, + max_fragments=None, + fragment_delimiter=None, + ): + options = { + "StartSel": start_sel, + "StopSel": stop_sel, + "MaxWords": max_words, + "MinWords": min_words, + "ShortWord": short_word, + "HighlightAll": highlight_all, + "MaxFragments": max_fragments, + "FragmentDelimiter": fragment_delimiter, + } + self.options = { + option: value for option, value in options.items() if value is not None + } + expressions = (expression, query) + if config is not None: + config = SearchConfig.from_parameter(config) + expressions = (config,) + expressions + Func.__init__(self, *expressions) -- 2.20.1