Skip to content

Commit 6ff6bb8

Browse files
committed
remove support for embedded indexes/constraints
1 parent 1d27048 commit 6ff6bb8

4 files changed

Lines changed: 86 additions & 143 deletions

File tree

django_mongodb_backend/constraints.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from .indexes import EmbeddedFieldIndexMixin, _get_condition_mql, get_field
1111

1212

13-
def get_pymongo_index_model(self, model, schema_editor, field=None, column_prefix=""):
13+
def get_pymongo_index_model(self, model, schema_editor, field=None):
1414
"""Return a pymongo IndexModel for this UniqueConstraint."""
1515
if self.contains_expressions:
1616
return None
@@ -24,8 +24,9 @@ def get_pymongo_index_model(self, model, schema_editor, field=None, column_prefi
2424
# be True or False for a UniqueConstraint, or None for
2525
# Field(unique=True) or Meta.unique_together.
2626
if field:
27-
column = column_prefix + field.column
28-
filter_expression[column].update({"$type": field.db_type(schema_editor.connection)})
27+
filter_expression[field.column].update(
28+
{"$type": field.db_type(schema_editor.connection)}
29+
)
2930
else:
3031
for field_name in self.fields:
3132
field_ = get_field(model, field_name)
@@ -35,12 +36,9 @@ def get_pymongo_index_model(self, model, schema_editor, field=None, column_prefi
3536
if filter_expression:
3637
kwargs["partialFilterExpression"] = filter_expression
3738
index_orders = (
38-
[(column_prefix + field.column, ASCENDING)]
39+
[(field.column, ASCENDING)]
3940
if field
40-
else [
41-
(column_prefix + get_field(model, field_name).column, ASCENDING)
42-
for field_name in self.fields
43-
]
41+
else [(get_field(model, field_name).column, ASCENDING) for field_name in self.fields]
4442
)
4543
return IndexModel(index_orders, name=self.name, unique=True, **kwargs)
4644

django_mongodb_backend/indexes.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def get_field(model, field_name):
8383
return FieldColumn(field, ".".join(path))
8484

8585

86-
def get_pymongo_index_model(self, model, schema_editor, field=None, column_prefix=""):
86+
def get_pymongo_index_model(self, model, schema_editor, field=None):
8787
"""Return a pymongo IndexModel for this Django Index."""
8888
if self.contains_expressions:
8989
return None
@@ -94,13 +94,13 @@ def get_pymongo_index_model(self, model, schema_editor, field=None, column_prefi
9494
if filter_expression:
9595
kwargs["partialFilterExpression"] = filter_expression
9696
index_orders = (
97-
[(column_prefix + field.column, ASCENDING)]
97+
[(field.column, ASCENDING)]
9898
if field
9999
else [
100100
# order is "" if ASCENDING or "DESC" if DESCENDING (see
101101
# django.db.models.indexes.Index.fields_orders).
102102
(
103-
column_prefix + get_field(model, field_name).column,
103+
get_field(model, field_name).column,
104104
ASCENDING if order == "" else DESCENDING,
105105
)
106106
for field_name, order in self.fields_orders
@@ -281,12 +281,12 @@ def search_index_data_types(self, db_type):
281281
return "embeddedDocuments"
282282
return db_type
283283

284-
def get_pymongo_index_model(self, model, schema_editor, field=None, column_prefix=""):
284+
def get_pymongo_index_model(self, model, schema_editor, field=None):
285285
if not schema_editor.connection.features.supports_search:
286286
return None
287287
fields = {}
288288
for field_name, _ in self.fields_orders:
289-
field_path = column_prefix + model._meta.get_field(field_name).column
289+
field_path = model._meta.get_field(field_name).column
290290
if self.field_mappings:
291291
fields[field_path] = self.field_mappings[field_name]
292292
else:

django_mongodb_backend/schema.py

Lines changed: 40 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -71,26 +71,18 @@ def _create_model_indexes(self, model, column_prefix="", parent_model=None):
7171
field.embedded_model, parent_model=parent_model or model, column_prefix=new_path
7272
)
7373
if self._field_should_be_indexed(model, field):
74-
self._add_field_index(parent_model or model, field, column_prefix=column_prefix)
74+
self._add_field_index(model, field)
7575
elif self._field_should_have_unique(field):
76-
self._add_field_unique(parent_model or model, field, column_prefix=column_prefix)
76+
self._add_field_unique(model, field)
7777
# Meta.unique_together
7878
if model._meta.unique_together:
79-
self.alter_unique_together(
80-
model,
81-
[],
82-
model._meta.unique_together,
83-
column_prefix=column_prefix,
84-
parent_model=parent_model,
85-
)
79+
self.alter_unique_together(model, [], model._meta.unique_together)
8680
# Meta.constraints
8781
for constraint in model._meta.constraints:
88-
self.add_constraint(
89-
model, constraint, column_prefix=column_prefix, parent_model=parent_model
90-
)
82+
self.add_constraint(model, constraint)
9183
# Meta.indexes
9284
for index in model._meta.indexes:
93-
self.add_index(model, index, column_prefix=column_prefix, parent_model=parent_model)
85+
self.add_index(model, index)
9486

9587
@ignore_embedded_models
9688
def delete_model(self, model):
@@ -182,112 +174,77 @@ def remove_field(self, model, field):
182174
self._remove_field_index(model, field)
183175
elif self._field_should_have_unique(field):
184176
self._remove_field_unique(model, field)
185-
if isinstance(field, EmbeddedModelField):
186-
new_path = f"{field.column}."
187-
self._remove_model_indexes(
188-
field.embedded_model, parent_model=model, column_prefix=new_path
189-
)
190177

191-
def _remove_model_indexes(self, model, column_prefix="", parent_model=None):
192-
"""
193-
When removing an EmbeddedModelField, the indexes need to be removed
194-
recursively.
195-
"""
178+
def _remove_model_indexes(self, model):
196179
if not model._meta.managed or model._meta.proxy or model._meta.swapped:
197180
return
198181
# Field indexes and uniques
199182
for field in model._meta.local_fields:
200-
if isinstance(field, EmbeddedModelField):
201-
new_path = f"{column_prefix}{field.column}."
202-
self._remove_model_indexes(
203-
field.embedded_model, parent_model=parent_model or model, column_prefix=new_path
204-
)
205183
if self._field_should_be_indexed(model, field):
206-
self._remove_field_index(parent_model or model, field, column_prefix=column_prefix)
184+
self._remove_field_index(model, field)
207185
elif self._field_should_have_unique(field):
208-
self._remove_field_unique(parent_model or model, field, column_prefix=column_prefix)
186+
self._remove_field_unique(model, field)
209187
# Meta.unique_together
210188
if model._meta.unique_together:
211-
self.alter_unique_together(
212-
model,
213-
model._meta.unique_together,
214-
[],
215-
column_prefix=column_prefix,
216-
parent_model=parent_model,
217-
)
189+
self.alter_unique_together(model, model._meta.unique_together, [])
218190
# Meta.constraints
219191
for constraint in model._meta.constraints:
220-
self.remove_constraint(parent_model or model, constraint)
192+
self.remove_constraint(model, constraint)
221193
# Meta.indexes
222194
for index in model._meta.indexes:
223-
self.remove_index(parent_model or model, index)
195+
self.remove_index(model, index)
224196

225197
@ignore_embedded_models
226-
def alter_index_together(self, model, old_index_together, new_index_together, column_prefix=""):
198+
def alter_index_together(self, model, old_index_together, new_index_together):
227199
olds = {tuple(fields) for fields in old_index_together}
228200
news = {tuple(fields) for fields in new_index_together}
229201
# Deleted indexes
230202
for field_names in olds.difference(news):
231203
self._remove_composed_index(
232-
model, field_names, {"index": True, "unique": False}, column_prefix=""
204+
model,
205+
field_names,
206+
{"index": True, "unique": False},
233207
)
234208
# Created indexes
235209
for field_names in news.difference(olds):
236-
self._add_composed_index(model, field_names, column_prefix=column_prefix)
210+
self._add_composed_index(model, field_names)
237211

238212
@ignore_embedded_models
239-
def alter_unique_together(
240-
self, model, old_unique_together, new_unique_together, column_prefix="", parent_model=None
241-
):
213+
def alter_unique_together(self, model, old_unique_together, new_unique_together):
242214
olds = {tuple(fields) for fields in old_unique_together}
243215
news = {tuple(fields) for fields in new_unique_together}
244216
# Deleted uniques
245217
for field_names in olds.difference(news):
246-
self._remove_composed_index(
247-
model,
248-
field_names,
249-
{"unique": True, "primary_key": False},
250-
column_prefix=column_prefix,
251-
parent_model=parent_model,
252-
)
218+
self._remove_composed_index(model, field_names, {"unique": True, "primary_key": False})
253219
# Created uniques
254220
for field_names in news.difference(olds):
255221
columns = [model._meta.get_field(field).column for field in field_names]
256-
name = str(
257-
self._unique_constraint_name(
258-
model._meta.db_table, [column_prefix + col for col in columns]
259-
)
260-
)
222+
name = str(self._unique_constraint_name(model._meta.db_table, columns))
261223
constraint = UniqueConstraint(fields=field_names, name=name)
262-
self.add_constraint(
263-
model, constraint, parent_model=parent_model, column_prefix=column_prefix
264-
)
224+
self.add_constraint(model, constraint)
265225

266226
@ignore_embedded_models
267-
def add_index(self, model, index, *, field=None, column_prefix="", parent_model=None):
268-
idx = index.get_pymongo_index_model(
269-
model, schema_editor=self, field=field, column_prefix=column_prefix
270-
)
227+
def add_index(self, model, index, field=None):
228+
idx = index.get_pymongo_index_model(model, schema_editor=self, field=field)
271229
if idx:
272-
model = parent_model or model
273230
collection = self.get_collection(model._meta.db_table)
274231
if isinstance(idx, SearchIndexModel):
275232
collection.create_search_index(idx)
276233
self.wait_until_index_created(collection, index.name)
277234
else:
278235
collection.create_indexes([idx])
279236

280-
def _add_composed_index(self, model, field_names, column_prefix="", parent_model=None):
237+
def _add_composed_index(self, model, field_names):
281238
"""Add an index on the given list of field_names."""
282239
idx = Index(fields=field_names)
283240
idx.set_name_with_model(model)
284-
self.add_index(model, idx, column_prefix=column_prefix, parent_model=parent_model)
241+
self.add_index(model, idx)
285242

286-
def _add_field_index(self, model, field, *, column_prefix=""):
243+
def _add_field_index(self, model, field):
287244
"""Add an index on a field with db_index=True."""
288-
index = Index(fields=[column_prefix + field.name])
289-
index.name = self._create_index_name(model._meta.db_table, [column_prefix + field.column])
290-
self.add_index(model, index, field=field, column_prefix=column_prefix)
245+
index = Index(fields=[field.name])
246+
index.name = self._create_index_name(model._meta.db_table, [field.column])
247+
self.add_index(model, index, field=field)
291248

292249
@ignore_embedded_models
293250
def remove_index(self, model, index):
@@ -302,18 +259,16 @@ def remove_index(self, model, index):
302259
else:
303260
collection.drop_index(index.name)
304261

305-
def _remove_composed_index(
306-
self, model, field_names, constraint_kwargs, column_prefix="", parent_model=None
307-
):
262+
def _remove_composed_index(self, model, field_names, constraint_kwargs):
308263
"""
309264
Remove the index on the given list of field_names created by
310265
index/unique_together, depending on constraint_kwargs.
311266
"""
312267
meta_constraint_names = {constraint.name for constraint in model._meta.constraints}
313268
meta_index_names = {constraint.name for constraint in model._meta.indexes}
314-
columns = [column_prefix + model._meta.get_field(field).column for field in field_names]
269+
columns = [model._meta.get_field(field).column for field in field_names]
315270
constraint_names = self._constraint_names(
316-
parent_model or model,
271+
model,
317272
columns,
318273
exclude=meta_constraint_names | meta_index_names,
319274
**constraint_kwargs,
@@ -325,17 +280,16 @@ def _remove_composed_index(
325280
f"Found wrong number ({num_found}) of constraints for "
326281
f"{model._meta.db_table}({columns_str})."
327282
)
328-
model = parent_model or model
329283
collection = self.get_collection(model._meta.db_table)
330284
collection.drop_index(constraint_names[0])
331285

332-
def _remove_field_index(self, model, field, column_prefix=""):
286+
def _remove_field_index(self, model, field):
333287
"""Remove a field's db_index=True index."""
334288
collection = self.get_collection(model._meta.db_table)
335289
meta_index_names = {index.name for index in model._meta.indexes}
336290
index_names = self._constraint_names(
337291
model,
338-
[column_prefix + field.column],
292+
[field.column],
339293
index=True,
340294
# Retrieve only BTREE indexes since this is what's created with
341295
# db_index=True.
@@ -351,31 +305,23 @@ def _remove_field_index(self, model, field, column_prefix=""):
351305
collection.drop_index(index_names[0])
352306

353307
@ignore_embedded_models
354-
def add_constraint(self, model, constraint, field=None, column_prefix="", parent_model=None):
308+
def add_constraint(self, model, constraint, field=None):
355309
if isinstance(constraint, UniqueConstraint) and self._unique_supported(
356310
condition=constraint.condition,
357311
deferrable=constraint.deferrable,
358312
include=constraint.include,
359313
expressions=constraint.expressions,
360314
nulls_distinct=constraint.nulls_distinct,
361315
):
362-
idx = constraint.get_pymongo_index_model(
363-
model,
364-
schema_editor=self,
365-
field=field,
366-
column_prefix=column_prefix,
367-
)
316+
idx = constraint.get_pymongo_index_model(model, schema_editor=self, field=field)
368317
if idx:
369-
model = parent_model or model
370318
collection = self.get_collection(model._meta.db_table)
371319
collection.create_indexes([idx])
372320

373-
def _add_field_unique(self, model, field, column_prefix=""):
374-
name = str(
375-
self._unique_constraint_name(model._meta.db_table, [column_prefix + field.column])
376-
)
321+
def _add_field_unique(self, model, field):
322+
name = str(self._unique_constraint_name(model._meta.db_table, [field.column]))
377323
constraint = UniqueConstraint(fields=[field.name], name=name)
378-
self.add_constraint(model, constraint, field=field, column_prefix=column_prefix)
324+
self.add_constraint(model, constraint, field=field)
379325

380326
@ignore_embedded_models
381327
def remove_constraint(self, model, constraint):
@@ -393,12 +339,12 @@ def remove_constraint(self, model, constraint):
393339
)
394340
self.remove_index(model, idx)
395341

396-
def _remove_field_unique(self, model, field, column_prefix=""):
342+
def _remove_field_unique(self, model, field):
397343
# Find the unique constraint for this field
398344
meta_constraint_names = {constraint.name for constraint in model._meta.constraints}
399345
constraint_names = self._constraint_names(
400346
model,
401-
[column_prefix + field.column],
347+
[field.column],
402348
unique=True,
403349
primary_key=False,
404350
exclude=meta_constraint_names,

0 commit comments

Comments
 (0)