viewy 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/db/migrate/20160513141153_add_index_recreation.rb +156 -0
- data/lib/viewy/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0d346f0a7be5e2986dfc28c44ce149b6fc47f5d
|
4
|
+
data.tar.gz: c771b0de1a80db6c793766f11a5ffb6ec32fc511
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 778cd9146f3d4be1c9f8ed9954b3316cc67e0ef6ee8df7adcc234dbf4820a0a23774310c74d818b0f7e304b0c2189b5b23000248b4c319eb5ca5f999e29e2781
|
7
|
+
data.tar.gz: 5d0a92306ab08af4e2725894f40fa5de6c3a032ff66931b3f700e15b7e17f0a8958bedf7002804723f81c42f92e53a8f0b61ed212e9fbb15d6de29db59cd2c91
|
@@ -0,0 +1,156 @@
|
|
1
|
+
class AddIndexRecreation < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
function_sql = <<-SQL
|
4
|
+
CREATE OR REPLACE FUNCTION replace_view(view_name TEXT, new_sql TEXT) RETURNS VOID AS $$
|
5
|
+
DECLARE
|
6
|
+
ordered_oids INTEGER[] := ARRAY(
|
7
|
+
SELECT oid FROM
|
8
|
+
(
|
9
|
+
WITH RECURSIVE dependency_graph(oid, depth, path, cycle) AS (
|
10
|
+
SELECT oid, 1, ARRAY[oid], FALSE
|
11
|
+
FROM pg_class
|
12
|
+
WHERE relname = view_name
|
13
|
+
UNION
|
14
|
+
SELECT
|
15
|
+
rewrites.ev_class,
|
16
|
+
dg.depth + 1,
|
17
|
+
dg.path || rewrites.ev_class,
|
18
|
+
rewrites.ev_class = ANY(dg.path)
|
19
|
+
FROM dependency_graph dg
|
20
|
+
JOIN pg_depend dependents ON dependents.refobjid = dg.oid
|
21
|
+
JOIN pg_rewrite rewrites ON rewrites.oid = dependents.objid
|
22
|
+
WHERE NOT dg.cycle
|
23
|
+
)
|
24
|
+
SELECT dependency_graph.OID, MIN(depth) AS min_depth FROM dependency_graph GROUP BY dependency_graph.OID ORDER BY min_depth
|
25
|
+
) ordered_dependents
|
26
|
+
);
|
27
|
+
create_statements TEXT[] := '{}';
|
28
|
+
index_statements TEXT[] := '{}';
|
29
|
+
current_index_statements TEXT[] := '{}';
|
30
|
+
current_statement TEXT;
|
31
|
+
current_index_statement TEXT;
|
32
|
+
view_drop_statement TEXT;
|
33
|
+
object_id INT;
|
34
|
+
BEGIN
|
35
|
+
FOREACH object_id IN ARRAY ordered_oids LOOP
|
36
|
+
SELECT
|
37
|
+
(CASE
|
38
|
+
WHEN (SELECT TRUE FROM pg_views WHERE viewname = relname) THEN
|
39
|
+
'CREATE OR REPLACE VIEW ' || pg_class.relname || ' AS ' || pg_get_viewdef(oid)
|
40
|
+
WHEN (SELECT TRUE FROM pg_matviews WHERE matviewname = relname) THEN
|
41
|
+
'CREATE MATERIALIZED VIEW ' || pg_class.relname || ' AS ' || TRIM(TRAILING ';' FROM pg_get_viewdef(oid)) || ' WITH NO DATA'
|
42
|
+
END)
|
43
|
+
INTO current_statement
|
44
|
+
FROM pg_class
|
45
|
+
WHERE oid = object_id
|
46
|
+
AND pg_class.relname != view_name;
|
47
|
+
IF current_statement IS NOT NULL THEN
|
48
|
+
create_statements = create_statements || current_statement;
|
49
|
+
SELECT INTO current_index_statements array_agg(pg_indexes.indexdef)
|
50
|
+
FROM pg_indexes
|
51
|
+
JOIN pg_class ON pg_class.relname = pg_indexes.tablename
|
52
|
+
WHERE pg_class.OID = object_id;
|
53
|
+
index_statements := array_cat(index_statements, current_index_statements);
|
54
|
+
END IF;
|
55
|
+
END LOOP;
|
56
|
+
ALTER EVENT TRIGGER view_dependencies_update DISABLE;
|
57
|
+
SELECT INTO current_index_statements array_agg(pg_indexes.indexdef)
|
58
|
+
FROM pg_indexes
|
59
|
+
WHERE pg_indexes.tablename = view_name;
|
60
|
+
SELECT
|
61
|
+
(
|
62
|
+
CASE
|
63
|
+
WHEN (SELECT TRUE FROM pg_views WHERE viewname = view_name) THEN
|
64
|
+
'DROP VIEW ' || view_name || ' CASCADE;'
|
65
|
+
WHEN (SELECT TRUE FROM pg_matviews WHERE matviewname = view_name) THEN
|
66
|
+
'DROP MATERIALIZED VIEW ' || view_name || ' CASCADE;'
|
67
|
+
END
|
68
|
+
)
|
69
|
+
INTO view_drop_statement;
|
70
|
+
EXECUTE view_drop_statement;
|
71
|
+
EXECUTE new_sql;
|
72
|
+
FOREACH current_statement IN ARRAY create_statements LOOP
|
73
|
+
EXECUTE current_statement;
|
74
|
+
END LOOP;
|
75
|
+
FOREACH current_index_statement IN ARRAY index_statements LOOP
|
76
|
+
EXECUTE current_index_statement;
|
77
|
+
END LOOP;
|
78
|
+
FOREACH current_index_statement IN ARRAY current_index_statements LOOP
|
79
|
+
EXECUTE current_index_statement;
|
80
|
+
END LOOP;
|
81
|
+
ALTER EVENT TRIGGER view_dependencies_update ENABLE ALWAYS;
|
82
|
+
END;
|
83
|
+
$$ LANGUAGE plpgsql;
|
84
|
+
SQL
|
85
|
+
execute function_sql
|
86
|
+
end
|
87
|
+
|
88
|
+
def down
|
89
|
+
function_sql = <<-SQL
|
90
|
+
CREATE OR REPLACE FUNCTION replace_view(view_name TEXT, new_sql TEXT) RETURNS VOID AS $$
|
91
|
+
DECLARE
|
92
|
+
ordered_oids INTEGER[] := ARRAY(
|
93
|
+
SELECT oid FROM
|
94
|
+
(
|
95
|
+
WITH RECURSIVE dependency_graph(oid, depth, path, cycle) AS (
|
96
|
+
SELECT oid, 1, ARRAY[oid], FALSE
|
97
|
+
FROM pg_class
|
98
|
+
WHERE relname = view_name
|
99
|
+
UNION
|
100
|
+
SELECT
|
101
|
+
rewrites.ev_class,
|
102
|
+
dg.depth + 1,
|
103
|
+
dg.path || rewrites.ev_class,
|
104
|
+
rewrites.ev_class = ANY(dg.path)
|
105
|
+
FROM dependency_graph dg
|
106
|
+
JOIN pg_depend dependents ON dependents.refobjid = dg.oid
|
107
|
+
JOIN pg_rewrite rewrites ON rewrites.oid = dependents.objid
|
108
|
+
WHERE NOT dg.cycle
|
109
|
+
)
|
110
|
+
SELECT dependency_graph.OID, MIN(depth) AS min_depth FROM dependency_graph GROUP BY dependency_graph.OID ORDER BY min_depth
|
111
|
+
) ordered_dependents
|
112
|
+
);
|
113
|
+
create_statements TEXT[] := '{}';
|
114
|
+
current_statement TEXT;
|
115
|
+
view_drop_statement TEXT;
|
116
|
+
object_id INT;
|
117
|
+
BEGIN
|
118
|
+
FOREACH object_id IN ARRAY ordered_oids LOOP
|
119
|
+
SELECT
|
120
|
+
(CASE
|
121
|
+
WHEN (SELECT TRUE FROM pg_views WHERE viewname = relname) THEN
|
122
|
+
'CREATE OR REPLACE VIEW ' || pg_class.relname || ' AS ' || pg_get_viewdef(oid)
|
123
|
+
WHEN (SELECT TRUE FROM pg_matviews WHERE matviewname = relname) THEN
|
124
|
+
'CREATE MATERIALIZED VIEW ' || pg_class.relname || ' AS ' || TRIM(TRAILING ';' FROM pg_get_viewdef(oid)) || ' WITH NO DATA'
|
125
|
+
END)
|
126
|
+
INTO current_statement
|
127
|
+
FROM pg_class
|
128
|
+
WHERE oid = object_id
|
129
|
+
AND pg_class.relname != view_name;
|
130
|
+
IF current_statement IS NOT NULL THEN
|
131
|
+
create_statements = create_statements || current_statement;
|
132
|
+
END IF;
|
133
|
+
END LOOP;
|
134
|
+
ALTER EVENT TRIGGER view_dependencies_update DISABLE;
|
135
|
+
SELECT
|
136
|
+
(
|
137
|
+
CASE
|
138
|
+
WHEN (SELECT TRUE FROM pg_views WHERE viewname = view_name) THEN
|
139
|
+
'DROP VIEW ' || view_name || ' CASCADE;'
|
140
|
+
WHEN (SELECT TRUE FROM pg_matviews WHERE matviewname = view_name) THEN
|
141
|
+
'DROP MATERIALIZED VIEW ' || view_name || ' CASCADE;'
|
142
|
+
END
|
143
|
+
)
|
144
|
+
INTO view_drop_statement;
|
145
|
+
EXECUTE view_drop_statement;
|
146
|
+
EXECUTE new_sql;
|
147
|
+
FOREACH current_statement IN ARRAY create_statements LOOP
|
148
|
+
EXECUTE current_statement;
|
149
|
+
END LOOP;
|
150
|
+
ALTER EVENT TRIGGER view_dependencies_update ENABLE ALWAYS;
|
151
|
+
END;
|
152
|
+
$$ LANGUAGE plpgsql;
|
153
|
+
SQL
|
154
|
+
execute function_sql
|
155
|
+
end
|
156
|
+
end
|
data/lib/viewy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: viewy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emerson Huitt
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- db/migrate/20150929205301_add_view_dependencies.rb
|
82
82
|
- db/migrate/20151005150022_update_dependency_views.rb
|
83
83
|
- db/migrate/20160512173021_update_view_replace_function.rb
|
84
|
+
- db/migrate/20160513141153_add_index_recreation.rb
|
84
85
|
- lib/tasks/viewy_tasks.rake
|
85
86
|
- lib/viewy.rb
|
86
87
|
- lib/viewy/acts_as_materialized_view.rb
|