jam-cloud/ruby/lib/jam_ruby/models/jam_track_search.rb

121 lines
3.4 KiB
Ruby

module JamRuby
class JamTrackSearch < BaseSearch
cattr_accessor :jschema, :search_meta
attr_accessor :user_counters
KEY_SEARCH_STR = 'search_str'
KEY_RESULT_TYPES = 'result_types'
KEY_SONGS = 'songs'
KEY_ARTISTS = 'artists'
KEY_RESULTS = 'results'
def self.json_schema
return @@jschema if @@jschema
@@jschema = {
KEY_SEARCH_STR => '',
KEY_INSTRUMENTS => [],
KEY_GENRES => [],
KEY_RESULT_TYPES => [],
KEY_SONGS => {
'page_num' => 0,
'page_count' => 0,
},
KEY_ARTISTS => {
'page_num' => 0,
'page_count' => 0,
},
KEY_RESULTS => {
KEY_SONGS => [],
KEY_ARTISTS => [],
}
}
end
def self.search_target_class
JamTrack
end
def do_search(filter)
rel = JamTrack.unscoped
unless (vals=filter[KEY_GENRES]).blank?
sqlstr = "'#{vals.join("','")}'"
# sqlstr = ActiveRecord::Base.connection.quote("'#{vals.join("','")}'")
rel = rel.joins(:genres_jam_tracks)
rel = rel.where("genres_jam_tracks.genre_id IN (#{sqlstr})")
end
unless (vals=filter[KEY_INSTRUMENTS]).blank?
sqlstr = "'#{vals.join("','")}'"
# sqlstr = ActiveRecord::Base.connection.quote("'#{vals.join("','")}'")
rel = rel.joins(:jam_track_tracks)
rel = rel.where("jam_track_tracks.instrument_id IN (#{sqlstr})")
rel = rel.where("jam_track_tracks.track_type != 'Master'")
end
rel
end
SONGS_PER_PAGE = 20
ARTISTS_PER_PAGE = 20
def search_results_page(filter=nil)
result_types = filter[KEY_RESULT_TYPES]
has_songs, has_artists = result_types.index(KEY_SONGS), result_types.index(KEY_ARTISTS)
filter[KEY_RESULTS] = {}
if has_songs
rel = do_search(filter)
unless (val=filter[KEY_SEARCH_STR]).blank?
tsquery = Search.create_tsquery(val)
rel = rel.where("(search_tsv @@ to_tsquery('jamenglish', ?))", tsquery) if tsquery
end
rel = rel.order(:name).includes(:genres)
pgnum = [filter[KEY_SONGS]['page_num'].to_i, 1].max
rel = rel.paginate(:page => pgnum, :per_page => SONGS_PER_PAGE)
results = rel.all.collect do |jt|
{
'id' => jt.id,
'song_name' => jt.name,
'artist' => jt.original_artist,
'genre' => jt.genres.map(&:description).join(', '),
'year' => ''
}
end
filter[KEY_SONGS] = {
'page_num' => pgnum,
'page_count' => rel.total_pages,
}
filter[KEY_RESULTS][KEY_SONGS] = results
end
if has_artists
rel = do_search(filter)
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)
results = rel.all.collect do |jt|
{ 'id' => jt.id, 'artist' => jt.original_artist }
end
filter[KEY_ARTISTS] = {
'page_num' => pgnum,
'page_count' => rel.total_pages,
}
filter[KEY_RESULTS][KEY_ARTISTS] = results
end
filter
end
end
end