97 lines
2.5 KiB
Ruby
97 lines
2.5 KiB
Ruby
module JamRuby
|
|
# not a active_record model; just a search result
|
|
class Search
|
|
attr_accessor :bands, :musicians, :fans, :recordings, :friends
|
|
|
|
LIMIT = 10
|
|
|
|
ORDER_FOLLOWS = ['Most Followed', :followed]
|
|
ORDER_LIKED = ['Most Liked', :liked]
|
|
ORDER_PLAYING = ['Playing Now', :playing]
|
|
ORDERINGS = [ORDER_FOLLOWS, ORDER_LIKED, ORDER_PLAYING]
|
|
ORDERING_KEYS = ORDERINGS.collect { |oo| oo[1] }
|
|
|
|
def self.order_param(params)
|
|
ordering = params[:orderby]
|
|
ordering.blank? ? ORDERING_KEYS[0] : ordering
|
|
end
|
|
|
|
# performs a site-white search
|
|
def self.search(query, user_id = nil)
|
|
|
|
users = User.search(query, :limit => LIMIT)
|
|
bands = Band.search(query, :limit => LIMIT)
|
|
# NOTE: I removed recordings from search here. This is because we switched
|
|
# to "claimed_recordings" so it's not clear what should be searched.
|
|
|
|
friends = Friendship.search(query, user_id, :limit => LIMIT)
|
|
|
|
return Search.new(users + bands + friends)
|
|
end
|
|
|
|
# performs a friend search scoped to a specific user
|
|
# def self.search_by_user(query, user_id)
|
|
# friends = Friendship.search(query, user_id, :limit => LIMIT)
|
|
# return Search.new(friends)
|
|
# end
|
|
|
|
# search_results - results from a Tire search across band/user/recording
|
|
def initialize(search_results)
|
|
@bands = []
|
|
@musicians = []
|
|
@fans = []
|
|
@recordings = []
|
|
@friends = []
|
|
|
|
if search_results.nil?
|
|
return
|
|
end
|
|
|
|
search_results.take(LIMIT).each do |result|
|
|
if result.class == User
|
|
if result.musician
|
|
@musicians.push(result)
|
|
else
|
|
@fans.push(result)
|
|
end
|
|
elsif result.class == Band
|
|
@bands.push(result)
|
|
elsif result.class == Recording
|
|
@recordings.push(result)
|
|
elsif result.class == Friendship
|
|
@friends.push(result.friend)
|
|
else
|
|
raise Exception, "unknown class #{result.class} returned in search results"
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.create_tsquery(query)
|
|
# empty queries don't hit back to elasticsearch
|
|
if query.nil? || query.length == 0
|
|
return nil
|
|
end
|
|
|
|
search_terms = query.split
|
|
|
|
if search_terms.length == 0
|
|
return nil
|
|
end
|
|
|
|
args = nil
|
|
search_terms.each do |search_term|
|
|
if args == nil
|
|
args = search_term
|
|
else
|
|
args = args + " & " + search_term
|
|
end
|
|
|
|
end
|
|
args = args + ":*"
|
|
|
|
return args
|
|
end
|
|
|
|
end
|
|
end
|