activerecord_views 0.0.7 → 0.0.8
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/README.markdown +2 -2
- data/lib/active_record_views/extension.rb +13 -1
- data/lib/active_record_views/version.rb +1 -1
- data/lib/active_record_views.rb +5 -0
- data/spec/active_record_views_extension_spec.rb +30 -0
- data/spec/internal/app/models/dependency_a.rb +3 -0
- data/spec/internal/app/models/dependency_b.rb +3 -0
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 373526856a79d7a2d2c97de39373d0a9a791e70c
|
4
|
+
data.tar.gz: 942cecdc3e31f8417166778362f19567ce16774f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18d20a0204d37764802b32ef58fd532f8c39cd6ad82b786eb55c4b2d3bd298fa67a84afac9bedb3cb6ca58fd45e280bac0d3852f11d3f92f53625a5f4f4fe653
|
7
|
+
data.tar.gz: 68d3db12c7ea7c8cdaafb1391efab4a9f5a59ad579069ca8246ed47abf1c028b48ffa41b16a2eadfbfacfbe7194e10a9cc9222f5c01def2576c39830e708e69f
|
data/README.markdown
CHANGED
@@ -102,10 +102,10 @@ end
|
|
102
102
|
|
103
103
|
Note: If your view has a single column as the unique key, you can also tell ActiveRecord about it by adding `self.primary_key = :account_id` in your model file. This is required for features such as `.find` and `.find_each` to work.
|
104
104
|
|
105
|
-
Once you have defined the unique columns for the view, you can then use `concurrent: true` when
|
105
|
+
Once you have defined the unique columns for the view, you can then use `concurrent: true` to force a concurrent refresh or `concurrent: :auto` to concurrently refresh when possible:
|
106
106
|
|
107
107
|
```ruby
|
108
|
-
AccountBalance.refresh_view! concurrent:
|
108
|
+
AccountBalance.refresh_view! concurrent: :auto
|
109
109
|
```
|
110
110
|
|
111
111
|
## Pre-populating views in Rails development mode
|
@@ -36,7 +36,19 @@ module ActiveRecordViews
|
|
36
36
|
|
37
37
|
def refresh_view!(options = {})
|
38
38
|
options.assert_valid_keys :concurrent
|
39
|
-
|
39
|
+
|
40
|
+
concurrent = case options[:concurrent]
|
41
|
+
when nil, false
|
42
|
+
false
|
43
|
+
when true
|
44
|
+
true
|
45
|
+
when :auto
|
46
|
+
view_populated? && ActiveRecordViews.supports_concurrent_refresh?(connection)
|
47
|
+
else
|
48
|
+
raise ArgumentError, 'invalid concurrent option'
|
49
|
+
end
|
50
|
+
|
51
|
+
connection.execute "REFRESH MATERIALIZED VIEW#{' CONCURRENTLY' if concurrent} #{connection.quote_table_name self.table_name};"
|
40
52
|
end
|
41
53
|
|
42
54
|
def view_populated?
|
data/lib/active_record_views.rb
CHANGED
@@ -185,9 +185,13 @@ module ActiveRecordViews
|
|
185
185
|
end
|
186
186
|
|
187
187
|
dependencies = get_view_dependencies(connection, name)
|
188
|
+
cache = ActiveRecordViews::ChecksumCache.new(connection)
|
189
|
+
dependency_metadata = {}
|
188
190
|
|
189
191
|
dependencies.reverse.each do |dependency_name, _, _, _|
|
190
192
|
execute_drop_view connection, dependency_name
|
193
|
+
dependency_metadata[dependency_name] = cache.get(dependency_name)
|
194
|
+
cache.set dependency_name, nil
|
191
195
|
end
|
192
196
|
|
193
197
|
yield
|
@@ -199,6 +203,7 @@ module ActiveRecordViews
|
|
199
203
|
raise unless e.missing_name?(class_name)
|
200
204
|
options = JSON.load(options_json).symbolize_keys
|
201
205
|
execute_create_view connection, dependency_name, definition, options
|
206
|
+
cache.set dependency_name, dependency_metadata[dependency_name]
|
202
207
|
end
|
203
208
|
end
|
204
209
|
end
|
@@ -97,6 +97,14 @@ describe ActiveRecordViews::Extension do
|
|
97
97
|
expect(ModifiedB.first.attributes.except(nil)).to eq('new_name' => 22)
|
98
98
|
end
|
99
99
|
|
100
|
+
it 'successfully restores dependant view when temporarily dropping dependency' do
|
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 * FROM dependency_as;'
|
103
|
+
|
104
|
+
expect(DependencyA.first.id).to eq 2
|
105
|
+
expect(DependencyB.first.id).to eq 2
|
106
|
+
end
|
107
|
+
|
100
108
|
it 'errors if more than one argument is specified' do
|
101
109
|
expect {
|
102
110
|
class TooManyArguments < ActiveRecord::Base
|
@@ -166,5 +174,27 @@ describe ActiveRecordViews::Extension do
|
|
166
174
|
MaterializedViewRefreshTestModel.refresh_view!
|
167
175
|
MaterializedViewConcurrentRefreshTestModel.refresh_view! concurrent: true
|
168
176
|
end
|
177
|
+
|
178
|
+
it 'supports opportunistically refreshing materialized views concurrently' do
|
179
|
+
class MaterializedViewAutoRefreshTestModel < ActiveRecord::Base
|
180
|
+
is_view 'SELECT 1 AS id;', materialized: true, unique_columns: [:id]
|
181
|
+
end
|
182
|
+
|
183
|
+
expect(ActiveRecord::Base.connection).to receive(:execute).with('REFRESH MATERIALIZED VIEW "materialized_view_auto_refresh_test_models";').once.and_call_original
|
184
|
+
expect(ActiveRecord::Base.connection).to receive(:execute).with('REFRESH MATERIALIZED VIEW CONCURRENTLY "materialized_view_auto_refresh_test_models";').once.and_call_original
|
185
|
+
|
186
|
+
MaterializedViewAutoRefreshTestModel.refresh_view! concurrent: :auto
|
187
|
+
MaterializedViewAutoRefreshTestModel.refresh_view! concurrent: :auto
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'raises an error when refreshing materialized views with invalid concurrent option' do
|
191
|
+
class MaterializedViewInvalidRefreshTestModel < ActiveRecord::Base
|
192
|
+
is_view 'SELECT 1 AS id;', materialized: true, unique_columns: [:id]
|
193
|
+
end
|
194
|
+
|
195
|
+
expect {
|
196
|
+
MaterializedViewAutoRefreshTestModel.refresh_view! concurrent: :blah
|
197
|
+
}.to raise_error ArgumentError, 'invalid concurrent option'
|
198
|
+
end
|
169
199
|
end
|
170
200
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Weathered
|
@@ -115,6 +115,8 @@ files:
|
|
115
115
|
- spec/active_record_views_checksum_cache_spec.rb
|
116
116
|
- spec/active_record_views_extension_spec.rb
|
117
117
|
- spec/active_record_views_spec.rb
|
118
|
+
- spec/internal/app/models/dependency_a.rb
|
119
|
+
- spec/internal/app/models/dependency_b.rb
|
118
120
|
- spec/internal/app/models/erb_test_model.rb
|
119
121
|
- spec/internal/app/models/erb_test_model.sql.erb
|
120
122
|
- spec/internal/app/models/external_file_test_model.rb
|
@@ -156,6 +158,8 @@ test_files:
|
|
156
158
|
- spec/active_record_views_checksum_cache_spec.rb
|
157
159
|
- spec/active_record_views_extension_spec.rb
|
158
160
|
- spec/active_record_views_spec.rb
|
161
|
+
- spec/internal/app/models/dependency_a.rb
|
162
|
+
- spec/internal/app/models/dependency_b.rb
|
159
163
|
- spec/internal/app/models/erb_test_model.rb
|
160
164
|
- spec/internal/app/models/erb_test_model.sql.erb
|
161
165
|
- spec/internal/app/models/external_file_test_model.rb
|