activerecord_views 0.0.8 → 0.0.9
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/lib/active_record_views/checksum_cache.rb +2 -2
- data/lib/active_record_views/extension.rb +1 -1
- data/lib/active_record_views/railtie.rb +4 -0
- data/lib/active_record_views/version.rb +1 -1
- data/lib/active_record_views.rb +17 -8
- data/lib/tasks/active_record_views.rake +9 -0
- data/spec/active_record_views_extension_spec.rb +9 -1
- data/spec/active_record_views_spec.rb +4 -4
- data/spec/internal/app/models/dependency_b.rb +1 -1
- data/spec/internal/app/models/dependency_c.rb +3 -0
- data/spec/spec_helper.rb +5 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d730fc5ba86879e6e1a74f23f1e3320809d37e8d
|
4
|
+
data.tar.gz: dc5a5b0e4453124be60b9ed57178fd81f763617d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5281382c91bde1d07a1784d781d6c618c14e059201c3d252e1d1490bd47bd2fc52890134b715430f5a29f8ae6bbbb5ac9916d9d2d6e7f3ffc7f452cf94442a53
|
7
|
+
data.tar.gz: 1286c8ea11028e69b5c4e850600d1b8899672e80ee5618648e98c37fc7ec9864ddc2476e3d2dd926f0a77dfc7f65f37c2c59a486fca008e0b09c2a4fb507a7bb
|
@@ -45,7 +45,7 @@ module ActiveRecordViews
|
|
45
45
|
end
|
46
46
|
options_json = JSON.dump(options)
|
47
47
|
|
48
|
-
rows_updated = @connection.update(<<-SQL)
|
48
|
+
rows_updated = @connection.update(<<-SQL.squish)
|
49
49
|
UPDATE active_record_views
|
50
50
|
SET
|
51
51
|
class_name = #{@connection.quote data[:class_name]},
|
@@ -57,7 +57,7 @@ module ActiveRecordViews
|
|
57
57
|
SQL
|
58
58
|
|
59
59
|
if rows_updated == 0
|
60
|
-
@connection.insert <<-SQL
|
60
|
+
@connection.insert <<-SQL.squish
|
61
61
|
INSERT INTO active_record_views (
|
62
62
|
name,
|
63
63
|
class_name,
|
@@ -52,7 +52,7 @@ module ActiveRecordViews
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def view_populated?
|
55
|
-
value = connection.select_value(<<-SQL)
|
55
|
+
value = connection.select_value(<<-SQL.squish)
|
56
56
|
SELECT ispopulated
|
57
57
|
FROM pg_matviews
|
58
58
|
WHERE schemaname = 'public' AND matviewname = #{connection.quote self.table_name};
|
data/lib/active_record_views.rb
CHANGED
@@ -96,7 +96,7 @@ module ActiveRecordViews
|
|
96
96
|
|
97
97
|
def self.execute_create_view(connection, name, sql, options)
|
98
98
|
options.assert_valid_keys :materialized, :unique_columns
|
99
|
-
sql = sql.sub(/;\s
|
99
|
+
sql = sql.sub(/;\s*\z/, '')
|
100
100
|
|
101
101
|
if options[:materialized]
|
102
102
|
connection.execute "CREATE MATERIALIZED VIEW #{connection.quote_table_name name} AS #{sql} WITH NO DATA;"
|
@@ -105,7 +105,7 @@ module ActiveRecordViews
|
|
105
105
|
end
|
106
106
|
|
107
107
|
if options[:unique_columns]
|
108
|
-
connection.execute <<-SQL
|
108
|
+
connection.execute <<-SQL.squish
|
109
109
|
CREATE UNIQUE INDEX #{connection.quote_table_name "#{name}_pkey"}
|
110
110
|
ON #{connection.quote_table_name name}(
|
111
111
|
#{options[:unique_columns].map { |column_name| connection.quote_table_name(column_name) }.join(', ')}
|
@@ -123,7 +123,7 @@ module ActiveRecordViews
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def self.view_exists?(connection, name)
|
126
|
-
connection.select_value(<<-SQL).present?
|
126
|
+
connection.select_value(<<-SQL.squish).present?
|
127
127
|
SELECT 1
|
128
128
|
FROM information_schema.views
|
129
129
|
WHERE table_schema = 'public' AND table_name = #{connection.quote name}
|
@@ -135,7 +135,7 @@ module ActiveRecordViews
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def self.materialized_view?(connection, name)
|
138
|
-
connection.select_value(<<-SQL).present?
|
138
|
+
connection.select_value(<<-SQL.squish).present?
|
139
139
|
SELECT 1
|
140
140
|
FROM pg_matviews
|
141
141
|
WHERE schemaname = 'public' AND matviewname = #{connection.quote name};
|
@@ -147,7 +147,7 @@ module ActiveRecordViews
|
|
147
147
|
end
|
148
148
|
|
149
149
|
def self.get_view_dependencies(connection, name)
|
150
|
-
connection.select_rows <<-SQL
|
150
|
+
connection.select_rows <<-SQL.squish
|
151
151
|
WITH RECURSIVE dependants AS (
|
152
152
|
SELECT
|
153
153
|
#{connection.quote name}::regclass::oid,
|
@@ -197,13 +197,22 @@ module ActiveRecordViews
|
|
197
197
|
yield
|
198
198
|
|
199
199
|
dependencies.each do |dependency_name, class_name, definition, options_json|
|
200
|
+
create_view_exception = begin
|
201
|
+
connection.transaction :requires_new => true do
|
202
|
+
options = JSON.load(options_json).symbolize_keys
|
203
|
+
execute_create_view connection, dependency_name, definition, options
|
204
|
+
cache.set dependency_name, dependency_metadata[dependency_name]
|
205
|
+
end
|
206
|
+
nil
|
207
|
+
rescue StandardError => e
|
208
|
+
e
|
209
|
+
end
|
210
|
+
|
200
211
|
begin
|
201
212
|
class_name.constantize
|
202
213
|
rescue NameError => e
|
203
214
|
raise unless e.missing_name?(class_name)
|
204
|
-
|
205
|
-
execute_create_view connection, dependency_name, definition, options
|
206
|
-
cache.set dependency_name, dependency_metadata[dependency_name]
|
215
|
+
raise create_view_exception unless create_view_exception.nil?
|
207
216
|
end
|
208
217
|
end
|
209
218
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Rake::Task['db:structure:dump'].enhance do
|
2
|
+
if ActiveRecord::Base.connection.table_exists?('active_record_views')
|
3
|
+
filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
|
4
|
+
config = current_config
|
5
|
+
set_psql_env(config)
|
6
|
+
system("pg_dump --data-only --table=active_record_views #{Shellwords.escape config['database']} >> #{Shellwords.escape filename}")
|
7
|
+
raise 'active_record_views metadata dump failed' unless $?.success?
|
8
|
+
end
|
9
|
+
end
|
@@ -99,12 +99,20 @@ describe ActiveRecordViews::Extension do
|
|
99
99
|
|
100
100
|
it 'successfully restores dependant view when temporarily dropping dependency' do
|
101
101
|
ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_as', 'DependencyA', 'SELECT 42 AS foo, 1 AS id;'
|
102
|
-
ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_bs', 'DependencyB', 'SELECT
|
102
|
+
ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_bs', 'DependencyB', 'SELECT id FROM dependency_as;'
|
103
103
|
|
104
104
|
expect(DependencyA.first.id).to eq 2
|
105
105
|
expect(DependencyB.first.id).to eq 2
|
106
106
|
end
|
107
107
|
|
108
|
+
it 'sucessfully restore dependant view and dependency when loading from middle outwards' do
|
109
|
+
ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_as', 'DependencyA', 'SELECT 42 AS foo, 1 AS id;'
|
110
|
+
ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_bs', 'DependencyB', 'SELECT id FROM dependency_as;'
|
111
|
+
ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_cs', 'DependencyC', 'SELECT id FROM dependency_bs;'
|
112
|
+
|
113
|
+
expect(DependencyB.first.id).to eq 2
|
114
|
+
end
|
115
|
+
|
108
116
|
it 'errors if more than one argument is specified' do
|
109
117
|
expect {
|
110
118
|
class TooManyArguments < ActiveRecord::Base
|
@@ -13,7 +13,7 @@ describe ActiveRecordViews do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_view_sql
|
16
|
-
connection.select_value(<<-SQL).try(&:squish)
|
16
|
+
connection.select_value(<<-SQL.squish).try(&:squish)
|
17
17
|
SELECT view_definition
|
18
18
|
FROM information_schema.views
|
19
19
|
WHERE table_schema = 'public' AND table_name = 'test'
|
@@ -21,7 +21,7 @@ describe ActiveRecordViews do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def view_names
|
24
|
-
connection.select_values
|
24
|
+
connection.select_values(<<-SQL.squish)
|
25
25
|
SELECT table_name
|
26
26
|
FROM information_schema.views
|
27
27
|
WHERE table_schema = 'public'
|
@@ -29,7 +29,7 @@ describe ActiveRecordViews do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_materialized_view_sql
|
32
|
-
connection.select_value(<<-SQL).try(&:squish)
|
32
|
+
connection.select_value(<<-SQL.squish).try(&:squish)
|
33
33
|
SELECT definition
|
34
34
|
FROM pg_matviews
|
35
35
|
WHERE schemaname = 'public' AND matviewname = 'test'
|
@@ -37,7 +37,7 @@ describe ActiveRecordViews do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def materialized_view_names
|
40
|
-
connection.select_values
|
40
|
+
connection.select_values(<<-SQL.squish)
|
41
41
|
SELECT matviewname
|
42
42
|
FROM pg_matviews
|
43
43
|
WHERE schemaname = 'public'
|
data/spec/spec_helper.rb
CHANGED
@@ -16,11 +16,14 @@ RSpec.configure do |config|
|
|
16
16
|
config.use_transactional_fixtures = false
|
17
17
|
|
18
18
|
config.before do
|
19
|
+
ActionDispatch::Reloader.cleanup!
|
20
|
+
ActionDispatch::Reloader.prepare!
|
21
|
+
|
19
22
|
connection = ActiveRecord::Base.connection
|
20
23
|
|
21
24
|
connection.execute 'DROP TABLE IF EXISTS active_record_views'
|
22
25
|
|
23
|
-
view_names = connection.select_values
|
26
|
+
view_names = connection.select_values(<<-SQL.squish)
|
24
27
|
SELECT table_name
|
25
28
|
FROM information_schema.views
|
26
29
|
WHERE table_schema = 'public';
|
@@ -29,7 +32,7 @@ RSpec.configure do |config|
|
|
29
32
|
connection.execute "DROP VIEW IF EXISTS #{connection.quote_table_name view_name} CASCADE"
|
30
33
|
end
|
31
34
|
|
32
|
-
materialized_view_names = connection.select_values
|
35
|
+
materialized_view_names = connection.select_values(<<-SQL.squish)
|
33
36
|
SELECT matviewname
|
34
37
|
FROM pg_matviews
|
35
38
|
WHERE schemaname = 'public'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_views
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Weathered
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -112,11 +112,13 @@ files:
|
|
112
112
|
- lib/active_record_views/registered_view.rb
|
113
113
|
- lib/active_record_views/version.rb
|
114
114
|
- lib/activerecord_views.rb
|
115
|
+
- lib/tasks/active_record_views.rake
|
115
116
|
- spec/active_record_views_checksum_cache_spec.rb
|
116
117
|
- spec/active_record_views_extension_spec.rb
|
117
118
|
- spec/active_record_views_spec.rb
|
118
119
|
- spec/internal/app/models/dependency_a.rb
|
119
120
|
- spec/internal/app/models/dependency_b.rb
|
121
|
+
- spec/internal/app/models/dependency_c.rb
|
120
122
|
- spec/internal/app/models/erb_test_model.rb
|
121
123
|
- spec/internal/app/models/erb_test_model.sql.erb
|
122
124
|
- spec/internal/app/models/external_file_test_model.rb
|
@@ -160,6 +162,7 @@ test_files:
|
|
160
162
|
- spec/active_record_views_spec.rb
|
161
163
|
- spec/internal/app/models/dependency_a.rb
|
162
164
|
- spec/internal/app/models/dependency_b.rb
|
165
|
+
- spec/internal/app/models/dependency_c.rb
|
163
166
|
- spec/internal/app/models/erb_test_model.rb
|
164
167
|
- spec/internal/app/models/erb_test_model.sql.erb
|
165
168
|
- spec/internal/app/models/external_file_test_model.rb
|