Skip to content

Commit 80fffa5

Browse files
WaVEVtimgraham
authored andcommitted
Move field repeated check to init
1 parent 6b84168 commit 80fffa5

File tree

3 files changed

+22
-44
lines changed

3 files changed

+22
-44
lines changed

django_mongodb_backend/indexes.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -167,34 +167,28 @@ class VectorSearchIndex(SearchIndex):
167167
ALLOWED_SIMILARITY_FUNCTIONS = frozenset(("euclidean", "cosine", "dotProduct"))
168168
_error_id_prefix = "django_mongodb_backend.indexes.VectorSearchIndex"
169169

170-
def __init__(self, *expressions, similarities="cosine", **kwargs):
171-
super().__init__(*expressions, **kwargs)
170+
def __init__(self, *expressions, fields=(), similarities="cosine", name=None, **kwargs):
171+
super().__init__(*expressions, fields=fields, name=name, **kwargs)
172172
self.similarities = similarities
173173
for func in similarities if isinstance(similarities, list) else (similarities,):
174174
if func not in self.ALLOWED_SIMILARITY_FUNCTIONS:
175175
raise ValueError(
176176
f"{func} isn't a valid similarity function, options "
177177
f"are {', '.join(sorted(self.ALLOWED_SIMILARITY_FUNCTIONS))}"
178178
)
179-
180-
def check(self, model, connection):
181-
errors = super().check(model, connection)
182179
viewed = set()
183-
expected_similarities = 0
184180
for field_name, _ in self.fields_orders:
185181
if field_name in viewed:
186-
errors.append(
187-
Error(
188-
f"Field '{field_name}' is defined more than once. Vector and filter "
189-
"fields must use distinct field names.",
190-
obj=self,
191-
hint="If you need different configurations for the same field, "
192-
"create separate indexes.",
193-
id=f"{self._error_id_prefix}.E004",
194-
)
182+
raise ValueError(
183+
f"Field '{field_name}' is defined more than once. Vector and filter "
184+
"fields must use distinct field names.",
195185
)
196-
continue
197186
viewed.add(field_name)
187+
188+
def check(self, model, connection):
189+
errors = super().check(model, connection)
190+
expected_similarities = 0
191+
for field_name, _ in self.fields_orders:
198192
field_ = model._meta.get_field(field_name)
199193
if isinstance(field_, ArrayField):
200194
expected_similarities += 1

tests/indexes_/test_atlas_indexes.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,17 @@ def test_invalid_similarity_function(self):
112112
with self.assertRaisesMessage(ValueError, msg):
113113
VectorSearchIndex(fields=["vector_data"], similarities="sum")
114114

115+
def test_define_field_twice(self):
116+
msg = (
117+
"Field 'vector_data' is defined more than once. Vector "
118+
"and filter fields must use distinct field names."
119+
)
120+
with self.assertRaisesMessage(ValueError, msg):
121+
VectorSearchIndex(
122+
fields=["vector_data", "vector_data"],
123+
similarities="dotProduct",
124+
)
125+
115126
@skipUnlessDBFeature("supports_atlas_search")
116127
def test_deconstruct_default_similarity(self):
117128
index = VectorSearchIndex(name="recent_article_idx", fields=["number"])
@@ -139,7 +150,7 @@ def test_index_not_created(self):
139150
def test_deconstruct_with_similarities(self):
140151
index = VectorSearchIndex(
141152
name="recent_article_idx",
142-
fields=["number", "number"],
153+
fields=["number", "headline"],
143154
similarities=["cosine", "dotProduct"],
144155
)
145156
path, args, kwargs = index.deconstruct()

tests/indexes_/test_checks.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -126,33 +126,6 @@ class Meta:
126126
],
127127
)
128128

129-
def test_define_field_twice(self):
130-
class Article(models.Model):
131-
vector_data = ArrayField(models.DecimalField(), size=10)
132-
133-
class Meta:
134-
indexes = [
135-
VectorSearchIndex(
136-
fields=["vector_data", "vector_data"],
137-
similarities="dotProduct",
138-
)
139-
]
140-
141-
errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"})
142-
self.assertEqual(
143-
errors,
144-
[
145-
checks.Error(
146-
"Field 'vector_data' is defined more than once. Vector and filter "
147-
"fields must use distinct field names.",
148-
id="django_mongodb_backend.indexes.VectorSearchIndex.E004",
149-
hint="If you need different configurations for the same field, "
150-
"create separate indexes.",
151-
obj=Article._meta.indexes[0],
152-
),
153-
],
154-
)
155-
156129
def test_invalid_number_similarity_function_singular(self):
157130
class Article(models.Model):
158131
vector_data = ArrayField(models.DecimalField(), size=10)

0 commit comments

Comments
 (0)