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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62560b62ac3aa4943d8558eb2c6b9579bf65e57b
4
- data.tar.gz: 0f5670763c82cebadaf5f968cddd0bee6fefe8e4
3
+ metadata.gz: d0d346f0a7be5e2986dfc28c44ce149b6fc47f5d
4
+ data.tar.gz: c771b0de1a80db6c793766f11a5ffb6ec32fc511
5
5
  SHA512:
6
- metadata.gz: f4e4c8ad48a4964fa2290bfa9c7186e8700e4a89620f859d20e3acd2091ae8d2ebef75f152fadcb94051fbf028b895af21cbe40cedeff7078b3dc9b5c2897284
7
- data.tar.gz: 5efc54a37a6e6d12621f033abb3bafeab1c039b4a7e2cdbdd303f94c1fa89e8d94e5c30fbf33d2a79aa5f087687f520eb6f3c2fb1365832d745f0dbf922b2219
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
@@ -1,3 +1,3 @@
1
1
  module Viewy
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
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.0
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