summaryrefslogtreecommitdiff
path: root/django/contrib/postgres
diff options
context:
space:
mode:
Diffstat (limited to 'django/contrib/postgres')
-rw-r--r--django/contrib/postgres/apps.py6
-rw-r--r--django/contrib/postgres/lookups.py5
-rw-r--r--django/contrib/postgres/search.py18
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'