mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed #24938 -- Added PostgreSQL trigram support.
This commit is contained in:
committed by
Tim Graham
parent
d7334b405f
commit
1962a96a30
@@ -5,12 +5,13 @@ from django.db import migrations
|
||||
|
||||
try:
|
||||
from django.contrib.postgres.operations import (
|
||||
CreateExtension, HStoreExtension, UnaccentExtension,
|
||||
CreateExtension, HStoreExtension, TrigramExtension, UnaccentExtension,
|
||||
)
|
||||
except ImportError:
|
||||
from django.test import mock
|
||||
CreateExtension = mock.Mock()
|
||||
HStoreExtension = mock.Mock()
|
||||
TrigramExtension = mock.Mock()
|
||||
UnaccentExtension = mock.Mock()
|
||||
|
||||
|
||||
@@ -21,5 +22,6 @@ class Migration(migrations.Migration):
|
||||
# dash in its name.
|
||||
CreateExtension('uuid-ossp'),
|
||||
HStoreExtension(),
|
||||
TrigramExtension(),
|
||||
UnaccentExtension(),
|
||||
]
|
||||
|
||||
53
tests/postgres_tests/test_trigram.py
Normal file
53
tests/postgres_tests/test_trigram.py
Normal file
@@ -0,0 +1,53 @@
|
||||
from django.contrib.postgres.search import TrigramDistance, TrigramSimilarity
|
||||
from django.test import modify_settings
|
||||
|
||||
from . import PostgreSQLTestCase
|
||||
from .models import CharFieldModel, TextFieldModel
|
||||
|
||||
|
||||
@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
|
||||
class TrigramTest(PostgreSQLTestCase):
|
||||
Model = CharFieldModel
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.Model.objects.bulk_create([
|
||||
cls.Model(field='Matthew'),
|
||||
cls.Model(field='Cat sat on mat.'),
|
||||
cls.Model(field='Dog sat on rug.'),
|
||||
])
|
||||
|
||||
def test_trigram_search(self):
|
||||
self.assertQuerysetEqual(
|
||||
self.Model.objects.filter(field__trigram_similar='Mathew'),
|
||||
['Matthew'],
|
||||
transform=lambda instance: instance.field,
|
||||
)
|
||||
|
||||
def test_trigram_similarity(self):
|
||||
search = 'Bat sat on cat.'
|
||||
self.assertQuerysetEqual(
|
||||
self.Model.objects.filter(
|
||||
field__trigram_similar=search,
|
||||
).annotate(similarity=TrigramSimilarity('field', search)).order_by('-similarity'),
|
||||
[('Cat sat on mat.', 0.625), ('Dog sat on rug.', 0.333333)],
|
||||
transform=lambda instance: (instance.field, instance.similarity),
|
||||
ordered=True,
|
||||
)
|
||||
|
||||
def test_trigram_similarity_alternate(self):
|
||||
self.assertQuerysetEqual(
|
||||
self.Model.objects.annotate(
|
||||
distance=TrigramDistance('field', 'Bat sat on cat.'),
|
||||
).filter(distance__lte=0.7).order_by('distance'),
|
||||
[('Cat sat on mat.', 0.375), ('Dog sat on rug.', 0.666667)],
|
||||
transform=lambda instance: (instance.field, instance.distance),
|
||||
ordered=True,
|
||||
)
|
||||
|
||||
|
||||
class TrigramTextFieldTest(TrigramTest):
|
||||
"""
|
||||
TextField has the same behavior as CharField regarding trigram lookups.
|
||||
"""
|
||||
Model = TextFieldModel
|
||||
Reference in New Issue
Block a user