vrfs-774: updated *_count JSON attributes; added post-search processing for current_user/result likes/follow/friend settings

This commit is contained in:
Jonathan Kolyer 2013-11-05 08:49:31 -06:00
parent 0813c6efd0
commit 496b63b68c
4 changed files with 77 additions and 14 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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