Skip to content

Commit 00a967a

Browse files
authored
fix querying single design doc when view name digesting is enabled (#171)
was querying design doc without digest in name
1 parent 11f557b commit 00a967a

File tree

2 files changed

+43
-20
lines changed

2 files changed

+43
-20
lines changed

lib/couch_potato/view/view_query.rb

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,60 +25,71 @@ def query_view!(parameters = {})
2525
# only after clearing the cache design docs will be updated/re-created.
2626
def self.clear_cache
2727
__updated_views.clear
28+
@all_views = nil
29+
@all_views_digest = nil
2830
end
2931

3032
def self.__updated_views
3133
@updated_views ||= {}
3234
@updated_views
3335
end
3436

37+
def self.all_views
38+
@all_views ||= CouchPotato.views.flat_map do |klass|
39+
specs = klass.views.map { |view_name, view| klass.execute_view(view_name, {}) }
40+
specs.map do |klass_spec|
41+
{ klass_spec.view_name => view_functions(klass_spec.map_function, klass_spec.reduce_function) }
42+
end
43+
end.inject(&:merge)
44+
end
45+
46+
def self.all_views_digest
47+
@all_views_digest ||= Digest::SHA256.hexdigest(all_views.to_json)
48+
end
49+
3550
private
3651

3752
def update_view
38-
design_doc = @database.get "_design/#{@design_document_name}" rescue nil
53+
design_doc = @database.get "_design/#{design_document_name}" rescue nil
3954
original_views = design_doc && design_doc['views'].dup
4055
view_updated
4156
design_doc ||= empty_design_document
4257
if CouchPotato::Config.single_design_document
43-
design_doc['views'] = all_views
44-
if CouchPotato::Config.digest_view_names
45-
design_doc['_id'] = "_design/#{@design_document_name}-#{Digest::SHA256.hexdigest(design_doc['views'].to_json)}"
46-
end
58+
design_doc['views'] = self.class.all_views
4759
else
48-
design_doc['views'][@view_name.to_s] = view_functions
60+
design_doc['views'][@view_name.to_s] = self.class.view_functions(@map_function, @reduce_function)
4961
end
5062
if original_views != design_doc['views']
5163
@database.save_doc(design_doc)
5264
end
5365
end
5466

55-
def all_views
56-
CouchPotato.views.flat_map do |klass|
57-
specs = klass.views.map { |view_name, view| klass.execute_view(view_name, {}) }
58-
specs.map do |klass_spec|
59-
{ klass_spec.view_name => view_functions(klass_spec.map_function, klass_spec.reduce_function) }
60-
end
61-
end.inject(&:merge)
62-
end
63-
64-
def view_functions(map_function = @map_function, reduce_function = @reduce_function)
67+
def self.view_functions(map_function, reduce_function)
6568
{'map' => map_function, 'reduce' => reduce_function}.compact
6669
end
6770

6871
def empty_design_document
69-
{'views' => {}, "_id" => "_design/#{@design_document_name}", "language" => @language.to_s}
72+
{'views' => {}, "_id" => "_design/#{design_document_name}", "language" => @language.to_s}
73+
end
74+
75+
def design_document_name
76+
name = @design_document_name
77+
if CouchPotato::Config.digest_view_names && CouchPotato::Config.single_design_document
78+
name += "-#{self.class.all_views_digest}"
79+
end
80+
name
7081
end
7182

7283
def view_has_been_updated?
7384
if CouchPotato::Config.single_design_document
7485
updated_views.any?
7586
else
76-
updated_views[[@design_document_name, @view_name]]
87+
updated_views[[design_document_name, @view_name]]
7788
end
7889
end
7990

8091
def view_updated
81-
updated_views[[@design_document_name, @view_name]] = true
92+
updated_views[[design_document_name, @view_name]] = true
8293
end
8394

8495
def updated_views
@@ -90,7 +101,7 @@ def query_view(parameters)
90101
end
91102

92103
def view_url
93-
"#{@design_document_name}/#{@view_name}"
104+
"#{design_document_name}/#{@view_name}"
94105
end
95106
end
96107
end

spec/single_design_document_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ class Thing3 < Thing1 # should work with inheritance
3030
recreate_db
3131
CouchPotato::Config.single_design_document = true
3232
CouchPotato.views.select! { |v| [Thing1, Thing2, Thing3].include?(v) } # clear classes from other specs
33+
CouchPotato::View::ViewQuery.clear_cache
3334
end
3435

3536
after(:each) do
3637
CouchPotato::Config.single_design_document = false
38+
CouchPotato::Config.digest_view_names = false
39+
CouchPotato::View::ViewQuery.clear_cache
3740
end
3841

3942
it 'creates a single design document for all views' do
@@ -60,4 +63,13 @@ class Thing3 < Thing1 # should work with inheritance
6063
expect(db.view(Thing2.all('n2'))).to eq([thing2])
6164
expect(db.view(Thing3.by_tag('tag1'))).to eq([thing3])
6265
end
66+
67+
it 'queries the single design doc with digest_view_names enabled' do
68+
CouchPotato::Config.digest_view_names = true
69+
70+
thing1 = Thing1.new title: 't1'
71+
db.save! thing1
72+
73+
expect(db.view(Thing1.all)).to(eq([thing1]))
74+
end
6375
end

0 commit comments

Comments
 (0)