Commit 58e344051418bb87c149820b9b8f17a8fe8a4251
1 parent
e0f46608
Exists in
master
and in
29 other branches
ActionItem507: added count method to finders
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2116 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
5 changed files
with
133 additions
and
31 deletions
Show diff stats
app/controllers/public/search_controller.rb
... | ... | @@ -82,6 +82,16 @@ class SearchController < ApplicationController |
82 | 82 | #nothins, just to enable |
83 | 83 | end |
84 | 84 | |
85 | + def calculate_find_options(asset, limit, product_category, region, radius) | |
86 | + | |
87 | + result = { :limit => limit, :product_category => product_category} | |
88 | + if [:enterprises, :people].include?(asset) && region | |
89 | + result.merge!(:within => radius, :region => region.id) | |
90 | + end | |
91 | + | |
92 | + result | |
93 | + end | |
94 | + | |
85 | 95 | public |
86 | 96 | |
87 | 97 | include SearchHelper |
... | ... | @@ -118,20 +128,15 @@ class SearchController < ApplicationController |
118 | 128 | number_of_result_assets = @searching.values.select{|v| v}.size |
119 | 129 | |
120 | 130 | # apply limit when searching for only one type of asset |
121 | -# limit = (number_of_result_assets == 1) ? LIST_LIMIT : nil | |
131 | + limit = (number_of_result_assets == 1) ? LIST_LIMIT : nil | |
122 | 132 | # apply limit to all searches |
123 | - limit = nil | |
133 | +# limit = nil | |
124 | 134 | |
125 | 135 | @results = {} |
126 | 136 | @names = {} |
127 | - SEARCH_IN.each do |key, description| | |
128 | - if @searching[key] | |
129 | - if [:enterprises, :people].include?(key) && @region | |
130 | - @results[key] = @finder.find(key, @filtered_query, :within => params[:radius], :region => @region.id, :product_category => @product_category, :limit => limit) | |
131 | - else | |
132 | - @results[key] = @finder.find(key, @filtered_query, :product_category => @product_category, :limit => limit) | |
133 | - end | |
134 | - end | |
137 | + | |
138 | + SEARCH_IN.select { |key,description| @searching[key] }.each do |key, description| | |
139 | + @results[key] = @finder.find(key, @filtered_query, calculate_find_options(key, limit, @product_category, @region, params[:radius])) | |
135 | 140 | @names[key] = gettext(description) |
136 | 141 | end |
137 | 142 | |
... | ... | @@ -150,21 +155,9 @@ class SearchController < ApplicationController |
150 | 155 | |
151 | 156 | def products |
152 | 157 | @results[:products].uniq! |
153 | -# if !(@category || @product_category || @region || (!@query.blank?)) | |
154 | -# # not searching, no menu | |
155 | -# return | |
156 | -# end | |
157 | - | |
158 | - @categories = @results[:products].map(&:product_category).compact | |
159 | - @counts = @categories.uniq.inject({}) do |h, cat| | |
160 | - h[cat.id] = [cat, 0] | |
161 | - h | |
162 | - end | |
163 | - | |
164 | - @categories.each do |cat| | |
165 | - cat.hierarchy.each do |each_cat| | |
166 | - @counts[each_cat.id][1] += 1 if @counts[each_cat.id] | |
167 | - end | |
158 | + @categories = ProductCategory.menu_categories(@product_category) | |
159 | + @categories.map do |cat| | |
160 | + [cat, @finder.count(:products, @filtered_query, calculate_find_options(:products, nil, cat, @region, params[:radius]))] | |
168 | 161 | end |
169 | 162 | |
170 | 163 | @found_product_categories = @counts.values.sort_by{|v|v[0].full_name} | ... | ... |
app/models/category_finder.rb
... | ... | @@ -32,8 +32,12 @@ class CategoryFinder |
32 | 32 | asset_class(asset).find(:all, options_for_find_by_initial(asset_class(asset), initial)) |
33 | 33 | end |
34 | 34 | |
35 | - def count(asset) | |
36 | - asset_class(asset).count(:all, options_for_find(asset_class(asset), :select => "#{asset_table(asset)}.id")) | |
35 | + def count(asset, query='', options={}) | |
36 | + if query.blank? | |
37 | + find(asset, query, options).size | |
38 | + else | |
39 | + find(asset, query, options).total_hits | |
40 | + end | |
37 | 41 | end |
38 | 42 | |
39 | 43 | def most_commented_articles(limit=10) | ... | ... |
app/models/environment_finder.rb
... | ... | @@ -43,8 +43,13 @@ class EnvironmentFinder |
43 | 43 | @environment.send(asset).find_by_initial(initial) |
44 | 44 | end |
45 | 45 | |
46 | - def count(asset) | |
47 | - @environment.send(asset).count | |
46 | + def count(asset, query = '', options = {}) | |
47 | + if query.blank? | |
48 | + # SLOW | |
49 | + find(asset, query, options).size | |
50 | + else | |
51 | + find(asset, query, options).total_hits | |
52 | + end | |
48 | 53 | end |
49 | 54 | |
50 | 55 | end | ... | ... |
test/unit/category_finder_test.rb
... | ... | @@ -157,6 +157,60 @@ class CategoryFinderTest < ActiveSupport::TestCase |
157 | 157 | ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1', :category_ids => [@category.id]) |
158 | 158 | assert_equal count+1, @finder.count('enterprises') |
159 | 159 | end |
160 | + | |
161 | + should 'count people' do | |
162 | + count = @finder.count('people') | |
163 | + p = create_user('testinguser').person | |
164 | + p.category_ids = [@category.id] | |
165 | + p.save! | |
166 | + | |
167 | + assert_equal count+1, @finder.count('people') | |
168 | + end | |
169 | + should 'count products' do | |
170 | + count = @finder.count('products') | |
171 | + | |
172 | + ent = Enterprise.create!(:name => 'teste1', :identifier => 'teste1', :category_ids => [@category.id]) | |
173 | + ent.products.create!(:name => 'test prodduct') | |
174 | + | |
175 | + assert_equal count+1, @finder.count('products') | |
176 | + end | |
177 | + should 'count articles' do | |
178 | + ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
179 | + | |
180 | + count = @finder.count('articles') | |
181 | + ent1.articles.create!(:name => 'teste1', :category_ids => [@category.id]) | |
182 | + | |
183 | + assert_equal count+1, @finder.count('articles') | |
184 | + end | |
185 | + should 'count events' do | |
186 | + count = @finder.count('events') | |
187 | + ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
188 | + | |
189 | + Event.create!(:name => 'teste2', :profile => ent1, :start_date => Date.today, :category_ids => [@category.id]) | |
190 | + assert_equal count+1, @finder.count('events') | |
191 | + end | |
192 | + | |
193 | + should 'count enterprises with query and options' do | |
194 | + options = mock | |
195 | + results = mock | |
196 | + | |
197 | + @finder.expects(:find).with('people', 'my query', options).returns(results) | |
198 | + | |
199 | + results.expects(:total_hits).returns(99) | |
200 | + | |
201 | + assert_equal 99, @finder.count('people', 'my query', options) | |
202 | + end | |
203 | + | |
204 | + should 'count enterprises without query but with options' do | |
205 | + options = mock | |
206 | + results = mock | |
207 | + | |
208 | + @finder.expects(:find).with('people', nil, options).returns(results) | |
209 | + | |
210 | + results.expects(:size).returns(99) | |
211 | + | |
212 | + assert_equal 99, @finder.count('people', nil, options) | |
213 | + end | |
160 | 214 | |
161 | 215 | should 'not list more people than limit' do |
162 | 216 | p1 = create_user('test1').person; p1.add_category(@category) | ... | ... |
test/unit/environment_finder_test.rb
... | ... | @@ -51,12 +51,58 @@ class EnvironmentFinderTest < ActiveSupport::TestCase |
51 | 51 | assert_not_includes recent, ent1 # older |
52 | 52 | end |
53 | 53 | |
54 | - should 'count entrprises' do | |
54 | + should 'count enterprises' do | |
55 | 55 | finder = EnvironmentFinder.new(Environment.default) |
56 | 56 | count = finder.count('enterprises') |
57 | - ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
57 | + Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
58 | 58 | assert_equal count+1, finder.count('enterprises') |
59 | 59 | end |
60 | + should 'count people' do | |
61 | + finder = EnvironmentFinder.new(Environment.default) | |
62 | + count = finder.count('people') | |
63 | + create_user('testinguser') | |
64 | + assert_equal count+1, finder.count('people') | |
65 | + end | |
66 | + should 'count products' do | |
67 | + finder = EnvironmentFinder.new(Environment.default) | |
68 | + count = finder.count('products') | |
69 | + | |
70 | + ent = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
71 | + ent.products.create!(:name => 'test prodduct') | |
72 | + | |
73 | + assert_equal count+1, finder.count('products') | |
74 | + end | |
75 | + should 'count articles' do | |
76 | + finder = EnvironmentFinder.new(Environment.default) | |
77 | + | |
78 | + ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
79 | + | |
80 | + count = finder.count('articles') | |
81 | + ent1.articles.create!(:name => 'teste1') | |
82 | + | |
83 | + assert_equal count+1, finder.count('articles') | |
84 | + end | |
85 | + should 'count events' do | |
86 | + finder = EnvironmentFinder.new(Environment.default) | |
87 | + count = finder.count('events') | |
88 | + ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | |
89 | + | |
90 | + Event.create!(:name => 'teste2', :profile => ent1, :start_date => Date.today) | |
91 | + assert_equal count+1, finder.count('events') | |
92 | + end | |
93 | + | |
94 | + should 'count enterprises with query and options' do | |
95 | + env = Environment.default | |
96 | + finder = EnvironmentFinder.new(env) | |
97 | + options = mock | |
98 | + results = mock | |
99 | + | |
100 | + finder.expects(:find).with('people', 'my query', options).returns(results) | |
101 | + | |
102 | + results.expects(:total_hits).returns(99) | |
103 | + | |
104 | + assert_equal 99, finder.count('people', 'my query', options) | |
105 | + end | |
60 | 106 | |
61 | 107 | should 'find articles by initial' do |
62 | 108 | person = create_user('teste').person | ... | ... |