Commit 58e344051418bb87c149820b9b8f17a8fe8a4251

Authored by MoisesMachado
1 parent e0f46608

ActionItem507: added count method to finders


git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2116 3f533792-8f58-4932-b0fe-aaf55b0a4547
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
... ...