diff --git a/migra/changes.py b/migra/changes.py index 14be97f..264bb10 100644 --- a/migra/changes.py +++ b/migra/changes.py @@ -3,6 +3,8 @@ from __future__ import unicode_literals from collections import OrderedDict as od from functools import partial +import schemainspect + from .statements import Statements from .util import differences @@ -602,6 +604,32 @@ class Changes(object): self.i_target.enums, ) + @property + def mv_indexes(self): + a = self.i_from.indexes.items() + b = self.i_target.indexes.items() + + def is_mv_index(i, ii): + sig = schemainspect.misc.quoted_identifier(i.table_name, i.schema) + return sig in ii.materialized_views + + a_od = od((k, v) for k, v in a if is_mv_index(v, self.i_from)) + b_od = od((k, v) for k, v in b if is_mv_index(v, self.i_target)) + return partial(statements_for_changes, a_od, b_od) + + @property + def non_mv_indexes(self): + a = self.i_from.indexes.items() + b = self.i_target.indexes.items() + + def is_mv_index(i, ii): + sig = schemainspect.misc.quoted_identifier(i.table_name, i.schema) + return sig in ii.materialized_views + + a_od = od((k, v) for k, v in a if not is_mv_index(v, self.i_from)) + b_od = od((k, v) for k, v in b if not is_mv_index(v, self.i_target)) + return partial(statements_for_changes, a_od, b_od) + @property def sequences(self): return partial( diff --git a/migra/migra.py b/migra/migra.py index 2ff5e51..739b850 100644 --- a/migra/migra.py +++ b/migra/migra.py @@ -88,21 +88,23 @@ class Migration(object): self.add(self.changes.privileges(drops_only=True)) self.add(self.changes.non_pk_constraints(drops_only=True)) + self.add(self.changes.mv_indexes(drops_only=True)) self.add(self.changes.non_table_selectable_drops()) self.add(self.changes.pk_constraints(drops_only=True)) - self.add(self.changes.indexes(drops_only=True)) + self.add(self.changes.non_mv_indexes(drops_only=True)) self.add(self.changes.tables_only_selectables()) self.add(self.changes.sequences(drops_only=True)) self.add(self.changes.enums(drops_only=True, modifications=False)) self.add(self.changes.extensions(drops_only=True, modifications=False)) - self.add(self.changes.indexes(creations_only=True)) + self.add(self.changes.non_mv_indexes(creations_only=True)) self.add(self.changes.pk_constraints(creations_only=True)) self.add(self.changes.non_pk_constraints(creations_only=True)) self.add(self.changes.non_table_selectable_creations()) + self.add(self.changes.mv_indexes(creations_only=True)) if privileges: self.add(self.changes.privileges(creations_only=True)) diff --git a/tests/FIXTURES/dependencies4/b.sql b/tests/FIXTURES/dependencies4/b.sql index 65b2764..49985af 100644 --- a/tests/FIXTURES/dependencies4/b.sql +++ b/tests/FIXTURES/dependencies4/b.sql @@ -8,3 +8,8 @@ create view v as select id, a, max(b) from t group by id; -- "a" is implied because "id" is primary key + + +create materialized view mv as select id from v; + +create unique index on mv (id); \ No newline at end of file diff --git a/tests/FIXTURES/dependencies4/expected.sql b/tests/FIXTURES/dependencies4/expected.sql index ee500bd..8b67af1 100644 --- a/tests/FIXTURES/dependencies4/expected.sql +++ b/tests/FIXTURES/dependencies4/expected.sql @@ -15,4 +15,11 @@ create or replace view "public"."v" as SELECT t.id, t.a, max(t.b) AS max FROM t - GROUP BY t.id; \ No newline at end of file + GROUP BY t.id; + + +create materialized view "public"."mv" as SELECT v.id + FROM v; + + +CREATE UNIQUE INDEX mv_id_idx ON public.mv USING btree (id); \ No newline at end of file