Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 31 additions & 20 deletions lib/couch_potato/view/view_query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,60 +25,71 @@ def query_view!(parameters = {})
# only after clearing the cache design docs will be updated/re-created.
def self.clear_cache
__updated_views.clear
@all_views = nil
@all_views_digest = nil
end

def self.__updated_views
@updated_views ||= {}
@updated_views
end

def self.all_views
@all_views ||= CouchPotato.views.flat_map do |klass|
specs = klass.views.map { |view_name, view| klass.execute_view(view_name, {}) }
specs.map do |klass_spec|
{ klass_spec.view_name => view_functions(klass_spec.map_function, klass_spec.reduce_function) }
end
end.inject(&:merge)
end

def self.all_views_digest
@all_views_digest ||= Digest::SHA256.hexdigest(all_views.to_json)
end

private

def update_view
design_doc = @database.get "_design/#{@design_document_name}" rescue nil
design_doc = @database.get "_design/#{design_document_name}" rescue nil
original_views = design_doc && design_doc['views'].dup
view_updated
design_doc ||= empty_design_document
if CouchPotato::Config.single_design_document
design_doc['views'] = all_views
if CouchPotato::Config.digest_view_names
design_doc['_id'] = "_design/#{@design_document_name}-#{Digest::SHA256.hexdigest(design_doc['views'].to_json)}"
end
design_doc['views'] = self.class.all_views
else
design_doc['views'][@view_name.to_s] = view_functions
design_doc['views'][@view_name.to_s] = self.class.view_functions(@map_function, @reduce_function)
end
if original_views != design_doc['views']
@database.save_doc(design_doc)
end
end

def all_views
CouchPotato.views.flat_map do |klass|
specs = klass.views.map { |view_name, view| klass.execute_view(view_name, {}) }
specs.map do |klass_spec|
{ klass_spec.view_name => view_functions(klass_spec.map_function, klass_spec.reduce_function) }
end
end.inject(&:merge)
end

def view_functions(map_function = @map_function, reduce_function = @reduce_function)
def self.view_functions(map_function, reduce_function)
{'map' => map_function, 'reduce' => reduce_function}.compact
end

def empty_design_document
{'views' => {}, "_id" => "_design/#{@design_document_name}", "language" => @language.to_s}
{'views' => {}, "_id" => "_design/#{design_document_name}", "language" => @language.to_s}
end

def design_document_name
name = @design_document_name
if CouchPotato::Config.digest_view_names && CouchPotato::Config.single_design_document
name += "-#{self.class.all_views_digest}"
end
name
end

def view_has_been_updated?
if CouchPotato::Config.single_design_document
updated_views.any?
else
updated_views[[@design_document_name, @view_name]]
updated_views[[design_document_name, @view_name]]
end
end

def view_updated
updated_views[[@design_document_name, @view_name]] = true
updated_views[[design_document_name, @view_name]] = true
end

def updated_views
Expand All @@ -90,7 +101,7 @@ def query_view(parameters)
end

def view_url
"#{@design_document_name}/#{@view_name}"
"#{design_document_name}/#{@view_name}"
end
end
end
Expand Down
12 changes: 12 additions & 0 deletions spec/single_design_document_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,13 @@ class Thing3 < Thing1 # should work with inheritance
recreate_db
CouchPotato::Config.single_design_document = true
CouchPotato.views.select! { |v| [Thing1, Thing2, Thing3].include?(v) } # clear classes from other specs
CouchPotato::View::ViewQuery.clear_cache
end

after(:each) do
CouchPotato::Config.single_design_document = false
CouchPotato::Config.digest_view_names = false
CouchPotato::View::ViewQuery.clear_cache
end

it 'creates a single design document for all views' do
Expand All @@ -60,4 +63,13 @@ class Thing3 < Thing1 # should work with inheritance
expect(db.view(Thing2.all('n2'))).to eq([thing2])
expect(db.view(Thing3.by_tag('tag1'))).to eq([thing3])
end

it 'queries the single design doc with digest_view_names enabled' do
CouchPotato::Config.digest_view_names = true

thing1 = Thing1.new title: 't1'
db.save! thing1

expect(db.view(Thing1.all)).to(eq([thing1]))
end
end