fix mv index creation order

This commit is contained in:
Robert Lechte 2020-11-13 12:25:24 +11:00
parent 84e46bf481
commit a0b580eb14
4 changed files with 45 additions and 3 deletions

View File

@ -3,6 +3,8 @@ from __future__ import unicode_literals
from collections import OrderedDict as od from collections import OrderedDict as od
from functools import partial from functools import partial
import schemainspect
from .statements import Statements from .statements import Statements
from .util import differences from .util import differences
@ -602,6 +604,32 @@ class Changes(object):
self.i_target.enums, 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 @property
def sequences(self): def sequences(self):
return partial( return partial(

View File

@ -88,21 +88,23 @@ class Migration(object):
self.add(self.changes.privileges(drops_only=True)) self.add(self.changes.privileges(drops_only=True))
self.add(self.changes.non_pk_constraints(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.non_table_selectable_drops())
self.add(self.changes.pk_constraints(drops_only=True)) 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.tables_only_selectables())
self.add(self.changes.sequences(drops_only=True)) self.add(self.changes.sequences(drops_only=True))
self.add(self.changes.enums(drops_only=True, modifications=False)) self.add(self.changes.enums(drops_only=True, modifications=False))
self.add(self.changes.extensions(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.pk_constraints(creations_only=True))
self.add(self.changes.non_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.non_table_selectable_creations())
self.add(self.changes.mv_indexes(creations_only=True))
if privileges: if privileges:
self.add(self.changes.privileges(creations_only=True)) self.add(self.changes.privileges(creations_only=True))

View File

@ -8,3 +8,8 @@ create view v as
select id, a, max(b) select id, a, max(b)
from t from t
group by id; -- "a" is implied because "id" is primary key 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);

View File

@ -15,4 +15,11 @@ create or replace view "public"."v" as SELECT t.id,
t.a, t.a,
max(t.b) AS max max(t.b) AS max
FROM t FROM t
GROUP BY t.id; 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);