Skip to content

Commit 486712a

Browse files
committed
remove support for embedded indexes/constraints
1 parent 80a8523 commit 486712a

6 files changed

Lines changed: 110 additions & 156 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/gis/schema.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,38 @@
11
from pymongo import GEOSPHERE
22
from pymongo.operations import IndexModel
33

4+
from django_mongodb_backend.fields import EmbeddedModelField
5+
46

57
class GISSchemaEditor:
68
def _create_model_indexes(self, model, column_prefix="", parent_model=None):
79
super()._create_model_indexes(model, column_prefix, parent_model)
810
for field in model._meta.local_fields:
9-
if getattr(field, "spatial_index", False):
11+
if isinstance(field, EmbeddedModelField):
12+
new_path = f"{column_prefix}{field.column}."
13+
self._create_embedded_spatial_indexes(
14+
field.embedded_model, parent_model=parent_model or model, column_prefix=new_path
15+
)
16+
elif getattr(field, "spatial_index", False):
1017
self._add_spatial_index(parent_model or model, field, column_prefix)
1118

19+
def _create_embedded_spatial_indexes(self, model, parent_model, column_prefix=""):
20+
for field in model._meta.local_fields:
21+
if isinstance(field, EmbeddedModelField):
22+
new_path = f"{column_prefix}{field.column}."
23+
self._create_embedded_spatial_indexes(
24+
field.embedded_model, parent_model=parent_model, column_prefix=new_path
25+
)
26+
elif getattr(field, "spatial_index", False):
27+
self._add_spatial_index(parent_model, field, column_prefix)
28+
1229
def add_field(self, model, field):
1330
super().add_field(model, field)
14-
if getattr(field, "spatial_index", False):
31+
if isinstance(field, EmbeddedModelField):
32+
self._create_embedded_spatial_indexes(
33+
field.embedded_model, parent_model=model, column_prefix=f"{field.column}."
34+
)
35+
elif getattr(field, "spatial_index", False):
1536
self._add_spatial_index(model, field)
1637

1738
def _alter_field(

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 & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -65,32 +65,19 @@ def _create_model_indexes(self, model, column_prefix="", parent_model=None):
6565
return
6666
# Field indexes and uniques
6767
for field in model._meta.local_fields:
68-
if isinstance(field, EmbeddedModelField):
69-
new_path = f"{column_prefix}{field.column}."
70-
self._create_model_indexes(
71-
field.embedded_model, parent_model=parent_model or model, column_prefix=new_path
72-
)
7368
if self._field_should_be_indexed(model, field):
74-
self._add_field_index(parent_model or model, field, column_prefix=column_prefix)
69+
self._add_field_index(model, field)
7570
elif self._field_should_have_unique(field):
76-
self._add_field_unique(parent_model or model, field, column_prefix=column_prefix)
71+
self._add_field_unique(model, field)
7772
# Meta.unique_together
7873
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-
)
74+
self.alter_unique_together(model, [], model._meta.unique_together)
8675
# Meta.constraints
8776
for constraint in model._meta.constraints:
88-
self.add_constraint(
89-
model, constraint, column_prefix=column_prefix, parent_model=parent_model
90-
)
77+
self.add_constraint(model, constraint)
9178
# Meta.indexes
9279
for index in model._meta.indexes:
93-
self.add_index(model, index, column_prefix=column_prefix, parent_model=parent_model)
80+
self.add_index(model, index)
9481

