Commit 3cb0a48872e0d762b77d0dab7262ff357ac615e6
1 parent
2944ada6
Exists in
master
and in
28 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 |