From: Matt Amos Date: Mon, 11 May 2009 14:34:04 +0000 (+0000) Subject: Added optimisation for way checking. Same method as for relations. X-Git-Tag: live~8012 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/9481a79e7195608ba820f00c3b4425788dbeba39 Added optimisation for way checking. Same method as for relations. --- diff --git a/app/models/way.rb b/app/models/way.rb index 92d8f735a..b1057f673 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -210,7 +210,7 @@ class Way < ActiveRecord::Base def update_from(new_way, user) check_consistency(self, new_way, user) - unless new_way.preconditions_ok? + unless new_way.preconditions_ok?(self.nds) raise OSM::APIPreconditionFailedError.new("Cannot update way #{self.id}: data is invalid.") end @@ -232,15 +232,22 @@ class Way < ActiveRecord::Base save_with_history! end - def preconditions_ok? + def preconditions_ok?(old_nodes = []) return false if self.nds.empty? if self.nds.length > APP_CONFIG['max_number_of_way_nodes'] raise OSM::APITooManyWayNodesError.new(self.nds.length, APP_CONFIG['max_number_of_way_nodes']) end + + # pre-set all the old nodes to OK, as we must have checked them before. + checked = old_nodes.inject(Hash.new) {|h,n| h[n] = true; h } + self.nds.each do |n| - node = Node.find(:first, :conditions => ["id = ?", n]) - unless node and node.visible - raise OSM::APIPreconditionFailedError.new("Way #{self.id} requires the node with id #{n}, which either does not exist, or is not visible.") + unless checked.key? n + node = Node.find(:first, :conditions => ["id = ?", n]) + unless node and node.visible + raise OSM::APIPreconditionFailedError.new("Way #{self.id} requires the node with id #{n}, which either does not exist, or is not visible.") + end + checked[n] = true end end return true