9582
@ignore_embedded_models
9683
def delete_model(self, model):
@@ -111,11 +98,6 @@ def add_field(self, model, field):
11198
self.get_collection(model._meta.db_table).update_many(
11299
{}, [{"$set": {column: self.effective_default(field)}}]
113100
)
114-
if isinstance(field, EmbeddedModelField):
115-
new_path = f"{field.column}."
116-
self._create_model_indexes(
117-
field.embedded_model, parent_model=model, column_prefix=new_path
118-
)
119101
# Add an index or unique, if required.
120102
if self._field_should_be_indexed(model, field):
121103
self._add_field_index(model, field)
@@ -182,112 +164,77 @@ def remove_field(self, model, field):
182164
self._remove_field_index(model, field)
183165
elif self._field_should_have_unique(field):
184166
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-
)
190167

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-
"""
168+
def _remove_model_indexes(self, model):
196169
if not model._meta.managed or model._meta.proxy or model._meta.swapped:
197170
return
198171
# Field indexes and uniques
199172
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-
)
205173
if self._field_should_be_indexed(model, field):
206-
self._remove_field_index(parent_model or model, field, column_prefix=column_prefix)
174+
self._remove_field_index(model, field)
207175
elif self._field_should_have_unique(field):
208-
self._remove_field_unique(parent_model or model, field, column_prefix=column_prefix)
176+
self._remove_field_unique(model, field)
209177
# Meta.unique_together
210178
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-
)
179+
self.alter_unique_together(model, model._meta.unique_together, [])
218180
# Meta.constraints
219181
for constraint in model._meta.constraints:
220-
self.remove_constraint(parent_model or model, constraint)
182+
self.remove_constraint(model, constraint)
221183
# Meta.indexes
222184
for index in model._meta.indexes:
223-
self.remove_index(parent_model or model, index)
185+
self.remove_index(model, index)
224186

225187
@ignore_embedded_models
226-
def alter_index_together(self, model, old_index_together, new_index_together, column_prefix=""):
188+
def alter_index_together(self, model, old_index_together, new_index_together):
227189
olds = {tuple(fields) for fields in old_index_together}
228190
news = {tuple(fields) for fields in new_index_together}
229191
# Deleted indexes
230192
for field_names in olds.difference(news):
231193
self._remove_composed_index(
232-
model, field_names, {"index": True, "unique": False}, column_prefix=""
194+
model,
195+
field_names,
196+
{"index": True, "unique": False},
233197
)
234198
# Created indexes
235199
for field_names in news.difference(olds):
236-
self._add_composed_index(model, field_names, column_prefix=column_prefix)
200+
self._add_composed_index(model, field_names)
237201

238202
@ignore_embedded_models
239-
def alter_unique_together(
240-
self, model, old_unique_together, new_unique_together, column_prefix="", parent_model=None
241-
):
203+
def alter_unique_together(self, model, old_unique_together, new_unique_together):
242204
olds = {tuple(fields) for fields in old_unique_together}
243205
news = {tuple(fields) for fields in new_unique_together}
244206
# Deleted uniques
245207
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-
)
208+
self._remove_composed_index(model, field_names, {"unique": True, "primary_key": False})
253209
# Created uniques
254210
for field_names in news.difference(olds):
255211
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-
)
212+
name = str(self._unique_constraint_name(model._meta.db_table, columns))
261213
constraint = UniqueConstraint(fields=field_names, name=name)
262-
self.add_constraint(
263-
model, constraint, parent_model=parent_model, column_prefix=column_prefix
264-
)
214+
self.add_constraint(model, constraint)
265215

266216
@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-
)
217+
def add_index(self, model, index, field=None):
218+
idx = index.get_pymongo_index_model(model, schema_editor=self, field=field)
271219
if idx:
272-
model = parent_model or model
273220
collection = self.get_collection(model._meta.db_table)
274221
if isinstance(idx, SearchIndexModel):
275222
collection.create_search_index(idx)
276223
self.wait_until_index_created(collection, index.name)
277224
else:
278225
collection.create_indexes([idx])
279226

280-
def _add_composed_index(self, model, field_names, column_prefix="", parent_model=None):
227+
def _add_composed_index(self, model, field_names):
281228
"""Add an index on the given list of field_names."""
282229
idx = Index(fields=field_names)
283230
idx.set_name_with_model(model)
284-
self.add_index(model, idx, column_prefix=column_prefix, parent_model=parent_model)
231+
self.add_index(model, idx)
285232

286-
def _add_field_index(self, model, field, *, column_prefix=""):
233+
def _add_field_index(self, model, field):
287234
"""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)
235+
index = Index(fields=[field.name])
236+
index.name = self._create_index_name(model._meta.db_table, [field.column])
237+
self.add_index(model, index, field=field)
291238

