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:
Kai Krueger 2010-03-20 11:59:23 +00:00
parent 03f733c4f4
commit 59a6ed0e20
5 changed files with 47 additions and 27 deletions

View file

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

View file

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

View file

@ -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']

View file

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

View file

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