- list_of_way_nodes = Array.new
- end
-
- # - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this
- nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
-
- if nodes_to_fetch.length > 0
- @nodes += Node.find(nodes_to_fetch)
- end
-
- visible_nodes = {}
- changeset_cache = {}
- user_display_name_cache = {}
-
- @nodes.each do |node|
- if node.visible?
- doc.root << node.to_xml_node(changeset_cache, user_display_name_cache)
- visible_nodes[node.id] = node
- end
- end
-
- way_ids = Array.new
- ways.each do |way|
- if way.visible?
- doc.root << way.to_xml_node(visible_nodes, changeset_cache, user_display_name_cache)
- way_ids << way.id
- end
- end
-
- relations = Relation.find_for_nodes(visible_nodes.keys, :conditions => {:visible => true}) +
- Relation.find_for_ways(way_ids, :conditions => {:visible => true})
-
- # we do not normally return the "other" partners referenced by an relation,
- # e.g. if we return a way A that is referenced by relation X, and there's
- # another way B also referenced, that is not returned. But we do make
- # an exception for cases where an relation references another *relation*;
- # in that case we return that as well (but we don't go recursive here)
- relations += Relation.find_for_relations(relations.collect { |r| r.id }, :conditions => {:visible => true})
-
- # this "uniq" may be slightly inefficient; it may be better to first collect and output
- # all node-related relations, then find the *not yet covered* way-related ones etc.
- relations.uniq.each do |relation|
- doc.root << relation.to_xml_node(changeset_cache, user_display_name_cache)