292239
@ignore_embedded_models
293240
def remove_index(self, model, index):
@@ -302,18 +249,16 @@ def remove_index(self, model, index):
302249
else:
303250
collection.drop_index(index.name)
304251

305-
def _remove_composed_index(
306-
self, model, field_names, constraint_kwargs, column_prefix="", parent_model=None
307-
):
252+
def _remove_composed_index(self, model, field_names, constraint_kwargs):
308253
"""
309254
Remove the index on the given list of field_names created by
310255
index/unique_together, depending on constraint_kwargs.
311256
"""
312257
meta_constraint_names = {constraint.name for constraint in model._meta.constraints}
313258
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]
259+
columns = [model._meta.get_field(field).column for field in field_names]
315260
constraint_names = self._constraint_names(
316-
parent_model or model,
261+
model,
317262
columns,
318263
exclude=meta_constraint_names | meta_index_names,
319264
**constraint_kwargs,
@@ -325,17 +270,16 @@ def _remove_composed_index(
325270
f"Found wrong number ({num_found}) of constraints for "
326271
f"{model._meta.db_table}({columns_str})."
327272
)
328-
model = parent_model or model
329273
collection = self.get_collection(model._meta.db_table)
330274
collection.drop_index(constraint_names[0])
331275

332-
def _remove_field_index(self, model, field, column_prefix=""):
276+
def _remove_field_index(self, model, field):
333277
"""Remove a field's db_index=True index."""
334278
collection = self.get_collection(model._meta.db_table)
335279
meta_index_names = {index.name for index in model._meta.indexes}
336280
index_names = self._constraint_names(
337281
model,
338-
[column_prefix + field.column],
282+
[field.column],
339283
index=True,
340284
# Retrieve only BTREE indexes since this is what's created with
341285
# db_index=True.
@@ -351,31 +295,23 @@ def _remove_field_index(self, model, field, column_prefix=""):
351295
collection.drop_index(index_names[0])
352296

353297
@ignore_embedded_models
354-
def add_constraint(self, model, constraint, field=None, column_prefix="", parent_model=None):
298+
def add_constraint(self, model, constraint, field=None):
355299
if isinstance(constraint, UniqueConstraint) and self._unique_supported(
356300
condition=constraint.condition,
357301
deferrable=constraint.deferrable,
358302
include=constraint.include,
359303
expressions=constraint.expressions,
360304
nulls_distinct=constraint.nulls_distinct,
361305
):
362-
idx = constraint.get_pymongo_index_model(
363-
model,
364-
schema_editor=self,
365-
field=field,
366-
column_prefix=column_prefix,
367-
)
306+
idx = constraint.get_pymongo_index_model(model, schema_editor=self, field=field)
368307
if idx:
369-
model = parent_model or model
370308
collection = self.get_collection(model._meta.db_table)
371309
collection.create_indexes([idx])
372310

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-
)
311+
def _add_field_unique(self, model, field):
312+
name = str(self._unique_constraint_name(model._meta.db_table, [field.column]))
377313
constraint = UniqueConstraint(fields=[field.name], name=name)
378-
self.add_constraint(model, constraint, field=field, column_prefix=column_prefix)
314+
self.add_constraint(model, constraint, field=field)
379315

380316
@ignore_embedded_models
381317
def remove_constraint(self, model, constraint):
@@ -393,12 +329,12 @@ def remove_constraint(self, model, constraint):
393329
)
394330
self.remove_index(model, idx)
395331

396-
def _remove_field_unique(self, model, field, column_prefix=""):
332+
def _remove_field_unique(self, model, field):
397333
# Find the unique constraint for this field
398334
meta_constraint_names = {constraint.name for constraint in model._meta.constraints}
399335
constraint_names = self._constraint_names(
400336
model,
401-
[column_prefix + field.column],
337+
[field.column],
402338
unique=True,
403339
primary_key=False,
404340
exclude=meta_constraint_names,

0 commit comments

Comments
 (0)