diff options
Diffstat (limited to 'django/contrib/postgres')
-rw-r--r-- | django/contrib/postgres/apps.py | 6 | ||||
-rw-r--r-- | django/contrib/postgres/lookups.py | 5 | ||||
-rw-r--r-- | django/contrib/postgres/search.py | 18 |
3 files changed, 28 insertions, 1 deletions
diff --git a/django/contrib/postgres/apps.py b/django/contrib/postgres/apps.py index 781c8728f2..91fc29ac05 100644 --- a/django/contrib/postgres/apps.py +++ b/django/contrib/postgres/apps.py @@ -13,7 +13,7 @@ from django.test.signals import setting_changed from django.utils.translation import gettext_lazy as _ from .indexes import OpClass -from .lookups import SearchLookup, TrigramSimilar, Unaccent +from .lookups import SearchLookup, TrigramSimilar, TrigramWordSimilar, Unaccent from .serializers import RangeSerializer from .signals import register_type_handlers @@ -33,6 +33,8 @@ def uninstall_if_needed(setting, value, enter, **kwargs): TextField._unregister_lookup(SearchLookup) CharField._unregister_lookup(TrigramSimilar) TextField._unregister_lookup(TrigramSimilar) + CharField._unregister_lookup(TrigramWordSimilar) + TextField._unregister_lookup(TrigramWordSimilar) # Disconnect this receiver until the next time this app is installed # and ready() connects it again to prevent unnecessary processing on # each setting change. @@ -65,5 +67,7 @@ class PostgresConfig(AppConfig): TextField.register_lookup(SearchLookup) CharField.register_lookup(TrigramSimilar) TextField.register_lookup(TrigramSimilar) + CharField.register_lookup(TrigramWordSimilar) + TextField.register_lookup(TrigramWordSimilar) MigrationWriter.register_serializer(RANGE_TYPES, RangeSerializer) IndexExpression.register_wrappers(OrderBy, OpClass, Collate) diff --git a/django/contrib/postgres/lookups.py b/django/contrib/postgres/lookups.py index 28d8590e1d..f7c6fc4b0c 100644 --- a/django/contrib/postgres/lookups.py +++ b/django/contrib/postgres/lookups.py @@ -58,3 +58,8 @@ class SearchLookup(SearchVectorExact): class TrigramSimilar(PostgresOperatorLookup): lookup_name = 'trigram_similar' postgres_operator = '%%' + + +class TrigramWordSimilar(PostgresOperatorLookup): + lookup_name = 'trigram_word_similar' + postgres_operator = '%%>' diff --git a/django/contrib/postgres/search.py b/django/contrib/postgres/search.py index f1640d85ba..164d359b91 100644 --- a/django/contrib/postgres/search.py +++ b/django/contrib/postgres/search.py @@ -293,6 +293,15 @@ class TrigramBase(Func): super().__init__(expression, string, **extra) +class TrigramWordBase(Func): + output_field = FloatField() + + def __init__(self, string, expression, **extra): + if not hasattr(string, 'resolve_expression'): + string = Value(string) + super().__init__(string, expression, **extra) + + class TrigramSimilarity(TrigramBase): function = 'SIMILARITY' @@ -300,3 +309,12 @@ class TrigramSimilarity(TrigramBase): class TrigramDistance(TrigramBase): function = '' arg_joiner = ' <-> ' + + +class TrigramWordDistance(TrigramWordBase): + function = '' + arg_joiner = ' <<-> ' + + +class TrigramWordSimilarity(TrigramWordBase): + function = 'WORD_SIMILARITY' |