@@ -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
0 commit comments