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

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
      
      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