2015-08-02 03:05:57 +00:00
|
|
|
module JamRuby
|
|
|
|
|
class JamTrackSearch < BaseSearch
|
|
|
|
|
|
|
|
|
|
cattr_accessor :jschema, :search_meta
|
|
|
|
|
attr_accessor :user_counters
|
|
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
KEY_QUERY = 'query'
|
2015-08-02 03:05:57 +00:00
|
|
|
KEY_SEARCH_STR = 'search_str'
|
|
|
|
|
KEY_RESULT_TYPES = 'result_types'
|
|
|
|
|
KEY_SONGS = 'songs'
|
|
|
|
|
KEY_ARTISTS = 'artists'
|
2015-08-02 15:38:32 +00:00
|
|
|
KEY_RESULTS = 'results'
|
2015-09-19 21:19:27 +00:00
|
|
|
KEY_RESULT_SETS = 'result_sets'
|
|
|
|
|
KEY_PAGE_NUM = 'page_num'
|
|
|
|
|
KEY_TOTAL_COUNT = 'total_count'
|
|
|
|
|
KEY_PAGE_COUNT = 'page_count'
|
|
|
|
|
KEY_PER_PAGE = 'per_page'
|
|
|
|
|
PER_PAGE = 'development'==Rails.env ? 8 : 20
|
|
|
|
|
KEY_GENRES = 'genres'
|
|
|
|
|
KEY_INSTRUMENTS = 'instruments'
|
|
|
|
|
KEY_LANGUAGE = 'language'
|
2015-10-29 03:17:47 +00:00
|
|
|
KEY_ORIGINAL_ARTIST = 'original_artist'
|
2015-08-02 03:05:57 +00:00
|
|
|
|
|
|
|
|
def self.json_schema
|
2015-09-19 21:19:27 +00:00
|
|
|
return @@jschema ||= {
|
|
|
|
|
KEY_QUERY => {
|
|
|
|
|
KEY_SEARCH_STR => '',
|
|
|
|
|
KEY_INSTRUMENTS => [],
|
|
|
|
|
KEY_GENRES => [],
|
|
|
|
|
KEY_LANGUAGE => '',
|
2015-10-29 03:17:47 +00:00
|
|
|
KEY_ORIGINAL_ARTIST => '',
|
2015-09-19 21:19:27 +00:00
|
|
|
KEY_RESULT_TYPES => [],
|
|
|
|
|
KEY_PAGE_NUM => 1,
|
|
|
|
|
KEY_PER_PAGE => PER_PAGE,
|
2015-08-02 03:05:57 +00:00
|
|
|
},
|
2015-09-19 21:19:27 +00:00
|
|
|
KEY_RESULT_SETS => {
|
|
|
|
|
KEY_SONGS => {
|
|
|
|
|
KEY_RESULTS => [],
|
|
|
|
|
KEY_PAGE_NUM => 1,
|
|
|
|
|
KEY_TOTAL_COUNT => 0,
|
|
|
|
|
KEY_PAGE_COUNT => 0,
|
|
|
|
|
},
|
|
|
|
|
KEY_ARTISTS => {
|
|
|
|
|
KEY_RESULTS => [],
|
|
|
|
|
KEY_PAGE_NUM => 1,
|
|
|
|
|
KEY_TOTAL_COUNT => 0,
|
|
|
|
|
KEY_PAGE_COUNT => 0,
|
|
|
|
|
},
|
2015-08-02 15:38:32 +00:00
|
|
|
},
|
2015-08-02 03:05:57 +00:00
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def self.search_target_class
|
|
|
|
|
JamTrack
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
def do_search(query)
|
2015-08-02 03:05:57 +00:00
|
|
|
rel = JamTrack.unscoped
|
2015-09-19 21:19:27 +00:00
|
|
|
|
|
|
|
|
unless (gids = query[KEY_GENRES]).blank?
|
|
|
|
|
allgids = self.class.genre_ids
|
|
|
|
|
gids = gids.select { |gg| allgids.has_key?(gg) }
|
|
|
|
|
|
|
|
|
|
unless gids.blank?
|
|
|
|
|
sqlstr = "'#{gids.join("','")}'"
|
|
|
|
|
rel = rel.joins(:genres_jam_tracks)
|
|
|
|
|
rel = rel.where("genres_jam_tracks.genre_id IN (#{sqlstr})")
|
|
|
|
|
end
|
2015-08-02 03:05:57 +00:00
|
|
|
end
|
2015-09-19 21:19:27 +00:00
|
|
|
unless (instruments = query[KEY_INSTRUMENTS]).blank?
|
|
|
|
|
instrids = self.class.instrument_ids
|
|
|
|
|
instruments = instruments.select { |ii| instrids.has_key?(ii['instrument_id']) }
|
2015-08-02 03:05:57 +00:00
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
unless instruments.blank?
|
|
|
|
|
sqlstr = "'#{instruments.join("','")}'"
|
|
|
|
|
rel = rel.joins(:jam_track_tracks)
|
|
|
|
|
rel = rel.where("jam_track_tracks.instrument_id IN (#{sqlstr})")
|
2015-11-30 23:54:17 +00:00
|
|
|
rel = rel.where("jam_track_tracks.track_type = 'Track'")
|
2015-09-19 21:19:27 +00:00
|
|
|
end
|
2015-08-02 03:05:57 +00:00
|
|
|
end
|
|
|
|
|
|
2015-10-29 03:17:47 +00:00
|
|
|
unless (artist_name = query[KEY_ORIGINAL_ARTIST]).blank?
|
|
|
|
|
rel = rel.where(original_artist: artist_name)
|
|
|
|
|
end
|
|
|
|
|
|
2015-08-02 03:05:57 +00:00
|
|
|
rel
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
def search_results_page(query=nil)
|
|
|
|
|
filter = {
|
|
|
|
|
KEY_QUERY => query,
|
|
|
|
|
}
|
|
|
|
|
result_types = query[KEY_RESULT_TYPES]
|
|
|
|
|
if result_types
|
|
|
|
|
has_songs, has_artists = result_types.index(KEY_SONGS), result_types.index(KEY_ARTISTS)
|
|
|
|
|
else
|
|
|
|
|
has_songs, has_artists = true, true
|
|
|
|
|
end
|
2015-10-29 03:17:47 +00:00
|
|
|
result_sets = filter[KEY_RESULT_SETS] = self.class.json_schema[KEY_RESULT_SETS].clone
|
2015-08-02 03:05:57 +00:00
|
|
|
if has_songs
|
2015-09-19 21:19:27 +00:00
|
|
|
rel = do_search(query)
|
|
|
|
|
unless (val = query[KEY_SEARCH_STR]).blank?
|
2015-08-27 04:26:38 +00:00
|
|
|
tsquery = Search.create_tsquery(val)
|
|
|
|
|
rel = rel.where("(search_tsv @@ to_tsquery('jamenglish', ?))", tsquery) if tsquery
|
2015-08-02 07:31:58 +00:00
|
|
|
end
|
2015-08-15 00:24:23 +00:00
|
|
|
rel = rel.order(:name).includes(:genres)
|
2015-08-02 03:05:57 +00:00
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
pgnum = [query[KEY_PAGE_NUM].to_i, 1].max
|
|
|
|
|
rel = rel.paginate(:page => pgnum, :per_page => query[KEY_PER_PAGE])
|
2015-08-02 03:05:57 +00:00
|
|
|
|
|
|
|
|
results = rel.all.collect do |jt|
|
|
|
|
|
{
|
|
|
|
|
'id' => jt.id,
|
2015-09-19 21:19:27 +00:00
|
|
|
'name' => jt.name,
|
2015-08-02 03:05:57 +00:00
|
|
|
'artist' => jt.original_artist,
|
2015-08-15 00:24:23 +00:00
|
|
|
'genre' => jt.genres.map(&:description).join(', '),
|
2015-10-13 17:33:12 +00:00
|
|
|
'plan_code' => jt.plan_code,
|
2015-11-01 02:27:18 +00:00
|
|
|
'year' => jt.year
|
2015-08-02 03:05:57 +00:00
|
|
|
}
|
|
|
|
|
end
|
2015-09-19 21:19:27 +00:00
|
|
|
|
|
|
|
|
result_sets[KEY_SONGS] = {
|
|
|
|
|
KEY_RESULTS => results,
|
|
|
|
|
KEY_PAGE_NUM => pgnum,
|
|
|
|
|
KEY_TOTAL_COUNT => rel.total_entries,
|
|
|
|
|
KEY_PAGE_COUNT => rel.total_pages,
|
2015-08-02 03:05:57 +00:00
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if has_artists
|
2015-09-19 21:19:27 +00:00
|
|
|
rel = do_search(query)
|
2015-10-29 03:17:47 +00:00
|
|
|
counter = rel.select("DISTINCT(jam_tracks.original_artist)")
|
2015-08-02 07:31:58 +00:00
|
|
|
rel = rel.select("DISTINCT ON(jam_tracks.original_artist) jam_tracks.id, jam_tracks.original_artist")
|
|
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
unless (val = query[KEY_SEARCH_STR]).blank?
|
2015-12-26 02:47:39 +00:00
|
|
|
rel = rel.where("original_artist ILIKE ?","%#{val}%")
|
|
|
|
|
counter = counter.where("original_artist ILIKE ?","%#{val}%")
|
2015-08-02 07:31:58 +00:00
|
|
|
end
|
|
|
|
|
rel = rel.order(:original_artist)
|
2015-08-02 03:05:57 +00:00
|
|
|
|
2015-09-19 21:19:27 +00:00
|
|
|
pgnum = [query[KEY_PAGE_NUM].to_i, 1].max
|
|
|
|
|
rel = rel.paginate(:page => pgnum, :per_page => query[KEY_PER_PAGE])
|
2015-08-02 03:05:57 +00:00
|
|
|
|
|
|
|
|
results = rel.all.collect do |jt|
|
|
|
|
|
{ 'id' => jt.id, 'artist' => jt.original_artist }
|
|
|
|
|
end
|
2015-10-29 03:17:47 +00:00
|
|
|
|
|
|
|
|
artist_count = counter.count
|
2015-09-19 21:19:27 +00:00
|
|
|
|
|
|
|
|
result_sets[KEY_ARTISTS] = {
|
|
|
|
|
KEY_RESULTS => results,
|
|
|
|
|
KEY_PAGE_NUM => pgnum,
|
2015-10-29 03:17:47 +00:00
|
|
|
KEY_TOTAL_COUNT => artist_count,
|
|
|
|
|
KEY_PAGE_COUNT => (artist_count / query[KEY_PER_PAGE].to_f).ceil,
|
2015-08-02 03:05:57 +00:00
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
filter
|
|
|
|
|
end
|
2015-09-19 21:19:27 +00:00
|
|
|
|
|
|
|
|
def self.all_languages
|
|
|
|
|
JamTrack.select("SELECT DISTINCT(language)").order(:language).collect do |lang|
|
|
|
|
|
{ description: ISO_639.find_by_code(lang), id: lang }
|
|
|
|
|
end
|
|
|
|
|
end
|
2015-08-02 03:05:57 +00:00
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|