Commit d2c2650deb5b9982e6119c81108fd5989a442e49

Authored by MoisesMachado
1 parent aa2cdafb

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
app/controllers/public/search_controller.rb
... ... @@ -89,6 +89,11 @@ class SearchController < ApplicationController
89 89 def load_product_categories_menu(asset)
90 90 @results[asset].uniq!
91 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 97 @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat|
93 98 hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, cat, @region, params[:radius], nil, nil))
94 99 childs = []
... ...
app/models/category_finder.rb
... ... @@ -30,12 +30,6 @@ class CategoryFinder
30 30 find(asset, nil, :limit => limit)
31 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 33 def most_commented_articles(limit=10, options={})
40 34 options = {:page => 1, :per_page => limit, :order => 'comments_count DESC'}.merge(options)
41 35 Article.paginate(:all, options_for_find(Article, options))
... ... @@ -54,6 +48,41 @@ class CategoryFinder
54 48 Event.paginate(:all, {:include => :categories, :conditions => [ 'categories.id = ? and start_date >= ?', category_id, Date.today ], :order => 'start_date' }.merge(options))
55 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 86 protected
58 87  
59 88 def options_for_find(klass, options={}, date_range = nil)
... ...
test/unit/category_finder_test.rb
... ... @@ -148,64 +148,6 @@ class CategoryFinderTest &lt; ActiveSupport::TestCase
148 148 assert_respond_to p2, :total_entries
149 149 assert (p1 == [ent1] && p2 == [ent2]) || (p1 == [ent2] && p2 == [ent1]) # consistent paging
150 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 152 should 'not list more people than limit' do
211 153 p1 = create_user('test1').person; p1.add_category(@category)
... ... @@ -384,4 +326,110 @@ class CategoryFinderTest &lt; ActiveSupport::TestCase
384 326 assert_not_includes ents, ent2
385 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 435 end
... ...