From 2a93ce7caf4e25c028b7e08ea2fd1e035c6da570 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 9 Dec 2013 13:54:02 -0600 Subject: [PATCH] vrfs-884: refactored search filter var names --- ruby/lib/jam_ruby/models/search.rb | 15 +- .../models/band_filter_search_spec.rb | 149 +++++++----------- .../jam_ruby/models/musician_search_spec.rb | 40 ++--- web/app/views/api_search/index.rabl | 20 ++- 4 files changed, 105 insertions(+), 119 deletions(-) diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index dc68d1350..62d5ca8f1 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -2,6 +2,7 @@ module JamRuby # not a active_record model; just a search result class Search attr_accessor :bands, :musicians, :fans, :recordings, :friends, :search_type + attr_accessor :bands_filter, :musicians_filter LIMIT = 10 # performs a site-white search @@ -30,6 +31,8 @@ module JamRuby @fans = [] @recordings = [] @friends = [] + @musicians_filter = [] + @bands_filter = [] if search_results.nil? return @@ -38,7 +41,7 @@ module JamRuby search_results.take(LIMIT).each do |result| if result.class == User if result.musician - @musicians.push(result) + @musicians_filter.push(result) @search_type = PARAM_MUSICIAN else @fans.push(result) @@ -158,10 +161,10 @@ module JamRuby COUNTERS = [COUNT_FRIEND, COUNT_FOLLOW, COUNT_RECORD, COUNT_SESSION] def musician_results_for_user(results, user) - @search_type, @musicians = PARAM_MUSICIAN, results + @search_type, @musicians_filter = PARAM_MUSICIAN, results if user @user_counters = results.inject({}) { |hh,val| hh[val.id] = []; hh } - mids = "'#{@musicians.map(&:id).join("','")}'" + mids = "'#{@musicians_filter.map(&:id).join("','")}'" # this gets counts for each search result on friends/follows/records/sessions results.each do |uu| @@ -276,7 +279,7 @@ module JamRuby rel = rel.select(sel_str) rel, page = self.relation_pagination(rel, params) - rel = rel.includes([:users]) + rel = rel.includes([{ :users => :instruments } ]) objs = rel.all srch = Search.new @@ -285,10 +288,10 @@ module JamRuby end def band_results_for_user(results, user) - @search_type, @bands = PARAM_BAND, results + @search_type, @bands_filter = PARAM_BAND, results if user @user_counters = results.inject({}) { |hh,val| hh[val.id] = []; hh } - mids = "'#{@bands.map(&:id).join("','")}'" + mids = "'#{@bands_filter.map(&:id).join("','")}'" # this gets counts for each search result results.each do |bb| diff --git a/ruby/spec/jam_ruby/models/band_filter_search_spec.rb b/ruby/spec/jam_ruby/models/band_filter_search_spec.rb index b487890bb..51e43f403 100644 --- a/ruby/spec/jam_ruby/models/band_filter_search_spec.rb +++ b/ruby/spec/jam_ruby/models/band_filter_search_spec.rb @@ -26,23 +26,21 @@ describe 'Band search' do # expects all the bands num = Band.count results = Search.band_search({ :per_page => num }) - expect(results.bands.count).to eq(num) + expect(results.bands_filter.count).to eq(num) end it "finds bands with proper ordering" do # the ordering should be create_at since no followers exist expect(BandFollower.count).to eq(0) results = Search.band_search({ :per_page => Band.count }) - results.bands.each_with_index do |uu, idx| + results.bands_filter.each_with_index do |uu, idx| expect(uu.id).to eq(@bands.reverse[idx].id) end end it "sorts bands by followers" do users = [] - 4.downto(1) do |nn| - users << FactoryGirl.create(:user) - end + 4.downto(1) { |nn| users << FactoryGirl.create(:user) } # establish sorting order @band4.followers.concat(users[1..-1]) @@ -56,75 +54,51 @@ describe 'Band search' do # refresh the order to ensure it works right @band2.followers.concat(users[1..-1]) results = Search.band_search({ :per_page => @bands.size }, users[0]) - expect(results.bands[0].id).to eq(@band2.id) + expect(results.bands_filter[0].id).to eq(@band2.id) # check the follower count for given entry - expect(results.bands[0].search_follow_count.to_i).not_to eq(0) + expect(results.bands_filter[0].search_follow_count.to_i).not_to eq(0) # check the follow relationship between current_user and result expect(results.is_follower?(@band2)).to be true end it 'paginates properly' do - pending # make sure pagination works right params = { :per_page => 2, :page => 1 } results = Search.band_search(params) - expect(results.bands.count).to be 2 + expect(results.bands_filter.count).to be 2 end end - def make_recording(usr) - connection = FactoryGirl.create(:connection, :band => usr) - instrument = FactoryGirl.create(:instrument, :description => 'a great instrument') - track = FactoryGirl.create(:track, :connection => connection, :instrument => instrument) - music_session = FactoryGirl.create(:music_session, :creator => usr, :band_access => true) - music_session.connections << connection - music_session.save - recording = Recording.start(music_session, usr) - recording.stop - recording.reload - genre = FactoryGirl.create(:genre) - recording.claim(usr, "name", "description", genre, true, true) - recording.reload - recording + def make_session(band) + usr = band.users[0] + session = FactoryGirl.create(:music_session, :creator => usr, :description => "Session", :band => band) + FactoryGirl.create(:connection, :user => usr, :music_session => session) + user = FactoryGirl.create(:user) + session end - def make_session(usr) - connection = FactoryGirl.create(:connection, :band => usr) - music_session = FactoryGirl.create(:music_session, :creator => usr, :band_access => true) - music_session.connections << connection - music_session.save - end - -=begin context 'band stat counters' do - it "displays bands top followings" do - pending - @band4.followers.concat([@band4]) - @band3.followers.concat([@band4]) - @band2.followers.concat([@band4]) - expect(@band4.top_followings.count).to be 3 - expect(@band4.top_followings.map(&:id)).to match_array((@bands - [@band1]).map(&:id)) + it "follow stat shows follower count" do + users = [] + 2.downto(1) { |nn| users << FactoryGirl.create(:user) } + + # establish sorting order + @band1.followers.concat(users) + results = Search.band_search({},@band1) + uu = results.bands_filter.detect { |mm| mm.id == @band1.id } + expect(uu).to_not be_nil + expect(results.follow_count(uu)).to eq(users.count) end - it "recording stat shows recording count" do - pending - recording = make_recording(@band1) - expect(recording.bands.length).to be 1 - expect(recording.bands.first).to eq(@band1) + it "session stat shows session count" do + make_session(@band1) @band1.reload - expect(@band1.recordings.length).to be 1 - expect(@band1.recordings.first).to eq(recording) - expect(recording.claimed_recordings.length).to be 1 - expect(@band1.recordings.detect { |rr| rr == recording }).to_not be_nil - results = Search.band_search({},@band1) - uu = results.bands.detect { |mm| mm.id == @band1.id } + uu = results.bands_filter.detect { |mm| mm.id == @band1.id } expect(uu).to_not be_nil - - expect(results.record_count(uu)).to be 1 expect(results.session_count(uu)).to be 1 end @@ -133,86 +107,81 @@ describe 'Band search' do context 'band sorting' do it "by plays" do - pending - make_recording(@band1) + make_session(@band2) + make_session(@band2) + make_session(@band2) + make_session(@band1) # order results by num recordings - results = Search.band_search({ :orderby => 'plays' }, @band2) - expect(results.bands[0].id).to eq(@band1.id) - - # add more data and make sure order still correct - make_recording(@band2); make_recording(@band2) - results = Search.band_search({ :orderby => 'plays' }, @band2) - expect(results.bands[0].id).to eq(@band2.id) + results = Search.band_search({ :orderby => 'plays' }) + expect(results.bands_filter[0].id).to eq(@band2.id) + expect(results.bands_filter[1].id).to eq(@band1.id) end it "by now playing" do - pending # should get 1 result with 1 active session - make_session(@band3) - results = Search.band_search({ :orderby => 'playing' }, @band2) - expect(results.bands.count).to be 1 - expect(results.bands.first.id).to eq(@band3.id) + session = make_session(@band3) + FactoryGirl.create(:music_session_history, :music_session => session) + + results = Search.band_search({ :orderby => 'playing' }) + expect(results.bands_filter.count).to be 1 + expect(results.bands_filter.first.id).to eq(@band3.id) # should get 2 results with 2 active sessions # sort order should be created_at DESC - make_session(@band4) - results = Search.band_search({ :orderby => 'playing' }, @band2) - expect(results.bands.count).to be 2 - expect(results.bands[0].id).to eq(@band4.id) - expect(results.bands[1].id).to eq(@band3.id) + session = make_session(@band4) + FactoryGirl.create(:music_session_history, :music_session => session) + results = Search.band_search({ :orderby => 'playing' }) + expect(results.bands_filter.count).to be 2 + expect(results.bands_filter[0].id).to eq(@band4.id) + expect(results.bands_filter[1].id).to eq(@band3.id) end end + context 'filter settings' do - it "searches musicisns for an instrument" do - pending - minst = FactoryGirl.create(:band_instrument, { - :band => @band1, - :instrument => Instrument.find('tuba') }) - @band1.band_instruments << minst + it "searches bands for a genre" do + genre = FactoryGirl.create(:genre) + @band1.genres << genre @band1.reload - ii = @band1.instruments.detect { |inst| inst.id == 'tuba' } - expect(ii).to_not be_nil - results = Search.band_search({ :instrument => ii.id }) - results.bands.each do |rr| - expect(rr.instruments.detect { |inst| inst.id=='tuba' }.id).to eq(ii.id) + ggg = @band1.genres.detect { |gg| gg.id == genre.id } + expect(ggg).to_not be_nil + results = Search.band_search({ :genre => ggg.id }) + results.bands_filter.each do |rr| + expect(rr.genres.detect { |gg| gg.id==ggg.id }.id).to eq(genre.id) end - expect(results.count).to be 1 + expect(results.bands_filter.count).to be 1 end it "finds bands within a given distance of given location" do - pending num = Band.count expect(@band1.lat).to_not be_nil # short distance results = Search.band_search({ :per_page => num, :distance => 10, :city => 'Apex' }, @band1) - expect(results.count).to be num + expect(results.bands_filter.count).to be num # long distance results = Search.band_search({ :per_page => num, :distance => 1000, :city => 'Miami', :state => 'FL' }, @band1) - expect(results.count).to be num + expect(results.bands_filter.count).to be num end it "finds bands within a given distance of bands location" do - pending expect(@band1.lat).to_not be_nil # uses the location of @band1 results = Search.band_search({ :distance => 10, :per_page => Band.count }, @band1) - expect(results.count).to be Band.count + expect(results.bands_filter.count).to be Band.count end it "finds no bands within a given distance of location" do - pending expect(@band1.lat).to_not be_nil results = Search.band_search({ :distance => 10, :city => 'San Francisco' }, @band1) - expect(results.count).to be 0 + expect(results.bands_filter.count).to be 0 end 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 6eda4ae28..955b2f04f 100644 --- a/ruby/spec/jam_ruby/models/musician_search_spec.rb +++ b/ruby/spec/jam_ruby/models/musician_search_spec.rb @@ -18,14 +18,14 @@ describe 'Musician search' do # expects all the users num = User.musicians.count results = Search.musician_search({ :per_page => num }) - expect(results.musicians.count).to eq(num) + expect(results.musicians_filter.count).to eq(num) end it "finds musicians with proper ordering" do # the ordering should be create_at since no followers exist expect(UserFollower.count).to eq(0) results = Search.musician_search({ :per_page => User.musicians.count }) - results.musicians.each_with_index do |uu, idx| + results.musicians_filter.each_with_index do |uu, idx| expect(uu.id).to eq(@users.reverse[idx].id) end end @@ -41,10 +41,10 @@ describe 'Musician search' do # refresh the order to ensure it works right @user2.followers.concat([@user3, @user4, @user2]) results = Search.musician_search({ :per_page => @users.size }, @user3) - expect(results.musicians[0].id).to eq(@user2.id) + expect(results.musicians_filter[0].id).to eq(@user2.id) # check the follower count for given entry - expect(results.musicians[0].search_follow_count.to_i).not_to eq(0) + expect(results.musicians_filter[0].search_follow_count.to_i).not_to eq(0) # check the follow relationship between current_user and result expect(results.is_follower?(@user2)).to be true end @@ -53,7 +53,7 @@ describe 'Musician search' do # make sure pagination works right params = { :per_page => 2, :page => 1 } results = Search.musician_search(params) - expect(results.musicians.count).to be 2 + expect(results.musicians_filter.count).to be 2 end end @@ -96,7 +96,7 @@ describe 'Musician search' do Friendship.save(@user1.id, @user2.id) # search on user2 results = Search.musician_search({}, @user2) - friend = results.musicians.detect { |mm| mm.id == @user1.id } + friend = results.musicians_filter.detect { |mm| mm.id == @user1.id } expect(friend).to_not be_nil expect(results.friend_count(friend)).to be 1 @user1.reload @@ -115,7 +115,7 @@ describe 'Musician search' do expect(@user1.recordings.detect { |rr| rr == recording }).to_not be_nil results = Search.musician_search({},@user1) - uu = results.musicians.detect { |mm| mm.id == @user1.id } + uu = results.musicians_filter.detect { |mm| mm.id == @user1.id } expect(uu).to_not be_nil expect(results.record_count(uu)).to be 1 @@ -130,28 +130,28 @@ describe 'Musician search' do make_recording(@user1) # order results by num recordings results = Search.musician_search({ :orderby => 'plays' }, @user2) - expect(results.musicians[0].id).to eq(@user1.id) + expect(results.musicians_filter[0].id).to eq(@user1.id) # add more data and make sure order still correct make_recording(@user2); make_recording(@user2) results = Search.musician_search({ :orderby => 'plays' }, @user2) - expect(results.musicians[0].id).to eq(@user2.id) + expect(results.musicians_filter[0].id).to eq(@user2.id) end it "by now playing" do # should get 1 result with 1 active session make_session(@user3) results = Search.musician_search({ :orderby => 'playing' }, @user2) - expect(results.musicians.count).to be 1 - expect(results.musicians.first.id).to eq(@user3.id) + expect(results.musicians_filter.count).to be 1 + expect(results.musicians_filter.first.id).to eq(@user3.id) # should get 2 results with 2 active sessions # sort order should be created_at DESC make_session(@user4) results = Search.musician_search({ :orderby => 'playing' }, @user2) - expect(results.musicians.count).to be 2 - expect(results.musicians[0].id).to eq(@user4.id) - expect(results.musicians[1].id).to eq(@user3.id) + expect(results.musicians_filter.count).to be 2 + expect(results.musicians_filter[0].id).to eq(@user4.id) + expect(results.musicians_filter[1].id).to eq(@user3.id) end end @@ -166,10 +166,10 @@ describe 'Musician search' do ii = @user1.instruments.detect { |inst| inst.id == 'tuba' } expect(ii).to_not be_nil results = Search.musician_search({ :instrument => ii.id }) - results.musicians.each do |rr| + results.musicians_filter.each do |rr| expect(rr.instruments.detect { |inst| inst.id=='tuba' }.id).to eq(ii.id) end - expect(results.musicians.count).to be 1 + expect(results.musicians_filter.count).to be 1 end it "finds musicians within a given distance of given location" do @@ -179,26 +179,26 @@ describe 'Musician search' do results = Search.musician_search({ :per_page => num, :distance => 10, :city => 'Apex' }, @user1) - expect(results.musicians.count).to be num + expect(results.musicians_filter.count).to be num # long distance results = Search.musician_search({ :per_page => num, :distance => 1000, :city => 'Miami', :state => 'FL' }, @user1) - expect(results.musicians.count).to be num + expect(results.musicians_filter.count).to be num end it "finds musicians within a given distance of users location" do expect(@user1.lat).to_not be_nil # uses the location of @user1 results = Search.musician_search({ :distance => 10, :per_page => User.musicians.count }, @user1) - expect(results.musicians.count).to be User.musicians.count + expect(results.musicians_filter.count).to be User.musicians.count end it "finds no musicians within a given distance of location" do expect(@user1.lat).to_not be_nil results = Search.musician_search({ :distance => 10, :city => 'San Francisco' }, @user1) - expect(results.musicians.count).to be 0 + expect(results.musicians_filter.count).to be 0 end end diff --git a/web/app/views/api_search/index.rabl b/web/app/views/api_search/index.rabl index f4ec6a6e8..4c66715b5 100644 --- a/web/app/views/api_search/index.rabl +++ b/web/app/views/api_search/index.rabl @@ -1,12 +1,26 @@ object @search -unless @search.bands.nil? || @search.bands.size == 0 +if @search.bands.present? child(:bands => :bands) { attributes :id, :name, :location, :photo_url, :logo_url } end -unless @search.musicians.nil? || @search.musicians.size == 0 +if @search.musicians.present? + child(:musicians => :musicians) { + attributes :id, :first_name, :last_name, :name, :location, :photo_url + + node :is_friend do |musician| + musician.friends?(current_user) + end + + child :musician_instruments => :instruments do + attributes :instrument_id, :description, :proficiency_level, :priority + end + } +end + +if @search.musicians_filter.present? node :city do |user| current_user.try(:location) @@ -16,7 +30,7 @@ unless @search.musicians.nil? || @search.musicians.size == 0 @search.page_count end - child(:musicians => :musicians) { + child(:musicians_filter => :musicians) { attributes :id, :first_name, :last_name, :name, :city, :state, :country, :email, :online, :musician, :photo_url, :biography node :is_friend do |musician|