Send a request to the local search REST API V3.
# File lib/ym4r/yahoo_maps/building_block/local_search.rb, line 11 def self.get(param) unless param.has_key?(:street) or param.has_key?(:city) or param.has_key?(:state) or param.has_key?(:zip) or param.has_key?(:location) or (param.has_key?(:longitude) and param.has_key?(:latitude)) raise MissingParameterException.new("Missing location data for the Yahoo! Maps Local Search service") end unless param.has_key?(:query) or param.has_key?(:listing_id) raise MissingParameterException.new("Missing query data for the Yahoo! Maps Local Search service") end url = "http://api.local.yahoo.com/LocalSearchService/V3/localSearch?appid=#{Ym4r::YahooMaps::APP_ID}&" url << "query=#{param[:query]}&" if param.has_key?(:query) url << "listing_id=#{param[:query]}&" if param.has_key?(:listing_id) url << "results=#{param[:results]}&" if param.has_key?(:results) url << "start=#{param[:start]}&" if param.has_key?(:start) url << "sort=#{param[:sort]}&" if param.has_key?(:sort) url << "radius=#{param[:radius]}&" if param.has_key?(:radius) url << "street=#{param[:street]}&" if param.has_key?(:street) url << "city=#{param[:city]}&" if param.has_key?(:city) url << "state=#{param[:state]}&" if param.has_key?(:state) url << "zip=#{param[:zip]}&" if param.has_key?(:zip) url << "location=#{param[:location]}&" if param.has_key?(:location) url << "latitude=#{param[:latitude]}&" if param.has_key?(:latitude) url << "longitude=#{param[:longitude]}&" if param.has_key?(:longitude) url << "category=#{param[:category]}&" if param.has_key?(:category) url << "omit_category=#{param[:omit_category]}&" if param.has_key?(:omit_category) url << "minimum_rating=#{param[:minimum_rating]}&" if param.has_key?(:minimum_rating) url << "output=xml" begin xml = open(URI.encode(url)).read rescue OpenURI::HTTPError => error raise BadRequestException.new(error.to_s) rescue raise ConnectionException.new("Unable to connect to Yahoo! Maps REST service") end doc = REXML::Document.new(xml) if doc.root.name == "Error" raise RateLimitExceededException.new("Rate limit exceeded for Yahoo! Maps Geocoding service") else doc_root = doc.root result_set = LocalSearch::ResultSet.new(doc_root.elements['ResultSetMapUrl'].text, doc_root.attributes['totalResultsAvailable'].to_i, doc_root.attributes['totalResultsReturned'].to_i, doc_root.attributes['firstResultPosition'].to_i) doc.elements.each("//Result") do |result| data = result.elements rating_data = data['Rating'].elements if rating_data['AverageRating'].text != "NaN" rating = LocalSearch::Rating.new(rating_data['AverageRating'].text.to_f, #when NaN, converted to 0 but can be tested (since TotalRating is 0 in this case) with is_rated? on the rating object rating_data['TotalRatings'].text.to_i, rating_data['TotalReviews'].text.to_i, Time.at(rating_data['LastReviewDate'].text.to_i), rating_data['LastReviewIntro'].text) else rating = LocalSearch::Rating.new(0,0,0,Time.at(0),"") end categories = [] data.each('//Category') do |category| categories << LocalSearch::Category.new(category.attributes['id'].to_i, category.text) end result_set << LocalSearch::Result.new(result.attributes['id'].to_i, data['Title'].text || "", data['Address'].text || "", data['City'].text || "", data['State'].text || "", data['Phone'].text || "", data['Latitude'].text.to_f, data['Longitude'].text.to_f, rating, data['Distance'].text.to_f, data['Url'].text || "", data['ClickUrl'].text || "", data['MapUrl'].text || "", data['BusinessUrl'].text || "", data['BusinessClickUrl'].text || "", categories) end result_set end end