Module: Ym4r::YahooMaps::BuildingBlock::LocalSearch
- Defined in:
- lib/ym4r/yahoo_maps/building_block/local_search.rb
Defined Under Namespace
Classes: Category, Rating, Result, ResultSet
Class Method Summary collapse
-
.get(param) ⇒ Object
Send a request to the local search REST API V3.
Class Method Details
.get(param) ⇒ Object
Send a request to the local search REST API V3.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# 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 = data['Rating'].elements if ['AverageRating'].text != "NaN" = LocalSearch::Rating.new(['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 ['TotalRatings'].text.to_i, ['TotalReviews'].text.to_i, Time.at(['LastReviewDate'].text.to_i), ['LastReviewIntro'].text) else = 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, , 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 |