jam-cloud/lib/jam_ruby/models/search.rb

81 lines
2.0 KiB
Ruby

module JamRuby
# not a active_record model; just a search result
class Search
attr_accessor :bands, :musicians, :fans, :recordings, :friends
LIMIT = 10
# performs a site-white search
def self.search(query)
users = User.search(query, :limit => LIMIT)
bands = Band.search(query, :limit => LIMIT)
recordings = Recording.search(query, :limit => LIMIT)
return Search.new(users + bands + recordings)
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