From 3cb0a48872e0d762b77d0dab7262ff357ac615e6 Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Sat, 21 Jun 2008 03:05:04 +0000 Subject: [PATCH] ActionItem466: adapting CategoryFinder --- app/models/category_finder.rb | 26 +++++++++++++++----------- test/unit/category_finder_test.rb | 55 ++++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/app/models/category_finder.rb b/app/models/category_finder.rb index 2ed3ce7..7c56053 100644 --- a/app/models/category_finder.rb +++ b/app/models/category_finder.rb @@ -2,10 +2,10 @@ class CategoryFinder def initialize(cat) @category = cat - @category_ids = @category.map_traversal(&:id) + @category_id = @category.id end - attr_reader :category_ids + attr_reader :category_id @@ -43,7 +43,7 @@ class CategoryFinder def current_events(year, month) range = Event.date_range(year, month) - Event.find(:all, :include => :categories, :conditions => { 'categories.id' => category_ids, :start_date => range }) + Event.find(:all, :include => :categories, :conditions => { 'categories.id' => category_id, :start_date => range }) end protected @@ -57,15 +57,17 @@ class CategoryFinder case klass.name when 'Comment' - {: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) + {: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) when 'Product' if prod_cat_ids - {: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) + {: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) else - {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id in (?)', category_ids]}.merge!(options) + {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) end - when 'Article', 'Person', 'Community', 'Enterprise', 'Event' - {:include => 'categories', :conditions => ['categories.id IN (?)', category_ids]}.merge!(options) + when 'Article', 'Event' + {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options) + when 'Person', 'Community', 'Enterprise' + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) else raise "unreconized class #{klass.name}" end @@ -75,9 +77,11 @@ class CategoryFinder # FIXME copy/pasted from options_for_find above !!! case klass.name when 'Product' - {: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 + '%']} - when 'Article', 'Person', 'Community', 'Enterprise' - {: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 + '%']} + {: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 + '%']} + when 'Article' + {: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 + '%']} + when 'Person', 'Community', 'Enterprise' + {: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 + '%']} else raise "unreconized class #{klass.name}" end diff --git a/test/unit/category_finder_test.rb b/test/unit/category_finder_test.rb index bb7ebd6..58fd6a4 100644 --- a/test/unit/category_finder_test.rb +++ b/test/unit/category_finder_test.rb @@ -83,27 +83,60 @@ class CategoryFinderTest < ActiveSupport::TestCase assert_not_includes list, prod2 end - should 'load ids for category full hierarchy' do - c1 = Category.create!(:name => 'parent', :environment => Environment.default) - c2 = Category.create!(:name => 'child 1', :environment => Environment.default, :parent => c1) - c3 = Category.create!(:name => 'grandchild', :environment => Environment.default, :parent => c2) - c4 = Category.create!(:name => 'child 2', :environment => Environment.default, :parent => c1) - c5 = Category.create!(:name => 'grandchild 2', :environment => Environment.default, :parent => c4) + should 'search people in category hierarchy' do + parent = Category.create!(:name => 'parent category', :environment => Environment.default) + child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) + p1 = create_user('people_1').person + p1.name = 'a beautiful person' + p1.add_category(child) + p1.save! - c1.reload + parent.reload - assert_equivalent [c1,c2,c3,c4,c5].map(&:id), CategoryFinder.new(c1).category_ids + f = CategoryFinder.new(parent) + assert_includes f.find(:people, 'beautiful'), p1 end - should 'search in category hierarchy' do + should 'search article in category hierarchy' do parent = Category.create!(:name => 'parent category', :environment => Environment.default) child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) - p1 = create_user('people_1').person; p1.name = 'a beautiful person'; p1.add_category(child); p1.save! + + p1 = create_user('people_1').person + + article = p1.articles.create!(:name => 'a beautiful article', :category_ids => [child.id]) parent.reload f = CategoryFinder.new(parent) - assert_includes f.find(:people, 'beautiful'), p1 + assert_includes f.find(:articles, 'beautiful'), article + end + + should 'find communites by initial in category hierarchy' do + parent = Category.create!(:name => 'parent category', :environment => Environment.default) + child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) + p1 = create_user('people_1').person + p1.name = 'person with inner beaity' + p1.add_category(child) + p1.save! + + parent.reload + + f = CategoryFinder.new(parent) + assert_includes f.find_by_initial(:people, 'p'), p1 + end + + should 'find articles by initial in category hierarchy' do + parent = Category.create!(:name => 'parent category', :environment => Environment.default) + child = Category.create!(:name => 'child category', :environment => Environment.default, :parent => parent) + + p1 = create_user('people_1').person + + article = p1.articles.create!(:name => 'fucking beautiful article', :category_ids => [child.id]) + + parent.reload + + f = CategoryFinder.new(parent) + assert_includes f.find_by_initial(:articles, 'f'), article end should 'list recent enterprises' do -- libgit2 0.21.2