Commit eb63d2149a4a469f62ffd0126dee4ee0a2431de2

Authored by Braulio Bhavamitra
1 parent 10fd71d9

Removed category_finder and put it on search controller

app/controllers/public/search_controller.rb
1 class SearchController < PublicController 1 class SearchController < PublicController
2 2
  3 + MAP_SEARCH_LIMIT = 2000
  4 + SINGLE_SEARCH_LIMIT = 20
  5 + MULTIPLE_SEARCH_LIMIT = 6
  6 +
3 helper TagsHelper 7 helper TagsHelper
4 include SearchHelper 8 include SearchHelper
5 9
@@ -178,13 +182,15 @@ class SearchController &lt; PublicController @@ -178,13 +182,15 @@ class SearchController &lt; PublicController
178 182
179 # view the summary of one category 183 # view the summary of one category
180 def category_index 184 def category_index
  185 + @searching
181 @results = {} 186 @results = {}
182 @order = [] 187 @order = []
183 @names = {} 188 @names = {}
  189 + limit = MULTIPLE_SEARCH_LIMIT
184 [ 190 [
185 - [ :people, _('People'), recent('people') ],  
186 - [ :enterprises, __('Enterprises'), recent('enterprises') ],  
187 - [ :products, _('Products'), recent('products') ], 191 + [ :people, _('People'), recent('people', limit) ],
  192 + [ :enterprises, __('Enterprises'), recent('enterprises', limit) ],
  193 + [ :products, _('Products'), recent('products', limit) ],
188 [ :events, _('Upcoming events'), upcoming_events({:per_page => limit}) ], 194 [ :events, _('Upcoming events'), upcoming_events({:per_page => limit}) ],
189 [ :communities, __('Communities'), recent('communities', limit) ], 195 [ :communities, __('Communities'), recent('communities', limit) ],
190 [ :most_commented_articles, _('Most commented articles'), most_commented_articles(limit) ], 196 [ :most_commented_articles, _('Most commented articles'), most_commented_articles(limit) ],
@@ -200,12 +206,24 @@ class SearchController &lt; PublicController @@ -200,12 +206,24 @@ class SearchController &lt; PublicController
200 protected 206 protected
201 207
202 def recent(asset, limit = nil) 208 def recent(asset, limit = nil)
203 - find(asset, nil, :limit => limit, :order => 'created_at DESC, id DESC') 209 + options = {:page => 1, :per_page => limit, :order => 'created_at DESC, id DESC'}
  210 +
  211 + @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region)
  212 +
  213 + if asset == :events
  214 + finder_method = 'find'
  215 + options.delete(:page)
  216 + options.delete(:per_page)
  217 + else
  218 + finder_method = 'paginate'
  219 + end
  220 +
  221 + asset_class(asset).send(finder_method, :all, category_options_for_find(asset_class(asset), {:order => "#{asset_table(asset)}.name"}.merge(options)))
204 end 222 end
205 223
206 def most_commented_articles(limit=10, options={}) 224 def most_commented_articles(limit=10, options={})
207 options = {:page => 1, :per_page => limit, :order => 'comments_count DESC'}.merge(options) 225 options = {:page => 1, :per_page => limit, :order => 'comments_count DESC'}.merge(options)
208 - Article.paginate(:all, options_for_find(Article, options)) 226 + Article.paginate(:all, category_options_for_find(Article, options))
209 end 227 end
210 228
211 def upcoming_events(options = {}) 229 def upcoming_events(options = {})
@@ -347,9 +365,46 @@ class SearchController &lt; PublicController @@ -347,9 +365,46 @@ class SearchController &lt; PublicController
347 def limit 365 def limit
348 searching = @searching.values.select{|v|v} 366 searching = @searching.values.select{|v|v}
349 if params[:display] == 'map' 367 if params[:display] == 'map'
350 - 2000 368 + MAP_SEARCH_LIMIT
  369 + else
  370 + (searching.size == 1) ? SINGLE_SEARCH_LIMIT : MULTIPLE_SEARCH_LIMIT
  371 + end
  372 + end
  373 +
  374 + def category_options_for_find(klass, options={}, date_range = nil)
  375 + if defined? options[:product_category]
  376 + prod_cat = options.delete(:product_category)
  377 + end
  378 +
  379 + case klass.name
  380 + when 'Comment'
  381 + {:joins => 'inner join articles_categories on articles_categories.article_id = comments.article_id', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options)
  382 + when 'Product'
  383 + if prod_cat
  384 + {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id inner join product_categorizations on (product_categorizations.product_id = products.id)', :conditions => ['categories_profiles.category_id = (?) and product_categorizations.category_id = (?)', category_id, prod_cat.id]}.merge!(options)
  385 + else
  386 + {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options)
  387 + end
  388 + when 'Article', 'TextArticle'
  389 + {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options)
  390 + when 'Event'
  391 + conditions =
  392 + if date_range
  393 + ['articles_categories.category_id = (:category_id) and (start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day)', {:category_id => category_id, :start_day => date_range.first, :end_day => date_range.last} ]
  394 + else
  395 + ['articles_categories.category_id = (?) ', category_id ]
  396 + end
  397 + {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => conditions}.merge!(options)
  398 + when 'Enterprise'
  399 + if prod_cat
  400 + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id) inner join products on (products.enterprise_id = profiles.id) inner join product_categorizations on (product_categorizations.product_id = products.id)', :conditions => ['categories_profiles.category_id = (?) and product_categorizations.category_id = (?)', category_id, prod_cat.id]}.merge!(options)
  401 + else
  402 + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options)
  403 + end
  404 + when 'Person', 'Community'
  405 + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options)
