Don't limit get map_bugs to a small Area, by disabling the quadtile index for those searches
The volumn of bugs seem small enough to get away with normal or GiST indexes (not included yet) Also includes some other fixes
This commit is contained in:
parent
03f733c4f4
commit
59a6ed0e20
5 changed files with 47 additions and 27 deletions
|
@ -36,18 +36,9 @@ class MapBugsController < ApplicationController
|
|||
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"}
|
||||
|
@ -71,10 +62,13 @@ class MapBugsController < ApplicationController
|
|||
name = "NoName";
|
||||
name = params['name'] if params['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)))
|
||||
|
||||
|
@ -83,9 +77,13 @@ class MapBugsController < ApplicationController
|
|||
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
|
||||
|
@ -162,7 +160,7 @@ class MapBugsController < ApplicationController
|
|||
|
||||
#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|
|
||||
|
|
|
@ -53,6 +53,11 @@ private
|
|||
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
|
||||
|
|
|
@ -9,7 +9,7 @@ module MapBoundary
|
|||
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")
|
||||
|
@ -22,6 +22,8 @@ module MapBoundary
|
|||
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']
|
||||
|
|
10
lib/osm.rb
10
lib/osm.rb
|
@ -498,5 +498,15 @@ module OSM
|
|||
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
|
||||
|
|
|
@ -54,6 +54,11 @@ class MapBugsControllerTest < ActionController::TestCase
|
|||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue