Commit 3cb0a48872e0d762b77d0dab7262ff357ac615e6
1 parent
2944ada6
Exists in
master
and in
22 other branches
ActionItem466: adapting CategoryFinder
Searching with the new categorization scheme git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2072 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
2 changed files
with
59 additions
and
22 deletions
Show diff stats
app/models/category_finder.rb
@@ -2,10 +2,10 @@ class CategoryFinder | @@ -2,10 +2,10 @@ class CategoryFinder | ||
2 | 2 | ||
3 | def initialize(cat) | 3 | def initialize(cat) |
4 | @category = cat | 4 | @category = cat |
5 | - @category_ids = @category.map_traversal(&:id) | 5 | + @category_id = @category.id |
6 | end | 6 | end |
7 | 7 | ||
8 | - attr_reader :category_ids | 8 | + attr_reader :category_id |
9 | 9 | ||
10 | 10 | ||
11 | 11 | ||
@@ -43,7 +43,7 @@ class CategoryFinder | @@ -43,7 +43,7 @@ class CategoryFinder | ||
43 | def current_events(year, month) | 43 | def current_events(year, month) |
44 | range = Event.date_range(year, month) | 44 | range = Event.date_range(year, month) |
45 | 45 | ||
46 | - Event.find(:all, :include => :categories, :conditions => { 'categories.id' => category_ids, :start_date => range }) | 46 | + Event.find(:all, :include => :categories, :conditions => { 'categories.id' => category_id, :start_date => range }) |
47 | end | 47 | end |
48 | 48 | ||
49 | protected | 49 | protected |
@@ -57,15 +57,17 @@ class CategoryFinder | @@ -57,15 +57,17 @@ class CategoryFinder | ||
57 | 57 | ||
58 | case klass.name | 58 | case klass.name |
59 | when 'Comment' | 59 | when 'Comment' |
60 | - {:select => 'distinct comments.*', :joins => 'inner join articles_categories on articles_categories.article_id = comments.article_id', :conditions => ['articles_categories.category_id in (?)', category_ids]}.merge!(options) | 60 | + {:select => 'distinct comments.*', :joins => 'inner join articles_categories on articles_categories.article_id = comments.article_id', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options) |
61 | when 'Product' | 61 | when 'Product' |
62 | if prod_cat_ids | 62 | if prod_cat_ids |
63 | - {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id in (?) and products.product_category_id in (?)', category_ids, prod_cat_ids]}.merge!(options) | 63 | + {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id in (?) and products.product_category_id = (?)', category_id, prod_cat_ids]}.merge!(options) |
64 | else | 64 | else |
65 | - {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id in (?)', category_ids]}.merge!(options) | 65 | + {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) |
66 | end | 66 | end |
67 | - when 'Article', 'Person', 'Community', 'Enterprise', 'Event' | ||
68 | - {:include => 'categories', :conditions => ['categories.id IN (?)', category_ids]}.merge!(options) | 67 | + when 'Article', 'Event' |
68 | + {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options) | ||
69 | + when 'Person', 'Community', 'Enterprise' | ||
70 | + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) | ||
69 | else | 71 | else |
70 | raise "unreconized class #{klass.name}" | 72 | raise "unreconized class #{klass.name}" |
71 | end | 73 | end |
@@ -75,9 +77,11 @@ class CategoryFinder | @@ -75,9 +77,11 @@ class CategoryFinder | ||
75 | # FIXME copy/pasted from options_for_find above !!! | 77 | # FIXME copy/pasted from options_for_find above !!! |
76 | case klass.name | 78 | case klass.name |
77 | when 'Product' | 79 | when 'Product' |
78 | - {:select => 'distinct products.*', :joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id in (?) and (products.name like (?) or products.name like (?))', category_ids, initial + '%', initial.upcase + '%']} | ||
79 | - when 'Article', 'Person', 'Community', 'Enterprise' | ||
80 | - {:include => 'categories', :conditions => ['categories.id IN (?) and (%s.name like (?) or %s.name like (?))' % [klass.table_name, klass.table_name], category_ids, initial + '%', initial.upcase + '%']} | 80 | + {:select => 'distinct products.*', :joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id = (?) and (products.name like (?) or products.name like (?))', category_id, initial + '%', initial.upcase + '%']} |
81 | + when 'Article' | ||
82 | + {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?) and (%s.name like (?) or %s.name like (?))' % [klass.table_name, klass.table_name], category_id, initial + '%', initial.upcase + '%']} | ||
83 | + when 'Person', 'Community', 'Enterprise' | ||
84 | + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?) and (%s.name like (?) or %s.name like (?))' % [klass.table_name, klass.table_name], category_id, initial + '%', initial.upcase + '%']} | ||
81 | else | 85 | else |
82 | raise "unreconized class #{klass.name}" | 86 | raise "unreconized class #{klass.name}" |
83 | end | 87 | end |
test/unit/category_finder_test.rb
@@ -83,27 +83,60 @@ class CategoryFinderTest < ActiveSupport::TestCase | @@ -83,27 +83,60 @@ class CategoryFinderTest < ActiveSupport::TestCase | ||
83 | assert_not_includes list, prod2 | 83 | assert_not_includes list, prod2 |
84 | end | 84 | end |
85 | 85 | ||
86 | - should 'load ids for category full hierarchy' do | ||
87 | - c1 = Category.create!(:name => 'parent', :environment => Environment.default) | ||
88 | - c2 = Category.create!(:name => 'child 1', :environment => Environment.default, :parent => c1) | ||
89 | - c3 = Category.create!(:name => 'grandchild', :environment => Environment.default, :parent => c2) | ||
90 | - c4 = Category.create!(:name => 'child 2', :environment => Environment.default, :parent => c1) | ||
91 | - c5 = Category.create!(:name => 'grandchild 2', :environment => Environment.default, :parent => c4) | 86 | + should 'search people in category hierarchy' do |
87 | + parent = Category.create!(:name => 'parent category', :environment => Environment.default) | ||
88 | + child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) | ||
89 | + p1 = create_user('people_1').person | ||
90 | + p1.name = 'a beautiful person' | ||
91 | + p1.add_category(child) | ||
92 | + p1.save! | ||
92 | 93 | ||
93 | - c1.reload | 94 | + parent.reload |
94 | 95 | ||
95 | - assert_equivalent [c1,c2,c3,c4,c5].map(&:id), CategoryFinder.new(c1).category_ids | 96 | + f = CategoryFinder.new(parent) |
97 | + assert_includes f.find(:people, 'beautiful'), p1 | ||
96 | end | 98 | end |
97 | 99 | ||
98 | - should 'search in category hierarchy' do | 100 | + should 'search article in category hierarchy' do |
99 | parent = Category.create!(:name => 'parent category', :environment => Environment.default) | 101 | parent = Category.create!(:name => 'parent category', :environment => Environment.default) |
100 | child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) | 102 | child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) |
101 | - p1 = create_user('people_1').person; p1.name = 'a beautiful person'; p1.add_category(child); p1.save! | 103 | + |
104 | + p1 = create_user('people_1').person | ||
105 | + | ||
106 | + article = p1.articles.create!(:name => 'a beautiful article', :category_ids => [child.id]) | ||
102 | 107 | ||
103 | parent.reload | 108 | parent.reload |
104 | 109 | ||
105 | f = CategoryFinder.new(parent) | 110 | f = CategoryFinder.new(parent) |
106 | - assert_includes f.find(:people, 'beautiful'), p1 | 111 | + assert_includes f.find(:articles, 'beautiful'), article |
112 | + end | ||
113 | + | ||
114 | + should 'find communites by initial in category hierarchy' do | ||
115 | + parent = Category.create!(:name => 'parent category', :environment => Environment.default) | ||
116 | + child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) | ||
117 | + p1 = create_user('people_1').person | ||
118 | + p1.name = 'person with inner beaity' | ||
119 | + p1.add_category(child) | ||
120 | + p1.save! | ||
121 | + | ||
122 | + parent.reload | ||
123 | + | ||
124 | + f = CategoryFinder.new(parent) | ||
125 | + assert_includes f.find_by_initial(:people, 'p'), p1 | ||
126 | + end | ||
127 | + | ||
128 | + should 'find articles by initial in category hierarchy' do | ||
129 | + parent = Category.create!(:name => 'parent category', :environment => Environment.default) | ||
130 | + child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) | ||
131 | + | ||
132 | + p1 = create_user('people_1').person | ||
133 | + | ||
134 | + article = p1.articles.create!(:name => 'fucking beautiful article', :category_ids => [child.id]) | ||
135 | + | ||
136 | + parent.reload | ||
137 | + | ||
138 | + f = CategoryFinder.new(parent) | ||
139 | + assert_includes f.find_by_initial(:articles, 'f'), article | ||
107 | end | 140 | end |
108 | 141 | ||
109 | should 'list recent enterprises' do | 142 | should 'list recent enterprises' do |