115 lines
2.8 KiB
Ruby
115 lines
2.8 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'
|
|
|
|
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,
|
|
'results' => []
|
|
},
|
|
KEY_ARTISTS => {
|
|
'page_num' => 0,
|
|
'page_count' => 0,
|
|
'results' => []
|
|
}
|
|
}
|
|
end
|
|
|
|
def self.search_target_class
|
|
JamTrack
|
|
end
|
|
|
|
def do_search(filter)
|
|
rel = JamTrack.unscoped
|
|
|
|
unless (vals=filter[KEY_GENRES]).blank?
|
|
rel = rel.where("jam_tracks.genre_id IN ('#{vals.join("','")}')")
|
|
end
|
|
|
|
unless (vals=filter[KEY_INSTRUMENTS]).blank?
|
|
rel = rel.join(:jam_track_tracks)
|
|
rel = rel.where("jam_track_tracks.instrument_id IN ('#{vals.join("','")}')")
|
|
rel = rel.where("jam_track_tracks.track_type != 'Master'")
|
|
end
|
|
|
|
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]}%")
|
|
|
|
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.genre.description,
|
|
'year' => ''
|
|
}
|
|
end
|
|
filter[KEY_SONGS] = {
|
|
'page_num' => pgnum,
|
|
'page_count' => rel.total_pages,
|
|
'results' => results
|
|
}
|
|
end
|
|
|
|
if has_artists
|
|
rel = do_search(filter)
|
|
rel = rel.where("original_artist LIKE ?","%#{filter[KEY_SEARCH_STR]}%")
|
|
|
|
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,
|
|
'results' => results
|
|
}
|
|
end
|
|
|
|
filter
|
|
end
|
|
|
|
end
|
|
end
|