Commit c5eca746 authored by Markus Holtermann's avatar Markus Holtermann
Browse files

Sorted reduce methods in migration optimizer

Thanks Tim Graham for the review.
parent e470f311
Loading
Loading
Loading
Loading
+70 −60
Original line number Diff line number Diff line
@@ -32,30 +32,26 @@ class MigrationOptimizer(object):
            AlterField,
        )
        self.reduce_methods = {
            (AddField, AlterField): self.reduce_add_field_alter_field,
            (AddField, RemoveField): self.reduce_add_field_delete_field,
            (AlterField, RemoveField): self.reduce_alter_field_delete_field,
            # (model operation, model operation)
            (CreateModel, DeleteModel): self.reduce_create_model_delete_model,
            (CreateModel, RenameModel): self.reduce_create_model_rename_model,
            (RenameModel, RenameModel): self.reduce_rename_model_rename_model,

            (AlterIndexTogether, AlterIndexTogether): self.reduce_alter_model_alter_model,
            (AlterModelTable, AlterModelTable): self.reduce_alter_model_alter_model,
            (AlterOrderWithRespectTo, AlterOrderWithRespectTo): self.reduce_alter_model_alter_model,
            (AlterUniqueTogether, AlterUniqueTogether): self.reduce_alter_model_alter_model,

            (AlterIndexTogether, DeleteModel): self.reduce_alter_model_delete_model,
            (AlterModelTable, DeleteModel): self.reduce_alter_model_delete_model,
            (AlterOrderWithRespectTo, DeleteModel): self.reduce_alter_model_delete_model,
            (AlterUniqueTogether, DeleteModel): self.reduce_alter_model_delete_model,

            # (model operation, field operation)
            (CreateModel, AddField): self.reduce_create_model_add_field,
            (CreateModel, AlterField): self.reduce_create_model_alter_field,
            (CreateModel, DeleteModel): self.reduce_model_create_delete,
            (CreateModel, RemoveField): self.reduce_create_model_remove_field,
            (CreateModel, RenameModel): self.reduce_model_create_rename,
            (RenameModel, RenameModel): self.reduce_model_rename_self,

            (AlterIndexTogether, DeleteModel): self.reduce_model_alter_delete,
            (AlterModelTable, DeleteModel): self.reduce_model_alter_delete,
            (AlterOrderWithRespectTo, DeleteModel): self.reduce_model_alter_delete,
            (AlterUniqueTogether, DeleteModel): self.reduce_model_alter_delete,

            (AlterIndexTogether, AlterIndexTogether): self.reduce_model_alter_alter,
            (AlterModelTable, AlterModelTable): self.reduce_model_alter_alter,
            (AlterOrderWithRespectTo, AlterOrderWithRespectTo): self.reduce_model_alter_alter,
            (AlterUniqueTogether, AlterUniqueTogether): self.reduce_model_alter_alter,

            (AddField, RenameField): self.reduce_add_field_rename_field,
            (AlterField, RenameField): self.reduce_alter_field_rename_field,
            (CreateModel, RenameField): self.reduce_create_model_rename_field,
            (RenameField, RenameField): self.reduce_rename_field_self,

            (AlterIndexTogether, AddField): self.reduce_alter_model_addalterremove_field,
            (AlterIndexTogether, AlterField): self.reduce_alter_model_addalterremove_field,
@@ -70,6 +66,14 @@ class MigrationOptimizer(object):
            (AlterIndexTogether, RenameField): self.reduce_alter_model_rename_field,
            (AlterOrderWithRespectTo, RenameField): self.reduce_alter_model_rename_field,
            (AlterUniqueTogether, RenameField): self.reduce_alter_model_rename_field,

            # (field operation, field operation)
            (AddField, AlterField): self.reduce_add_field_alter_field,
            (AddField, RemoveField): self.reduce_add_field_remove_field,
            (AddField, RenameField): self.reduce_add_field_rename_field,
            (AlterField, RemoveField): self.reduce_alter_field_remove_field,
            (AlterField, RenameField): self.reduce_alter_field_rename_field,
            (RenameField, RenameField): self.reduce_rename_field_rename_field,
        }

    def optimize(self, operations, app_label=None):
@@ -148,7 +152,9 @@ class MigrationOptimizer(object):
                model._meta.object_name,
            )

    def reduce_model_create_delete(self, operation, other, in_between):
    # REDUCE METHODS: (MODEL OPERATION, MODEL OPERATION)

    def reduce_create_model_delete_model(self, operation, other, in_between):
        """
        Folds a CreateModel and a DeleteModel into nothing.
        """
