Use changeset and user caches in Changeset#download

This commit is contained in:
Tom Hughes 2013-03-24 00:28:33 +00:00
parent e6a1003509
commit b92a2de9ec
4 changed files with 81 additions and 27 deletions

View file

@ -161,6 +161,10 @@ class ChangesetController < ApplicationController
end
end
# create changeset and user caches
changeset_cache = {}
user_display_name_cache = {}
# create an osmChange document for the output
result = OSM::API.new.get_xml_doc
result.root.name = "osmChange"
@ -173,16 +177,16 @@ class ChangesetController < ApplicationController
if (elt.version == 1)
# first version, so it must be newly-created.
created = XML::Node.new "create"
created << elt.to_xml_node
created << elt.to_xml_node(changeset_cache, user_display_name_cache)
else
unless elt.visible
# if the element isn't visible then it must have been deleted
deleted = XML::Node.new "delete"
deleted << elt.to_xml_node
deleted << elt.to_xml_node(changeset_cache, user_display_name_cache)
else
# must be a modify
modified = XML::Node.new "modify"
modified << elt.to_xml_node
modified << elt.to_xml_node(changeset_cache, user_display_name_cache)
end
end
end

View file

@ -42,9 +42,37 @@ class OldNode < ActiveRecord::Base
return doc
end
def to_xml_node
def to_xml_node(changeset_cache = {}, user_display_name_cache = {})
el1 = XML::Node.new 'node'
el1['id'] = self.node_id.to_s
el1['version'] = self.version.to_s
el1['changeset'] = self.changeset_id.to_s
if self.visible?
el1['lat'] = self.lat.to_s
el1['lon'] = self.lon.to_s
end
if changeset_cache.key?(self.changeset_id)
# use the cache if available
else
changeset_cache[self.changeset_id] = self.changeset.user_id
end
user_id = changeset_cache[self.changeset_id]
if user_display_name_cache.key?(user_id)
# use the cache if available
elsif self.changeset.user.data_public?
user_display_name_cache[user_id] = self.changeset.user.display_name
else
user_display_name_cache[user_id] = nil
end
if not user_display_name_cache[user_id].nil?
el1['user'] = user_display_name_cache[user_id]
el1['uid'] = user_id.to_s
end
self.tags.each do |k,v|
el2 = XML::Node.new('tag')
@ -53,20 +81,8 @@ class OldNode < ActiveRecord::Base
el1 << el2
end
if self.visible?
el1['lat'] = self.lat.to_s
el1['lon'] = self.lon.to_s
end
el1['changeset'] = self.changeset.id.to_s
if self.changeset.user.data_public?
el1['user'] = self.changeset.user.display_name
el1['uid'] = self.changeset.user.id.to_s
end
el1['visible'] = self.visible.to_s
el1['timestamp'] = self.timestamp.xmlschema
el1['version'] = self.version.to_s
el1['redacted'] = self.redaction.id.to_s if self.redacted?

View file

@ -93,17 +93,34 @@ class OldRelation < ActiveRecord::Base
return doc
end
def to_xml_node
def to_xml_node(changeset_cache = {}, user_display_name_cache = {})
el1 = XML::Node.new 'relation'
el1['id'] = self.relation_id.to_s
el1['visible'] = self.visible.to_s
el1['timestamp'] = self.timestamp.xmlschema
if self.changeset.user.data_public?
el1['user'] = self.changeset.user.display_name
el1['uid'] = self.changeset.user.id.to_s
end
el1['version'] = self.version.to_s
el1['changeset'] = self.changeset_id.to_s
if changeset_cache.key?(self.changeset_id)
# use the cache if available
else
changeset_cache[self.changeset_id] = self.changeset.user_id
end
user_id = changeset_cache[self.changeset_id]
if user_display_name_cache.key?(user_id)
# use the cache if available
elsif self.changeset.user.data_public?
user_display_name_cache[user_id] = self.changeset.user.display_name
else
user_display_name_cache[user_id] = nil
end
if not user_display_name_cache[user_id].nil?
el1['user'] = user_display_name_cache[user_id]
el1['uid'] = user_id.to_s
end
el1['redacted'] = self.redaction.id.to_s if self.redacted?

View file

@ -92,17 +92,34 @@ class OldWay < ActiveRecord::Base
@tags = t
end
def to_xml_node
def to_xml_node(changeset_cache = {}, user_display_name_cache = {})
el1 = XML::Node.new 'way'
el1['id'] = self.way_id.to_s
el1['visible'] = self.visible.to_s
el1['timestamp'] = self.timestamp.xmlschema
if self.changeset.user.data_public?
el1['user'] = self.changeset.user.display_name
el1['uid'] = self.changeset.user.id.to_s
end
el1['version'] = self.version.to_s
el1['changeset'] = self.changeset.id.to_s
el1['changeset'] = self.changeset_id.to_s
if changeset_cache.key?(self.changeset_id)
# use the cache if available
else
changeset_cache[self.changeset_id] = self.changeset.user_id
end
user_id = changeset_cache[self.changeset_id]
if user_display_name_cache.key?(user_id)
# use the cache if available
elsif self.changeset.user.data_public?
user_display_name_cache[user_id] = self.changeset.user.display_name
else
user_display_name_cache[user_id] = nil
end
if not user_display_name_cache[user_id].nil?
el1['user'] = user_display_name_cache[user_id]
el1['uid'] = user_id.to_s
end
el1['redacted'] = self.redaction.id.to_s if self.redacted?