|
1 |
| -from collections import defaultdict |
2 |
| - |
3 | 1 | from django.db.backends.base.schema import BaseDatabaseSchemaEditor
|
4 | 2 | from django.db.models import Index, UniqueConstraint
|
5 |
| -from pymongo import ASCENDING, DESCENDING |
6 |
| -from pymongo.operations import IndexModel |
7 | 3 |
|
8 | 4 | from .fields import EmbeddedModelField
|
9 | 5 | from .query import wrap_database_errors
|
@@ -264,43 +260,12 @@ def alter_unique_together(
|
264 | 260 | def add_index(
|
265 | 261 | self, model, index, *, field=None, unique=False, column_prefix="", parent_model=None
|
266 | 262 | ):
|
267 |
| - if index.contains_expressions: |
268 |
| - return |
269 |
| - kwargs = {} |
270 |
| - filter_expression = defaultdict(dict) |
271 |
| - if index.condition: |
272 |
| - filter_expression.update(index._get_condition_mql(model, self)) |
273 |
| - if unique: |
274 |
| - kwargs["unique"] = True |
275 |
| - # Indexing on $type matches the value of most SQL databases by |
276 |
| - # allowing multiple null values for the unique constraint. |
277 |
| - if field: |
278 |
| - column = column_prefix + field.column |
279 |
| - filter_expression[column].update({"$type": field.db_type(self.connection)}) |
280 |
| - else: |
281 |
| - for field_name, _ in index.fields_orders: |
282 |
| - field_ = model._meta.get_field(field_name) |
283 |
| - filter_expression[field_.column].update( |
284 |
| - {"$type": field_.db_type(self.connection)} |
285 |
| - ) |
286 |
| - if filter_expression: |
287 |
| - kwargs["partialFilterExpression"] = filter_expression |
288 |
| - index_orders = ( |
289 |
| - [(column_prefix + field.column, ASCENDING)] |
290 |
| - if field |
291 |
| - else [ |
292 |
| - # order is "" if ASCENDING or "DESC" if DESCENDING (see |
293 |
| - # django.db.models.indexes.Index.fields_orders). |
294 |
| - ( |
295 |
| - column_prefix + model._meta.get_field(field_name).column, |
296 |
| - ASCENDING if order == "" else DESCENDING, |
297 |
| - ) |
298 |
| - for field_name, order in index.fields_orders |
299 |
| - ] |
| 263 | + idx = index.create_mongodb_index( |
| 264 | + model, self, field=field, unique=unique, column_prefix=column_prefix |
300 | 265 | )
|
301 |
| - idx = IndexModel(index_orders, name=index.name, **kwargs) |
302 |
| - model = parent_model or model |
303 |
| - self.get_collection(model._meta.db_table).create_indexes([idx]) |
| 266 | + if idx: |
| 267 | + model = parent_model or model |
| 268 | + self.get_collection(model._meta.db_table).create_indexes([idx]) |
304 | 269 |
|
305 | 270 | def _add_composed_index(self, model, field_names, column_prefix="", parent_model=None):
|
306 | 271 | """Add an index on the given list of field_names."""
|
|
0 commit comments