The volumn of bugs seem small enough to get away with normal or GiST indexes (not included yet)
Also includes some other fixes
limit = getLimit
conditions = closedCondition
- # check boundary is sane and area within defined
- # see /config/application.yml
- begin
- check_boundaries(min_lon, min_lat, max_lon, max_lat)
- rescue Exception => err
- report_error(err.message)
- return
- end
-
+ check_boundaries(min_lon, min_lat, max_lon, max_lat, :false)
-
- @bugs = MapBug.find_by_area(min_lat, min_lon, max_lat, max_lon, :order => "last_changed DESC", :limit => limit, :conditions => conditions)
+ @bugs = MapBug.find_by_area_no_quadtile(min_lat, min_lon, max_lat, max_lon, :include => :map_bug_comment, :order => "last_changed DESC", :limit => limit, :conditions => conditions)
respond_to do |format|
format.html {render :template => 'map_bugs/get_bugs.js', :content_type => "text/javascript"}
name = "NoName";
name = params['name'] if params['name'];
- @bug = MapBug.create_bug(lat, lon)
-
-
- #TODO: move this into a helper function
- url = "http://nominatim.openstreetmap.org/reverse?lat=" + lat.to_s + "&lon=" + lon.to_s + "&zoom=16"
- response = REXML::Document.new(Net::HTTP.get(URI.parse(url)))
-
- if result = response.get_text("reversegeocode/result")
- @bug.nearby_place = result.to_s
- else
- @bug.nearby_place = "unknown"
- end
-
- @bug.save;
- add_comment(@bug, comment, name);
+ #Include in a transaction to ensure that there is always a map_bug_comment for every map_bug
+ MapBug.transaction do
+ @bug = MapBug.create_bug(lat, lon)
+
+
+ #TODO: move this into a helper function
+ begin
+ url = "http://nominatim.openstreetmap.org/reverse?lat=" + lat.to_s + "&lon=" + lon.to_s + "&zoom=16"
+ response = REXML::Document.new(Net::HTTP.get(URI.parse(url)))
+
+ if result = response.get_text("reversegeocode/result")
+ @bug.nearby_place = result.to_s
+ else
+ @bug.nearby_place = "unknown"
+ end
+ rescue Exception => err
+ @bug.nearby_place = "unknown"
+ end
+
+ @bug.save;
+ add_comment(@bug, comment, name);
+ end
render_ok
end
#TODO: There should be a better way to do this. CloseConditions are ignored at the moment
- bugs2 = MapBug.find(:all, :limit => limit, :order => "last_changed DESC", :joins => :map_bug_comment,
+ bugs2 = MapBug.find(:all, :limit => limit, :order => "last_changed DESC", :joins => :map_bug_comment, :include => :map_bug_comment,
:conditions => conditions)
@bugs = bugs2.uniq
respond_to do |format|
self.with_scope(:find => {:conditions => OSM.sql_for_area(minlat, minlon, maxlat, maxlon)}) do
return self.find(:all, options)
end
+ end
+ def find_by_area_no_quadtile(minlat, minlon, maxlat, maxlon, options)
+ self.with_scope(:find => {:conditions => OSM.sql_for_area_no_quadtile(minlat, minlon, maxlat, maxlon)}) do
+ return self.find(:all, options)
+ end
end
end
end
return min_lon, min_lat, max_lon, max_lat
end
- def check_boundaries(min_lon, min_lat, max_lon, max_lat)
+ def check_boundaries(min_lon, min_lat, max_lon, max_lat, limit_small_area = :true)
# check the bbox is sane
unless min_lon <= max_lon
raise OSM::APIBadBoundingBox.new("The minimum longitude must be less than the maximum longitude, but it wasn't")
raise OSM::APIBadBoundingBox.new("The latitudes must be between -90 and 90, and longitudes between -180 and 180")
end
+ return unless limit_small_area == :true
+
# check the bbox isn't too large
requested_area = (max_lat-min_lat)*(max_lon-min_lon)
if requested_area > APP_CONFIG['max_request_area']
# Return an SQL fragment to select a given area of the globe
def self.sql_for_area(minlat, minlon, maxlat, maxlon, prefix = nil)
- tilesql = QuadTile.sql_for_area(minlat, minlon, maxlat, maxlon, prefix)
+ tilesql = QuadTile.sql_for_area(minlat, minlon, maxlat, maxlon, prefix)
minlat = (minlat * 10000000).round
minlon = (minlon * 10000000).round
maxlat = (maxlat * 10000000).round
return "#{tilesql} AND #{prefix}latitude BETWEEN #{minlat} AND #{maxlat} AND #{prefix}longitude BETWEEN #{minlon} AND #{maxlon}"
end
+ # Return an SQL fragment to select a given area of the globe without using the quadtile index
+ def self.sql_for_area_no_quadtile(minlat, minlon, maxlat, maxlon, prefix = nil, without_quadtile = :false)
+ minlat = (minlat * 10000000).round
+ minlon = (minlon * 10000000).round
+ maxlat = (maxlat * 10000000).round
+ maxlon = (maxlon * 10000000).round
+
+ return "#{prefix}latitude BETWEEN #{minlat} AND #{maxlat} AND #{prefix}longitude BETWEEN #{minlon} AND #{maxlon}"
+ end
+
end
assert_response :success
end
+ def test_get_bugs_large_area_success
+ get :get_bugs, {:bbox=>'-10,-10,12,12'}
+ assert_response :success
+ end
+
def test_get_bugs_closed_7_success
get :get_bugs, {:bbox=>'1,1,1.2,1.2', :closed => '7'}
assert_response :success