mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.1 KiB
90 lines
3.1 KiB
from django.db import migrations, models
|
|
|
|
_OLD_VIEW = """
|
|
create or replace view materia_materiaemtramitacao as
|
|
select m.id as id,
|
|
m.id as materia_id,
|
|
t.id as tramitacao_id,
|
|
t.unidade_tramitacao_destino_id as unidade_tramitacao_atual_id
|
|
from materia_materialegislativa m
|
|
inner join materia_tramitacao t on (m.id = t.materia_id)
|
|
where t.id = (select max(id) from materia_tramitacao where materia_id = m.id)
|
|
order by m.id DESC
|
|
"""
|
|
|
|
_NEW_VIEW = """
|
|
CREATE OR REPLACE VIEW materia_materiaemtramitacao AS
|
|
SELECT
|
|
m.id,
|
|
m.id AS materia_id,
|
|
t.id AS tramitacao_id,
|
|
t.unidade_tramitacao_destino_id AS unidade_tramitacao_atual_id
|
|
FROM materia_materialegislativa m
|
|
JOIN LATERAL (
|
|
SELECT
|
|
t.id,
|
|
t.unidade_tramitacao_destino_id
|
|
FROM materia_tramitacao t
|
|
WHERE t.materia_id = m.id
|
|
ORDER BY t.id DESC
|
|
LIMIT 1
|
|
) t ON true;
|
|
"""
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
# CREATE INDEX CONCURRENTLY cannot run inside a transaction.
|
|
atomic = False
|
|
|
|
dependencies = [
|
|
('materia', '0087_update_viewdb_materiaemtramitacao'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.RunSQL(sql=_NEW_VIEW, reverse_sql=_OLD_VIEW),
|
|
migrations.SeparateDatabaseAndState(
|
|
database_operations=[
|
|
# Um CREATE INDEX CONCURRENTLY interrompido deixa o índice
|
|
# criado porém inválido, e o IF NOT EXISTS abaixo o pularia
|
|
# na próxima execução. DROP INDEX sem CONCURRENTLY porque
|
|
# este não roda dentro de um bloco DO.
|
|
migrations.RunSQL(
|
|
sql="""
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (
|
|
SELECT 1
|
|
FROM pg_index i
|
|
JOIN pg_class c ON c.oid = i.indexrelid
|
|
WHERE c.relname = 'tram_materia_id_desc'
|
|
AND NOT i.indisvalid
|
|
) THEN
|
|
DROP INDEX tram_materia_id_desc;
|
|
END IF;
|
|
END $$;
|
|
""",
|
|
reverse_sql=migrations.RunSQL.noop,
|
|
),
|
|
migrations.RunSQL(
|
|
sql="""
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS
|
|
tram_materia_id_desc
|
|
ON materia_tramitacao (materia_id, id DESC)
|
|
""",
|
|
reverse_sql="""
|
|
DROP INDEX CONCURRENTLY IF EXISTS
|
|
tram_materia_id_desc
|
|
""",
|
|
),
|
|
],
|
|
state_operations=[
|
|
migrations.AddIndex(
|
|
model_name='tramitacao',
|
|
index=models.Index(
|
|
fields=['materia', '-id'],
|
|
name='tram_materia_id_desc',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
]
|
|
|