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 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