From 36db710b4bc2f2ab6c7e086f19cf4b425f3ee9c6 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Sun, 2 Aug 2015 07:31:58 +0000 Subject: [PATCH] VRFS-3398 fixing queries, api integration --- ruby/lib/jam_ruby/models/jam_track_search.rb | 24 +++++++------- .../jam_ruby/models/jam_track_search_spec.rb | 32 ++++++++++++------- web/app/controllers/api_search_controller.rb | 9 +++--- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/ruby/lib/jam_ruby/models/jam_track_search.rb b/ruby/lib/jam_ruby/models/jam_track_search.rb index 2051981a9..b37994251 100644 --- a/ruby/lib/jam_ruby/models/jam_track_search.rb +++ b/ruby/lib/jam_ruby/models/jam_track_search.rb @@ -38,6 +38,7 @@ module JamRuby unless (vals=filter[KEY_GENRES]).blank? rel = rel.where("jam_tracks.genre_id IN ('#{vals.join("','")}')") + rel = rel.includes(:genre) end unless (vals=filter[KEY_INSTRUMENTS]).blank? @@ -49,27 +50,19 @@ module JamRuby rel end - def search_includes(rel) - rel.includes([:instruments, :genres]) - end - SONGS_PER_PAGE = 20 ARTISTS_PER_PAGE = 20 def search_results_page(filter=nil) - if filter - self.data_blob = filter - self.save - else - filter = self.data_blob - end - result_types = filter[KEY_RESULT_TYPES] has_songs, has_artists = result_types.index(KEY_SONGS), result_types.index(KEY_ARTISTS) if has_songs rel = do_search(filter) - rel = rel.where("name LIKE ?","%#{filter[KEY_SEARCH_STR]}%") + unless (val=filter[KEY_SEARCH_STR]).blank? + rel = rel.where("name LIKE ?","%#{val}%") + end + rel = rel.order(:name).includes(:genre) pgnum = [filter[KEY_SONGS]['page_num'].to_i, 1].max rel = rel.paginate(:page => pgnum, :per_page => SONGS_PER_PAGE) @@ -92,7 +85,12 @@ module JamRuby if has_artists rel = do_search(filter) - rel = rel.where("original_artist LIKE ?","%#{filter[KEY_SEARCH_STR]}%") + rel = rel.select("DISTINCT ON(jam_tracks.original_artist) jam_tracks.id, jam_tracks.original_artist") + + unless (val=filter[KEY_SEARCH_STR]).blank? + rel = rel.where("original_artist LIKE ?","%#{val}%") + end + rel = rel.order(:original_artist) pgnum = [filter[KEY_ARTISTS]['page_num'].to_i, 1].max rel = rel.paginate(:page => pgnum, :per_page => ARTISTS_PER_PAGE) diff --git a/ruby/spec/jam_ruby/models/jam_track_search_spec.rb b/ruby/spec/jam_ruby/models/jam_track_search_spec.rb index d99f8c73c..1cce79271 100644 --- a/ruby/spec/jam_ruby/models/jam_track_search_spec.rb +++ b/ruby/spec/jam_ruby/models/jam_track_search_spec.rb @@ -12,29 +12,37 @@ describe 'JamTrack Search Model' do filter[JamTrackSearch::KEY_RESULT_TYPES] = [JamTrackSearch::KEY_SONGS] filter } + let(:freebird) { + FactoryGirl.create(:jam_track_with_tracks, original_artist: 'jim bob', name: 'freebird') + } + let(:stairway) { + FactoryGirl.create(:jam_track_with_tracks, original_artist: 'jim bob', name: 'stairway to heaven') + } before :each do JamTrack.delete_all - jam_track1 = FactoryGirl.create(:jam_track_with_tracks, original_artist: 'jim bob', name: 'stairway to heaven') - jam_track2 = FactoryGirl.create(:jam_track_with_tracks, original_artist: 'jim bob', name: 'freebird') + JamTrackTrack.delete_all + freebird + stairway end describe "Search filter" do + it "finds by artist" do filter = artist_filter.clone - filter[JamTrackSearch::KEY_SEARCH_STR] = 'jim bob' + filter[JamTrackSearch::KEY_SEARCH_STR] = freebird.original_artist filter = JamTrackSearch.new.search_results_page(filter) - expect(filter[JamTrackSearch::KEY_ARTISTS]['results'].count).to be(2) + expect(filter[JamTrackSearch::KEY_ARTISTS]['results'].count).to be(1) end it "paginates by artist" do JamTrackSearch::ARTISTS_PER_PAGE.times do |nn| FactoryGirl.create(:jam_track_with_tracks, - original_artist: 'jim bob', + original_artist: freebird.original_artist + nn.to_s, name: 'abc'+nn.to_s) end filter = artist_filter.clone - filter[JamTrackSearch::KEY_SEARCH_STR] = 'jim bob' + filter[JamTrackSearch::KEY_SEARCH_STR] = freebird.original_artist out_filter = JamTrackSearch.new.search_results_page(filter.clone) expect(out_filter[JamTrackSearch::KEY_ARTISTS]['results'].count).to be([JamTrackSearch::ARTISTS_PER_PAGE, JamTrack.count].min) num_page = (JamTrack.count / JamTrackSearch::ARTISTS_PER_PAGE) + 1 @@ -42,27 +50,29 @@ describe 'JamTrack Search Model' do filter[JamTrackSearch::KEY_ARTISTS]['page_num'] = 2 out_filter = JamTrackSearch.new.search_results_page(filter.clone) - expect(out_filter[JamTrackSearch::KEY_ARTISTS]['results'].count).to be(2) + expect(out_filter[JamTrackSearch::KEY_ARTISTS]['results'].count).to be(1) end it "finds by song" do filter = song_filter.clone - filter[JamTrackSearch::KEY_SEARCH_STR] = 'freebird' + filter[JamTrackSearch::KEY_SEARCH_STR] = freebird.name filter = JamTrackSearch.new.search_results_page(filter.clone) expect(filter[JamTrackSearch::KEY_SONGS]['results'].count).to be(1) end it "paginates by song" do - JamTrackSearch::SONGS_PER_PAGE.times do |nn| + (JamTrackSearch::SONGS_PER_PAGE + 2).times do |nn| FactoryGirl.create(:jam_track_with_tracks, - original_artist: 'jim bob', + original_artist: freebird.original_artist, name: 'abc'+nn.to_s) end filter = song_filter.clone filter[JamTrackSearch::KEY_SEARCH_STR] = 'abc' out_filter = JamTrackSearch.new.search_results_page(filter.clone) expect(out_filter[JamTrackSearch::KEY_SONGS]['results'].count).to be([JamTrackSearch::SONGS_PER_PAGE, JamTrack.count].min) - num_page = (JamTrack.count / JamTrackSearch::SONGS_PER_PAGE) + 1 + + total_count = JamTrack.where("name LIKE 'abc%'").count + num_page = (total_count / JamTrackSearch::SONGS_PER_PAGE) + (0==(total_count % JamTrackSearch::SONGS_PER_PAGE) ? 0 : 1) expect(out_filter[JamTrackSearch::KEY_SONGS]['page_count']).to be(num_page) filter[JamTrackSearch::KEY_SONGS]['page_num'] = 2 diff --git a/web/app/controllers/api_search_controller.rb b/web/app/controllers/api_search_controller.rb index 424ebd51a..293462473 100644 --- a/web/app/controllers/api_search_controller.rb +++ b/web/app/controllers/api_search_controller.rb @@ -1,7 +1,7 @@ class ApiSearchController < ApiController # have to be signed in currently to see this screen - before_filter :api_signed_in_user + before_filter :api_signed_in_user, :except => :jam_tracks respond_to :json @@ -68,11 +68,10 @@ class ApiSearchController < ApiController def jam_tracks if request.get? + render(json: {}, status: 200) and return elsif request.post? - json = JSON.parse(request.body) - result = JamTrackSearch.search_results_page(json) - - render json: result.to_json, status: 200 + result = JamTrackSearch.new.search_results_page(request.params[:api_search]) + render(json: result.to_json, status: 200) and return end end