From 496b63b68ce6859c891320b9ba96afad02daa3ff Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 5 Nov 2013 08:49:31 -0600 Subject: [PATCH] vrfs-774: updated *_count JSON attributes; added post-search processing for current_user/result likes/follow/friend settings --- ruby/lib/jam_ruby/models/search.rb | 60 +++++++++++++++++-- .../jam_ruby/models/musician_search_spec.rb | 13 ++-- web/app/assets/javascripts/findMusician.js | 8 +-- web/app/views/api_search/index.rabl | 10 +++- 4 files changed, 77 insertions(+), 14 deletions(-) diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index 994edaf99..6f11b2d4f 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -1,7 +1,7 @@ module JamRuby # not a active_record model; just a search result class Search - attr_accessor :bands, :musicians, :fans, :recordings, :friends + attr_accessor :bands, :musicians, :fans, :recordings, :friends, :search_type, :user_mappings PARAM_MUSICIAN = :search_m @@ -64,14 +64,14 @@ module JamRuby sel_str = "#{sel_str}, COUNT(records) AS search_recording_count" rel = rel.joins("LEFT JOIN music_sessions AS sessions ON sessions.user_id = users.id") sel_str = "#{sel_str}, COUNT(sessions) AS search_session_count" - rel = rel.select(sel_str) + rel = rel.select(sel_str) perpage = params[:per_page] || M_PER_PAGE page = [params[:page].to_i, 1].max rel = rel.paginate(:page => page, :per_page => perpage) - rel.includes([:instruments, :followings]) + rel.includes([:instruments, :followings, :friends]) - Search.new(rel.all) + Search.new.musician_results_for_user(rel.all, current_user) end # performs a site-white search @@ -94,7 +94,7 @@ module JamRuby # end # search_results - results from a Tire search across band/user/recording - def initialize(search_results) + def initialize(search_results=nil) @bands = [] @musicians = [] @fans = [] @@ -109,6 +109,7 @@ module JamRuby if result.class == User if result.musician @musicians.push(result) + @search_type = PARAM_MUSICIAN else @fans.push(result) end @@ -150,5 +151,54 @@ module JamRuby return args end + RESULT_FOLLOW = :follows + RESULT_LIKE = :likes + RESULT_FRIEND = :friends + + def musician_results_for_user(results, user) + @search_type, @musicians = PARAM_MUSICIAN, results + if user + @user_mappings = results.inject({}) { |hh,val| hh[val.id] = []; hh } + mids = "'#{@musicians.map(&:id).join("','")}'" + + rel = User.select("users.id AS uid, follows.id AS jid") + rel = rel.joins("LEFT JOIN users_followers AS follows ON follows.follower_id = '#{user.id}'") + rel = rel.where(["users.id IN (#{mids}) AND follows.user_id = users.id"]) + rel.all.each { |val| @user_mappings[val.uid] << RESULT_FOLLOW if @user_mappings[val.uid] } + + rel = User.select("users.id AS uid, likers.id AS jid") + rel = rel.joins("LEFT JOIN users_likers AS likers ON likers.liker_id = '#{user.id}'") + rel = rel.where(["users.id IN (#{mids}) AND likers.user_id = users.id"]) + rel.all.each { |val| @user_mappings[val.uid] << RESULT_LIKE if @user_mappings[val.uid] } + + rel = User.select("users.id AS uid, friends.id AS jid") + rel = rel.joins("LEFT JOIN friendships AS friends ON friends.friend_id = '#{user.id}'") + rel = rel.where(["users.id IN (#{mids}) AND friends.user_id = users.id"]) + rel.all.each { |val| @user_mappings[val.uid] << RESULT_FRIEND if @user_mappings[val.uid] } + else + @user_mappings = {} + end + self + end + + def is_friend?(musician) + if mm = @user_mappings[musician.id] + return mm.include?(RESULT_FRIEND) + end + false + end + def is_follower?(musician) + if mm = @user_mappings[musician.id] + return mm.include?(RESULT_FOLLOW) + end + false + end + def is_liker?(musician) + if mm = @user_mappings[musician.id] + return mm.include?(RESULT_LIKE) + end + false + end + end end diff --git a/ruby/spec/jam_ruby/models/musician_search_spec.rb b/ruby/spec/jam_ruby/models/musician_search_spec.rb index 576af01ec..4cf79e7e3 100644 --- a/ruby/spec/jam_ruby/models/musician_search_spec.rb +++ b/ruby/spec/jam_ruby/models/musician_search_spec.rb @@ -47,23 +47,28 @@ describe User do # refresh the order to ensure it works right @user2.followers.concat([@user3, @user4, @user2]) - results = Search.musician_search(params) + results = Search.musician_search(params, @user3) results.musicians[0].id.should == @user2.id + # check the follower count for given entry + results.musicians[0].search_follow_count.to_i.should_not == 0 + # check the follow relationship between current_user and result + results.is_follower?(@user2).should == true + # make sure pagination works right params = { :per_page => 2, :page => 1 } results = Search.musician_search(params) results.musicians.count.should == 2 - - results.musicians[0].search_follow_count.to_i.should_not == 0 end +=begin it "should have friends counter " do Friendship.save(@user1.id, @user2.id) results = Search.musician_search friend = results.musicians.detect { |mm| mm.id == @user1.id } friend.should_not == nil friend.search_friend_count.to_i.should == 1 + results.musicians[0].is_follower?(@user1).should == true end it "should have recording counter " do @@ -133,5 +138,5 @@ describe User do results = Search.musician_search(params) results.musicians.count.should == User.count end - +=end end diff --git a/web/app/assets/javascripts/findMusician.js b/web/app/assets/javascripts/findMusician.js index 8b3ad8b63..cbf50789c 100644 --- a/web/app/assets/javascripts/findMusician.js +++ b/web/app/assets/javascripts/findMusician.js @@ -123,10 +123,10 @@ musician_location: mm.city + ', ' + mm.state, instruments: instr_logos, biography: mm['biography'], - follow_count: mm['search_follow_count'], - friend_count: mm['search_friend_count'], - recording_count: mm['search_recording_count'], - session_count: mm['search_session_count'], + follow_count: mm['follow_count'], + friend_count: mm['friend_count'], + recording_count: mm['recording_count'], + session_count: mm['session_count'], musician_follow_template: follows }; renderings += context.JK.fillTemplate(mTemplate, mVals); diff --git a/web/app/views/api_search/index.rabl b/web/app/views/api_search/index.rabl index 0df188af6..75fda0833 100644 --- a/web/app/views/api_search/index.rabl +++ b/web/app/views/api_search/index.rabl @@ -11,7 +11,15 @@ unless @search.musicians.nil? || @search.musicians.size == 0 attributes :id, :first_name, :last_name, :name, :city, :state, :country, :email, :online, :musician, :photo_url, :biography node :is_friend do |musician| - musician.friends?(current_user) + @search.is_friend?(musician) + end + + node :is_following do |musician| + @search.is_following?(musician) + end + + node :is_liker do |musician| + @search.is_liker?(musician) end child :musician_instruments => :instruments do