351 else 406 else
352 - (searching.size == 1) ? 20 : 6 407 + raise "unreconized class #{klass.name}"
353 end 408 end
354 end 409 end
355 410
app/models/category_finder.rb
@@ -1,140 +0,0 @@ @@ -1,140 +0,0 @@
1 -class CategoryFinder  
2 -  
3 - def initialize(cat)  
4 - @category = cat  
5 - @category_id = @category.id  
6 - end  
7 -  
8 - attr_reader :category_id  
9 -  
10 - def find(asset, query='', options={})  
11 - @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region)  
12 - if @region && options[:within]  
13 - options[:origin] = [@region.lat, @region.lng]  
14 - else  
15 - options.delete(:within)  
16 - end  
17 -  
18 - date_range = options.delete(:date_range)  
19 -  
20 - options = {:page => 1, :per_page => options.delete(:limit)}.merge(options)  
21 -  
22 - if asset == :events  
23 - finder_method = 'find'  
24 - options.delete(:page)  
25 - options.delete(:per_page)  
26 - else  
27 - finder_method = 'paginate'  
28 - end  
29 -  
30 - if query.blank?  
31 - options.delete(:facets)  
32 - options.delete(:order_by)  
33 -  
34 - asset_class(asset).send(finder_method, :all, options_for_find(asset_class(asset), {:order => "#{asset_table(asset)}.name"}.merge(options), date_range))  
35 - else  
36 - pg_options = {:page => options.delete(:page), :per_page => options.delete(:per_page)}  
37 - solr_options = {:facets => options.delete(:facets), :order => options.delete(:order_by)}  
38 -  
39 - asset_class(asset).find_by_contents(query, pg_options, solr_options, options_for_find(asset_class(asset), options, date_range))[:results]  
40 - end  
41 - end  
42 -  
43 - def current_events(year, month, options={})  
44 - options.delete(:page)  
45 - options.delete(:per_page)  
46 -  
47 - range = Event.date_range(year, month)  
48 -  
49 - Event.find(:all, {:include => :categories, :conditions => { 'categories.id' => category_id, :start_date => range }}.merge(options))  
50 - end  
51 -  
52 - def upcoming_events(options = {})  
53 - options.delete(:page)  
54 - options.delete(:per_page)  
55 -  
56 - Event.find(:all, {:include => :categories, :conditions => [ 'categories.id = ? and start_date >= ?', category_id, Date.today ], :order => 'start_date' }.merge(options))  
57 - end  
58 -  
59 - def product_categories_count(asset, product_categories_ids, objects_ids=nil)  
60 - conditions = [ "product_categorizations.category_id in (?) and #{ProfileCategorization.table_name}.category_id = ?", product_categories_ids, category_id]  
61 -  
62 - if asset == :products  
63 - if objects_ids  
64 - conditions[0] += ' and product_categorizations.product_id in (?)'  
65 - conditions << objects_ids  
66 - end  
67 - ProductCategory.find(  
68 - :all,  
69 - :select => 'categories.id, count(*) as total',  
70 - :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)",  
71 - :group => 'categories.id',  
72 - :conditions => conditions  
73 - )  
74 - elsif asset == :enterprises  
75 - if objects_ids  
76 - conditions[0] += ' and products.enterprise_id in (?)'  
77 - conditions << objects_ids  
78 - end  
79 - ProductCategory.find(  
80 - :all,  
81 - :select => 'categories.id, count(distinct products.enterprise_id) as total',  
82 - :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)",  
83 - :group => 'categories.id',  
84 - :conditions => conditions  
85 - )  
86 - else  
87 - raise ArgumentError, 'only products and enterprises supported'  
88 - end.inject({}) do |results,pc|  
89 - results[pc.id]= pc.total.to_i  
90 - results  
91 - end  
92 - end  
93 -  
94 - protected  
95 -  
96 - def options_for_find(klass, options={}, date_range = nil)  
97 - if defined? options[:product_category]  
98 - prod_cat = options.delete(:product_category)  
99 - end  
100 -  
101 - case klass.name  
102 - when 'Comment'  
103 - {:joins => 'inner join articles_categories on articles_categories.article_id = comments.article_id', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options)  
104 - when 'Product'  
105 - if prod_cat  
106 - {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id inner join product_categorizations on (product_categorizations.product_id = products.id)', :conditions => ['categories_profiles.category_id = (?) and product_categorizations.category_id = (?)', category_id, prod_cat.id]}.merge!(options)  
107 - else  
108 - {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options)  
109 - end  
110 - when 'Article', 'TextArticle'  
111 - {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options)  
112 - when 'Event'  
113 - conditions =  
114 - if date_range  
115 - ['articles_categories.category_id = (:category_id) and (start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day)', {:category_id => category_id, :start_day => date_range.first, :end_day => date_range.last} ]  
116 - else  
117 - ['articles_categories.category_id = (?) ', category_id ]  
118 - end  
119 - {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => conditions}.merge!(options)  
120 - when 'Enterprise'  
121 - if prod_cat  
122 - {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id) inner join products on (products.enterprise_id = profiles.id) inner join product_categorizations on (product_categorizations.product_id = products.id)', :conditions => ['categories_profiles.category_id = (?) and product_categorizations.category_id = (?)', category_id, prod_cat.id]}.merge!(options)  
123 - else  
124 - {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options)  
125 - end  
126 - when 'Person', 'Community'  
127 - {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options)  
128 - else  
129 - raise "unreconized class #{klass.name}"  
130 - end  
131 - end  
132 -  
133 - def asset_class(asset)  
134 - asset.to_s.singularize.camelize.constantize  
135 - end  
136 -  
137 - def asset_table(asset)  
138 - asset_class(asset).table_name  
139 - end  
140 -end