viewy 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|