Commit 82210dff18544824218dabf84c2309aaa71e06b3
1 parent
6c70738c
Exists in
master
and in
29 other branches
ActionItem514: caching the product categories menu
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2222 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
5 changed files
with
49 additions
and
39 deletions
Show diff stats
app/controllers/public/search_controller.rb
... | ... | @@ -74,6 +74,7 @@ class SearchController < ApplicationController |
74 | 74 | end |
75 | 75 | def enterprises |
76 | 76 | load_product_categories_menu(:enterprises) |
77 | + @categories_menu = true | |
77 | 78 | end |
78 | 79 | def communities |
79 | 80 | #nothing, just to enable |
... | ... | @@ -84,38 +85,17 @@ class SearchController < ApplicationController |
84 | 85 | |
85 | 86 | def products |
86 | 87 | load_product_categories_menu(:products) |
88 | + @categories_menu = true | |
87 | 89 | end |
88 | 90 | |
89 | 91 | def load_product_categories_menu(asset) |
90 | 92 | @results[asset].uniq! |
91 | 93 | # REFACTOR DUPLICATED CODE inner loop doing the same thing that outter loop |
92 | - | |
93 | - cats = ProductCategory.menu_categories(@product_category, environment) | |
94 | - cats += cats.select { |c| c.children_count > 0 }.map(&:children).flatten | |
95 | - product_categories_ids = cats.map(&:id) | |
96 | 94 | |
97 | - object_ids = nil | |
98 | 95 | if !@query.blank? || @region && !params[:radius].blank? |
99 | - object_ids = @finder.find(asset, @filtered_query, calculate_find_options(asset, nil, params[:page], @product_category, @region, params[:radius], params[:year], params[:month]).merge({:limit => :all})) | |
96 | + @result_ids = @finder.find(asset, @filtered_query, calculate_find_options(asset, nil, params[:page], @product_category, @region, params[:radius], params[:year], params[:month]).merge({:limit => :all})) | |
100 | 97 | end |
101 | 98 | |
102 | - counts = @finder.product_categories_count(asset, product_categories_ids, object_ids) | |
103 | - | |
104 | - @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| | |
105 | - hits = counts[cat.id] | |
106 | - childs = [] | |
107 | - if hits | |
108 | - if cat.children_count > 0 | |
109 | - childs = cat.children.map do |child| | |
110 | - child_hits = counts[child.id] | |
111 | - [child, child_hits] | |
112 | - end.select{|child, child_hits| child_hits } | |
113 | - else | |
114 | - childs = [] | |
115 | - end | |
116 | - end | |
117 | - [cat, hits, childs] | |
118 | - end.select{|cat, hits| hits } | |
119 | 99 | end |
120 | 100 | |
121 | 101 | def calculate_find_options(asset, limit, page, product_category, region, radius, year, month) | ... | ... |
app/helpers/search_helper.rb
... | ... | @@ -100,4 +100,30 @@ module SearchHelper |
100 | 100 | will_paginate(collection, options) |
101 | 101 | end |
102 | 102 | |
103 | + def product_categories_menu(asset, product_category, object_ids = nil) | |
104 | + cats = ProductCategory.menu_categories(@product_category, environment) | |
105 | + cats += cats.select { |c| c.children_count > 0 }.map(&:children).flatten | |
106 | + product_categories_ids = cats.map(&:id) | |
107 | + | |
108 | + counts = @finder.product_categories_count(asset, product_categories_ids, object_ids) | |
109 | + | |
110 | + product_categories_menu = ProductCategory.menu_categories(product_category, environment).map do |cat| | |
111 | + hits = counts[cat.id] | |
112 | + childs = [] | |
113 | + if hits | |
114 | + if cat.children_count > 0 | |
115 | + childs = cat.children.map do |child| | |
116 | + child_hits = counts[child.id] | |
117 | + [child, child_hits] | |
118 | + end.select{|child, child_hits| child_hits } | |
119 | + else | |
120 | + childs = [] | |
121 | + end | |
122 | + end | |
123 | + [cat, hits, childs] | |
124 | + end.select{|cat, hits| hits } | |
125 | + | |
126 | + render(:partial => 'product_categories_menu', :object => product_categories_menu) | |
127 | + end | |
128 | + | |
103 | 129 | end | ... | ... |
app/views/search/enterprises.rhtml
... | ... | @@ -16,7 +16,9 @@ |
16 | 16 | <div class="has_cat_list"> |
17 | 17 | <% end %> |
18 | 18 | |
19 | -<%= render :partial => 'product_categories_menu', :object => @categories_menu %> | |
19 | +<% cache(:action => 'assets', :asset => 'enterprises', :category_path => params[:category_path], :query => @query, :ragion => @region, :radius => params[:radius]) do %> | |
20 | + <%= product_categories_menu(:enterprises, @product_category, @result_ids) %> | |
21 | +<% end %> | |
20 | 22 | |
21 | 23 | <%= display_results %> |
22 | 24 | ... | ... |
app/views/search/products.rhtml
... | ... | @@ -10,7 +10,9 @@ |
10 | 10 | <div class="has_cat_list"> |
11 | 11 | <% end %> |
12 | 12 | |
13 | -<%= render :partial => 'product_categories_menu', :object => @categories_menu %> | |
13 | +<% cache(:action => 'assets', :asset => 'products', :category_path => params[:category_path], :query => @query, :ragion => @region, :radius => params[:radius]) do %> | |
14 | + <%= product_categories_menu(:products, @product_category, @result_ids) %> | |
15 | +<% end %> | |
14 | 16 | |
15 | 17 | <%= display_results %> |
16 | 18 | ... | ... |
test/functional/search_controller_test.rb
... | ... | @@ -729,8 +729,8 @@ class SearchControllerTest < Test::Unit::TestCase |
729 | 729 | |
730 | 730 | get :index, :find_in => 'products', :query => 'test' |
731 | 731 | |
732 | - assert_includes assigns(:categories_menu).map(&:first), cat1 | |
733 | - assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
732 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /pc test 1/ } | |
733 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /pc test c/ } | |
734 | 734 | end |
735 | 735 | |
736 | 736 | should 'display only within a product category when specified' do |
... | ... | @@ -765,8 +765,8 @@ class SearchControllerTest < Test::Unit::TestCase |
765 | 765 | |
766 | 766 | get :index, :find_in => 'products' |
767 | 767 | |
768 | - assert_includes assigns(:categories_menu).map(&:first), cat1 | |
769 | - assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
768 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 1/ } | |
769 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 2/ } | |
770 | 770 | end |
771 | 771 | |
772 | 772 | should 'display children categories that has products when product category filter is selected' do |
... | ... | @@ -778,8 +778,8 @@ class SearchControllerTest < Test::Unit::TestCase |
778 | 778 | |
779 | 779 | get :index, :find_in => 'products', :product_category => cat1.id |
780 | 780 | |
781 | - assert_includes assigns(:categories_menu).map(&:first), cat11 | |
782 | - assert_not_includes assigns(:categories_menu).map(&:first), cat12 | |
781 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 11/ } | |
782 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 12/ } | |
783 | 783 | end |
784 | 784 | |
785 | 785 | should 'list only product categories with enterprises' do |
... | ... | @@ -791,8 +791,8 @@ class SearchControllerTest < Test::Unit::TestCase |
791 | 791 | |
792 | 792 | get :index, :find_in => 'enterprises', :query => 'test' |
793 | 793 | |
794 | - assert_includes assigns(:categories_menu).map(&:first), cat1 | |
795 | - assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
794 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /pc test 1/ } | |
795 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /pc test c/ } | |
796 | 796 | end |
797 | 797 | |
798 | 798 | should 'display only enterprises in the product category when its specified' do |
... | ... | @@ -831,8 +831,8 @@ class SearchControllerTest < Test::Unit::TestCase |
831 | 831 | |
832 | 832 | get :index, :find_in => 'enterprises' |
833 | 833 | |
834 | - assert_includes assigns(:categories_menu).map(&:first), cat1 | |
835 | - assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
834 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 1/ } | |
835 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 2/ } | |
836 | 836 | end |
837 | 837 | |
838 | 838 | should 'display children categories that has enterprises when product category filter is selected' do |
... | ... | @@ -844,8 +844,8 @@ class SearchControllerTest < Test::Unit::TestCase |
844 | 844 | |
845 | 845 | get :index, :find_in => 'enterprises', :product_category => cat1.id |
846 | 846 | |
847 | - assert_includes assigns(:categories_menu).map(&:first), cat11 | |
848 | - assert_not_includes assigns(:categories_menu).map(&:first), cat12 | |
847 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 11/ } | |
848 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 12/ } | |
849 | 849 | end |
850 | 850 | |
851 | 851 | should 'load two level of the product categories tree' do |
... | ... | @@ -857,8 +857,8 @@ class SearchControllerTest < Test::Unit::TestCase |
857 | 857 | |
858 | 858 | get :index, :find_in => 'enterprises' |
859 | 859 | |
860 | - assert_includes assigns(:categories_menu).map{|a|a[2].map(&:first)}.flatten, cat11 | |
861 | - assert_not_includes assigns(:categories_menu).map{|a|a[2].map(&:first)}.flatten, cat12 | |
860 | + assert_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 11/ } | |
861 | + assert_no_tag :attributes => { :id => "product-categories-menu" }, :descendant => { :tag => 'a', :content => /prod cat 12/ } | |
862 | 862 | end |
863 | 863 | |
864 | 864 | should 'provide calendar for events' do | ... | ... |