@@ -156,22 +162,7 @@ class MigrationOptimizer(object):
                not operation.options.get("proxy", False)):
            return []

    def reduce_model_alter_delete(self, operation, other, in_between):
        """
        Folds an AlterModelSomething and a DeleteModel into just delete.
        """
        if operation.name_lower == other.name_lower:
            return [other]

    def reduce_model_alter_alter(self, operation, other, in_between):
        """
        Folds two AlterModelTable, AlterFooTogether, or AlterOrderWithRespectTo
        operations into the latter.
        """
        if operation.name_lower == other.name_lower:
            return [other]

    def reduce_model_create_rename(self, operation, other, in_between):
    def reduce_create_model_rename_model(self, operation, other, in_between):
        """
        Folds a model rename into its create
        """
@@ -186,7 +177,7 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_model_rename_self(self, operation, other, in_between):
    def reduce_rename_model_rename_model(self, operation, other, in_between):
        """
        Folds a model rename into another one
        """
@@ -198,6 +189,23 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_alter_model_alter_model(self, operation, other, in_between):
        """
        Folds two AlterModelTable, AlterFooTogether, or AlterOrderWithRespectTo
        operations into the latter.
        """
        if operation.name_lower == other.name_lower:
            return [other]

    def reduce_alter_model_delete_model(self, operation, other, in_between):
        """
        Folds an AlterModelSomething and a DeleteModel into just delete.
        """
        if operation.name_lower == other.name_lower:
            return [other]

    # REDUCE METHODS: (MODEL OPERATION, FIELD OPERATION)

    def reduce_create_model_add_field(self, operation, other, in_between):
        if operation.name_lower == other.model_name_lower:
            # Don't allow optimizations of FKs through models they reference
@@ -238,14 +246,15 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_create_model_rename_field(self, operation, other, in_between):
    def reduce_create_model_remove_field(self, operation, other, in_between):
        if operation.name_lower == other.model_name_lower:
            return [
                CreateModel(
                    operation.name,
                    fields=[
                        (other.new_name if n == other.old_name else n, v)
                        (n, v)
                        for n, v in operation.fields
                        if n.lower() != other.name_lower
                    ],
                    options=operation.options,
                    bases=operation.bases,
@@ -253,15 +262,14 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_create_model_remove_field(self, operation, other, in_between):
    def reduce_create_model_rename_field(self, operation, other, in_between):
        if operation.name_lower == other.model_name_lower:
            return [
                CreateModel(
                    operation.name,
                    fields=[
                        (n, v)
                        (other.new_name if n == other.old_name else n, v)
                        for n, v in operation.fields
                        if n.lower() != other.name_lower
                    ],
                    options=operation.options,
                    bases=operation.bases,
@@ -269,6 +277,18 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_alter_model_addalterremove_field(self, operation, other, in_between):
        if (operation.name_lower == other.model_name_lower and
                not operation.references_field(other.model_name, other.name)):
            return [other, operation]

    def reduce_alter_model_rename_field(self, operation, other, in_between):
        if (operation.name_lower == other.model_name_lower and
                not operation.references_field(other.model_name, other.old_name)):
            return [other, operation]

    # REDUCE METHODS: (FIELD OPERATION, FIELD OPERATION)

    def reduce_add_field_alter_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.name_lower == other.name_lower):
@@ -280,16 +300,11 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_add_field_delete_field(self, operation, other, in_between):
    def reduce_add_field_remove_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.name_lower == other.name_lower):
            return []

    def reduce_alter_field_delete_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.name_lower == other.name_lower):
            return [other]

    def reduce_add_field_rename_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.name_lower == other.old_name_lower):
@@ -301,6 +316,11 @@ class MigrationOptimizer(object):
                )
            ]

    def reduce_alter_field_remove_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.name_lower == other.name_lower):
            return [other]

    def reduce_alter_field_rename_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.name_lower == other.old_name_lower):
@@ -313,7 +333,7 @@ class MigrationOptimizer(object):
                ),
            ]

    def reduce_rename_field_self(self, operation, other, in_between):
    def reduce_rename_field_rename_field(self, operation, other, in_between):
        if (operation.model_name_lower == other.model_name_lower and
                operation.new_name_lower == other.old_name_lower):
            return [
@@ -324,16 +344,6 @@ class MigrationOptimizer(object):
                ),
            ]

    def reduce_alter_model_addalterremove_field(self, operation, other, in_between):
        if (operation.name_lower == other.model_name_lower and
                not operation.references_field(other.model_name, other.name)):
            return [other, operation]

    def reduce_alter_model_rename_field(self, operation, other, in_between):
        if (operation.name_lower == other.model_name_lower and
                not operation.references_field(other.model_name, other.old_name)):
            return [other, operation]

    # THROUGH CHECKS

    def can_optimize_through(self, operation, other, app_label=None):