Commit d2c2650deb5b9982e6119c81108fd5989a442e49
1 parent
aa2cdafb
Exists in
master
and in
29 other branches
ActionItem514: made a category finder method to calculate count for
product categories inside a filter git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2214 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
3 changed files
with
146 additions
and
64 deletions
Show diff stats
app/controllers/public/search_controller.rb
@@ -89,6 +89,11 @@ class SearchController < ApplicationController | @@ -89,6 +89,11 @@ class SearchController < ApplicationController | ||
89 | def load_product_categories_menu(asset) | 89 | def load_product_categories_menu(asset) |
90 | @results[asset].uniq! | 90 | @results[asset].uniq! |
91 | # REFACTOR DUPLICATED CODE inner loop doing the same thing that outter loop | 91 | # REFACTOR DUPLICATED CODE inner loop doing the same thing that outter loop |
92 | + | ||
93 | + cats = ProductCategory.menu_categories(@product_category, environment) | ||
94 | + cats += cats.map(:children).flatten | ||
95 | + product_categories_ids = cats.map(&:id) | ||
96 | + | ||
92 | @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| | 97 | @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| |
93 | hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, cat, @region, params[:radius], nil, nil)) | 98 | hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, cat, @region, params[:radius], nil, nil)) |
94 | childs = [] | 99 | childs = [] |
app/models/category_finder.rb
@@ -30,12 +30,6 @@ class CategoryFinder | @@ -30,12 +30,6 @@ class CategoryFinder | ||
30 | find(asset, nil, :limit => limit) | 30 | find(asset, nil, :limit => limit) |
31 | end | 31 | end |
32 | 32 | ||
33 | - def count(asset, query='', options={}) | ||
34 | - # because will_paginate needs a page | ||
35 | - options = {:page => 1}.merge(options) | ||
36 | - find(asset, query, options).total_entries | ||
37 | - end | ||
38 | - | ||
39 | def most_commented_articles(limit=10, options={}) | 33 | def most_commented_articles(limit=10, options={}) |
40 | options = {:page => 1, :per_page => limit, :order => 'comments_count DESC'}.merge(options) | 34 | options = {:page => 1, :per_page => limit, :order => 'comments_count DESC'}.merge(options) |
41 | Article.paginate(:all, options_for_find(Article, options)) | 35 | Article.paginate(:all, options_for_find(Article, options)) |
@@ -54,6 +48,41 @@ class CategoryFinder | @@ -54,6 +48,41 @@ class CategoryFinder | ||
54 | Event.paginate(:all, {:include => :categories, :conditions => [ 'categories.id = ? and start_date >= ?', category_id, Date.today ], :order => 'start_date' }.merge(options)) | 48 | Event.paginate(:all, {:include => :categories, :conditions => [ 'categories.id = ? and start_date >= ?', category_id, Date.today ], :order => 'start_date' }.merge(options)) |
55 | end | 49 | end |
56 | 50 | ||
51 | + def product_categories_count(asset, product_categories_ids, objects_ids=nil) | ||
52 | + conditions = [ "product_categorizations.category_id in (?) and #{ProfileCategorization.table_name}.category_id = ?", product_categories_ids, category_id] | ||
53 | + | ||
54 | + if asset == :products | ||
55 | + if objects_ids | ||
56 | + conditions[0] += ' and product_categorizations.product_id in (?)' | ||
57 | + conditions << objects_ids | ||
58 | + end | ||
59 | + ProductCategory.find( | ||
60 | + :all, | ||
61 | + :select => 'categories.id, count(*) as total', | ||
62 | + :joins => "inner join product_categorizations on (product_categorizations.category_id = categories.id) inner join products on (products.id = product_categorizations.product_id) inner join #{ProfileCategorization.table_name} on (#{ProfileCategorization.table_name}.profile_id = products.enterprise_id)", | ||
63 | + :group => 'categories.id', | ||
64 | + :conditions => conditions | ||
65 | + ) | ||
66 | + elsif asset == :enterprises | ||
67 | + if objects_ids | ||
68 | + conditions[0] += ' and products.enterprise_id in (?)' | ||
69 | + conditions << objects_ids | ||
70 | + end | ||
71 | + ProductCategory.find( | ||
72 | + :all, | ||
73 | + :select => 'categories.id, count(distinct products.enterprise_id) as total', | ||
74 | + :joins => "inner join product_categorizations on (product_categorizations.category_id = categories.id) inner join products on (products.id = product_categorizations.product_id) inner join #{ProfileCategorization.table_name} on (#{ProfileCategorization.table_name}.profile_id = products.enterprise_id)", | ||
75 | + :group => 'categories.id', | ||
76 | + :conditions => conditions | ||
77 | + ) | ||
78 | + else | ||
79 | + raise ArgumentError, 'only products and enterprises supported' | ||
80 | + end.inject({}) do |results,pc| | ||
81 | + results[pc.id]= pc.total.to_i | ||
82 | + results | ||
83 | + end | ||
84 | + end | ||
85 | + | ||
57 | protected | 86 | protected |
58 | 87 | ||
59 | def options_for_find(klass, options={}, date_range = nil) | 88 | def options_for_find(klass, options={}, date_range = nil) |
test/unit/category_finder_test.rb
@@ -148,64 +148,6 @@ class CategoryFinderTest < ActiveSupport::TestCase | @@ -148,64 +148,6 @@ class CategoryFinderTest < ActiveSupport::TestCase | ||
148 | assert_respond_to p2, :total_entries | 148 | assert_respond_to p2, :total_entries |
149 | assert (p1 == [ent1] && p2 == [ent2]) || (p1 == [ent2] && p2 == [ent1]) # consistent paging | 149 | assert (p1 == [ent1] && p2 == [ent2]) || (p1 == [ent2] && p2 == [ent1]) # consistent paging |
150 | end | 150 | end |
151 | - | ||
152 | - should 'count enterprises' do | ||
153 | - count = @finder.count('enterprises') | ||
154 | - ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1', :category_ids => [@category.id]) | ||
155 | - assert_equal count+1, @finder.count('enterprises') | ||
156 | - end | ||
157 | - | ||
158 | - should 'count people' do | ||
159 | - count = @finder.count('people') | ||
160 | - p = create_user('testinguser').person | ||
161 | - p.category_ids = [@category.id] | ||
162 | - p.save! | ||
163 | - | ||
164 | - assert_equal count+1, @finder.count('people') | ||
165 | - end | ||
166 | - should 'count products' do | ||
167 | - count = @finder.count('products') | ||
168 | - | ||
169 | - ent = Enterprise.create!(:name => 'teste1', :identifier => 'teste1', :category_ids => [@category.id]) | ||
170 | - ent.products.create!(:name => 'test prodduct') | ||
171 | - | ||
172 | - assert_equal count+1, @finder.count('products') | ||
173 | - end | ||
174 | - should 'count articles' do | ||
175 | - ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | ||
176 | - | ||
177 | - count = @finder.count('articles') | ||
178 | - ent1.articles.create!(:name => 'teste1', :category_ids => [@category.id]) | ||
179 | - | ||
180 | - assert_equal count+1, @finder.count('articles') | ||
181 | - end | ||
182 | - should 'count events' do | ||
183 | - count = @finder.count('events') | ||
184 | - ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1') | ||
185 | - | ||
186 | - Event.create!(:name => 'teste2', :profile => ent1, :start_date => Date.today, :category_ids => [@category.id]) | ||
187 | - assert_equal count+1, @finder.count('events') | ||
188 | - end | ||
189 | - | ||
190 | - should 'count enterprises with query and options' do | ||
191 | - results = mock | ||
192 | - | ||
193 | - @finder.expects(:find).with('people', 'my query', kind_of(Hash)).returns(results) | ||
194 | - | ||
195 | - results.expects(:total_entries).returns(99) | ||
196 | - | ||
197 | - assert_equal 99, @finder.count('people', 'my query', {}) | ||
198 | - end | ||
199 | - | ||
200 | - should 'count enterprises without query but with options' do | ||
201 | - results = mock | ||
202 | - | ||
203 | - @finder.expects(:find).with('people', nil, kind_of(Hash)).returns(results) | ||
204 | - | ||
205 | - results.expects(:total_entries).returns(99) | ||
206 | - | ||
207 | - assert_equal 99, @finder.count('people', nil, {}) | ||
208 | - end | ||
209 | 151 | ||
210 | should 'not list more people than limit' do | 152 | should 'not list more people than limit' do |
211 | p1 = create_user('test1').person; p1.add_category(@category) | 153 | p1 = create_user('test1').person; p1.add_category(@category) |
@@ -384,4 +326,110 @@ class CategoryFinderTest < ActiveSupport::TestCase | @@ -384,4 +326,110 @@ class CategoryFinderTest < ActiveSupport::TestCase | ||
384 | assert_not_includes ents, ent2 | 326 | assert_not_includes ents, ent2 |
385 | end | 327 | end |
386 | 328 | ||
329 | + should 'count product categories results by products' do | ||
330 | + pc1 = ProductCategory.create!(:name => 'test cat1', :environment => Environment.default) | ||
331 | + pc11 = ProductCategory.create!(:name => 'test cat11', :environment => Environment.default, :parent => pc1) | ||
332 | + pc2 = ProductCategory.create!(:name => 'test cat2', :environment => Environment.default) | ||
333 | + pc3 = ProductCategory.create!(:name => 'test cat3', :environment => Environment.default) | ||
334 | + | ||
335 | + ent = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1', :category_ids => [@category.id]) | ||
336 | + p1 = ent.products.create!(:name => 'test product 1', :product_category => pc1) | ||
337 | + p2 = ent.products.create!(:name => 'test product 2', :product_category => pc11) | ||
338 | + p3 = ent.products.create!(:name => 'test product 3', :product_category => pc2) | ||
339 | + p4 = ent.products.create!(:name => 'test product 4', :product_category => pc2) # not in the count | ||
340 | + p5 = ent.products.create!(:name => 'test product 5', :product_category => pc3) # not in the count | ||
341 | + | ||
342 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2') | ||
343 | + p6 = ent2.products.create!(:name => 'test product 6', :product_category => pc1) | ||
344 | + | ||
345 | + counts = @finder.product_categories_count(:products, [pc1.id, pc11.id, pc2.id], [p1.id, p2.id, p3.id, p5.id, p6.id] ) | ||
346 | + | ||
347 | + assert_equal 2, counts[pc1.id] | ||
348 | + assert_equal 1, counts[pc11.id] | ||
349 | + assert_equal 1, counts[pc2.id] | ||
350 | + assert_nil counts[pc3.id] | ||
351 | + end | ||
352 | + | ||
353 | + should 'count product categories results by all products' do | ||
354 | + pc1 = ProductCategory.create!(:name => 'test cat1', :environment => Environment.default) | ||
355 | + pc11 = ProductCategory.create!(:name => 'test cat11', :environment => Environment.default, :parent => pc1) | ||
356 | + pc2 = ProductCategory.create!(:name => 'test cat2', :environment => Environment.default) | ||
357 | + pc3 = ProductCategory.create!(:name => 'test cat3', :environment => Environment.default) | ||
358 | + | ||
359 | + ent = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1', :category_ids => [@category.id]) | ||
360 | + p1 = ent.products.create!(:name => 'test product 1', :product_category => pc1) | ||
361 | + p2 = ent.products.create!(:name => 'test product 2', :product_category => pc11) | ||
362 | + p3 = ent.products.create!(:name => 'test product 3', :product_category => pc2) | ||
363 | + p4 = ent.products.create!(:name => 'test product 4', :product_category => pc3) # not in the count | ||
364 | + | ||
365 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2') | ||
366 | + p6 = ent2.products.create!(:name => 'test product 6', :product_category => pc1) | ||
367 | + | ||
368 | + | ||
369 | + counts = @finder.product_categories_count(:products, [pc1.id, pc11.id, pc2.id] ) | ||
370 | + | ||
371 | + assert_equal 2, counts[pc1.id] | ||
372 | + assert_equal 1, counts[pc11.id] | ||
373 | + assert_equal 1, counts[pc2.id] | ||
374 | + assert_nil counts[pc3.id] | ||
375 | + end | ||
376 | + | ||
377 | + should 'count product categories results by enterprises' do | ||
378 | + pc1 = ProductCategory.create!(:name => 'test cat1', :environment => Environment.default) | ||
379 | + pc11 = ProductCategory.create!(:name => 'test cat11', :environment => Environment.default, :parent => pc1) | ||
380 | + pc2 = ProductCategory.create!(:name => 'test cat2', :environment => Environment.default) | ||
381 | + pc3 = ProductCategory.create!(:name => 'test cat3', :environment => Environment.default) | ||
382 | + | ||
383 | + ent1 = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1', :category_ids => [@category.id]) | ||
384 | + ent1.products.create!(:name => 'test product 1', :product_category => pc1) | ||
385 | + ent1.products.create!(:name => 'test product 2', :product_category => pc1) | ||
386 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2', :category_ids => [@category.id]) | ||
387 | + ent2.products.create!(:name => 'test product 2', :product_category => pc11) | ||
388 | + ent3 = Enterprise.create!(:name => 'test enterprise 3', :identifier => 'test_ent3', :category_ids => [@category.id]) | ||
389 | + ent3.products.create!(:name => 'test product 3', :product_category => pc2) | ||
390 | + ent4 = Enterprise.create!(:name => 'test enterprise 4', :identifier => 'test_ent4', :category_ids => [@category.id]) | ||
391 | + ent4.products.create!(:name => 'test product 4', :product_category => pc2) | ||
392 | + ent5 = Enterprise.create!(:name => 'test enterprise 5', :identifier => 'test_ent5', :category_ids => [@category.id]) | ||
393 | + ent5.products.create!(:name => 'test product 5', :product_category => pc2) | ||
394 | + ent5.products.create!(:name => 'test product 6', :product_category => pc3) | ||
395 | + | ||
396 | + ent6 = Enterprise.create!(:name => 'test enterprise 6', :identifier => 'test_ent6') | ||
397 | + p6 = ent2.products.create!(:name => 'test product 6', :product_category => pc1) | ||
398 | + | ||
399 | + counts = @finder.product_categories_count(:enterprises, [pc1.id, pc11.id, pc2.id], [ent1.id, ent2.id, ent3.id, ent4.id] ) | ||
400 | + | ||
401 | + assert_equal 2, counts[pc1.id] | ||
402 | + assert_equal 1, counts[pc11.id] | ||
403 | + assert_equal 2, counts[pc2.id] | ||
404 | + assert_nil counts[pc3.id] | ||
405 | + end | ||
406 | + | ||
407 | + should 'count product categories results by all enterprises' do | ||
408 | + pc1 = ProductCategory.create!(:name => 'test cat1', :environment => Environment.default) | ||
409 | + pc11 = ProductCategory.create!(:name => 'test cat11', :environment => Environment.default, :parent => pc1) | ||
410 | + pc2 = ProductCategory.create!(:name => 'test cat2', :environment => Environment.default) | ||
411 | + pc3 = ProductCategory.create!(:name => 'test cat3', :environment => Environment.default) | ||
412 | + | ||
413 | + ent1 = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1', :category_ids => [@category.id]) | ||
414 | + ent1.products.create!(:name => 'test product 1', :product_category => pc1) | ||
415 | + ent1.products.create!(:name => 'test product 2', :product_category => pc1) | ||
416 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2', :category_ids => [@category.id]) | ||
417 | + ent2.products.create!(:name => 'test product 2', :product_category => pc11) | ||
418 | + ent3 = Enterprise.create!(:name => 'test enterprise 3', :identifier => 'test_ent3', :category_ids => [@category.id]) | ||
419 | + ent3.products.create!(:name => 'test product 3', :product_category => pc2) | ||
420 | + ent4 = Enterprise.create!(:name => 'test enterprise 4', :identifier => 'test_ent4', :category_ids => [@category.id]) | ||
421 | + ent4.products.create!(:name => 'test product 4', :product_category => pc2) | ||
422 | + ent4.products.create!(:name => 'test product 5', :product_category => pc3) | ||
423 | + | ||
424 | + ent5 = Enterprise.create!(:name => 'test enterprise 5', :identifier => 'test_ent5') | ||
425 | + p6 = ent2.products.create!(:name => 'test product 6', :product_category => pc1) | ||
426 | + | ||
427 | + counts = @finder.product_categories_count(:enterprises, [pc1.id, pc11.id, pc2.id] ) | ||
428 | + | ||
429 | + assert_equal 2, counts[pc1.id] | ||
430 | + assert_equal 1, counts[pc11.id] | ||
431 | + assert_equal 2, counts[pc2.id] | ||
432 | + assert_nil counts[pc3.id] | ||
433 | + end | ||
434 | + | ||
387 | end | 435 | end |