Skip to content

Commit 5f2587d

Browse files
committed
Return None if the index cannot be created
1 parent 444af35 commit 5f2587d

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

django_mongodb_backend/indexes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ def search_index_data_types(self, field, db_type):
147147
def get_pymongo_index_model(
148148
self, model, schema_editor, field=None, unique=False, column_prefix=""
149149
):
150+
errors = self.check(model, schema_editor.connection)
151+
if errors:
152+
return None
150153
fields = {}
151154
for field_name, _ in self.fields_orders:
152155
field_ = model._meta.get_field(field_name)
@@ -227,6 +230,9 @@ def deconstruct(self):
227230
def get_pymongo_index_model(
228231
self, model, schema_editor, field=None, unique=False, column_prefix=""
229232
):
233+
errors = self.check(model, schema_editor.connection)
234+
if errors:
235+
return None
230236
similarities = (
231237
itertools.cycle([self.similarities])
232238
if isinstance(self.similarities, str)

django_mongodb_backend/schema.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ def alter_unique_together(
263263
def add_index(
264264
self, model, index, *, field=None, unique=False, column_prefix="", parent_model=None
265265
):
266+
# Check if the index can be created.
267+
if hasattr(index, "check") and index.check(model, self.connection):
268+
return
266269
idx = index.get_pymongo_index_model(
267270
model, schema_editor=self, field=field, unique=unique, column_prefix=column_prefix
268271
)

tests/indexes_/test_atlas_indexes.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from django.db import connection
2-
from django.test import TestCase, skipUnlessDBFeature
2+
from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
33

44
from django_mongodb_backend.indexes import SearchIndex, VectorSearchIndex
55

66
from .models import Article
77

88

9-
@skipUnlessDBFeature("supports_atlas_search")
109
class SearchIndexTests(TestCase):
1110
# Tests for creating, validating, and removing search indexes using Django's schema editor.
1211
available_apps = None
@@ -29,6 +28,7 @@ def assertAddRemoveIndex(self, editor, model, index):
2928
),
3029
)
3130

31+
@skipUnlessDBFeature("supports_atlas_search")
3232
def test_simple(self):
3333
with connection.schema_editor() as editor:
3434
index = SearchIndex(
@@ -38,6 +38,23 @@ def test_simple(self):
3838
editor.add_index(index=index, model=Article)
3939
self.assertAddRemoveIndex(editor, Article, index)
4040

41+
@skipIfDBFeature("supports_atlas_search")
42+
def test_index_not_created(self):
43+
with connection.schema_editor() as editor:
44+
index = SearchIndex(
45+
name="recent_article_idx",
46+
fields=["number"],
47+
)
48+
editor.add_index(index=index, model=Article)
49+
self.assertNotIn(
50+
index.name,
51+
connection.introspection.get_constraints(
52+
cursor=None,
53+
table_name=Article._meta.db_table,
54+
),
55+
)
56+
57+
@skipUnlessDBFeature("supports_atlas_search")
4158
def test_multiple_fields(self):
4259
with connection.schema_editor() as editor:
4360
index = SearchIndex(
@@ -80,7 +97,6 @@ def test_multiple_fields(self):
8097
self.assertAddRemoveIndex(editor, Article, index)
8198

8299

83-
@skipUnlessDBFeature("supports_atlas_search")
84100
class VectorSearchIndexTests(TestCase):
85101
# Tests for creating, validating, and removing vector search indexes
86102
# using Django's schema editor.
@@ -104,6 +120,7 @@ def assertAddRemoveIndex(self, editor, model, index):
104120
),
105121
)
106122

123+
@skipUnlessDBFeature("supports_atlas_search")
107124
def test_deconstruct_default_similarity(self):
108125
index = VectorSearchIndex(
109126
name="recent_article_idx",
@@ -113,6 +130,23 @@ def test_deconstruct_default_similarity(self):
113130
new = VectorSearchIndex(*args, **kwargs)
114131
self.assertEqual(new.similarities, index.similarities)
115132

133+
@skipIfDBFeature("supports_atlas_search")
134+
def test_index_not_created(self):
135+
with connection.schema_editor() as editor:
136+
index = VectorSearchIndex(
137+
name="recent_article_idx",
138+
fields=["number"],
139+
)
140+
editor.add_index(index=index, model=Article)
141+
self.assertNotIn(
142+
index.name,
143+
connection.introspection.get_constraints(
144+
cursor=None,
145+
table_name=Article._meta.db_table,
146+
),
147+
)
148+
149+
@skipUnlessDBFeature("supports_atlas_search")
116150
def test_deconstruct_with_similarities(self):
117151
index = VectorSearchIndex(
118152
name="recent_article_idx",
@@ -123,6 +157,7 @@ def test_deconstruct_with_similarities(self):
123157
new = VectorSearchIndex(*args, **kwargs)
124158
self.assertEqual(new.similarities, index.similarities)
125159

160+
@skipUnlessDBFeature("supports_atlas_search")
126161
def test_simple_vector_search(self):
127162
with connection.schema_editor() as editor:
128163
index = VectorSearchIndex(
@@ -132,6 +167,7 @@ def test_simple_vector_search(self):
132167
editor.add_index(index=index, model=Article)
133168
self.assertAddRemoveIndex(editor, Article, index)
134169

170+
@skipUnlessDBFeature("supports_atlas_search")
135171
def test_multiple_fields(self):
136172
with connection.schema_editor() as editor:
137173
index = VectorSearchIndex(

0 commit comments

Comments
 (0)