+# == Schema Information
+#
+# Table name: changesets
+#
+# id :integer not null, primary key
+# user_id :integer not null
+# created_at :datetime not null
+# min_lat :integer
+# max_lat :integer
+# min_lon :integer
+# max_lon :integer
+# closed_at :datetime not null
+# num_changes :integer default(0), not null
+#
+# Indexes
+#
+# changesets_bbox_idx (min_lat,max_lat,min_lon,max_lon)
+# changesets_closed_at_idx (closed_at)
+# changesets_created_at_idx (created_at)
+# changesets_user_id_created_at_idx (user_id,created_at)
+# changesets_user_id_id_idx (user_id,id)
+#
+# Foreign Keys
+#
+# changesets_user_id_fkey (user_id => users.id)
+#
+
class Changeset < ActiveRecord::Base
require "xml/libxml"
before_save :update_closed_at
- # over-expansion factor to use when updating the bounding box
- EXPAND = 0.1
-
# maximum number of elements allowed in a changeset
MAX_ELEMENTS = 10000
pt.find("tag").each do |tag|
raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing key") if tag["k"].nil?
raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing value") if tag["v"].nil?
+
cs.add_tag_keyval(tag["k"], tag["v"])
end
end
##
- # expand the bounding box to include the given bounding box. also,
- # expand a little bit more in the direction of the expansion, so that
- # further expansions may be unnecessary. this is an optimisation
- # suggested on the wiki page by kleptog.
+ # expand the bounding box to include the given bounding box.
def update_bbox!(bbox_update)
- bbox.expand!(bbox_update, EXPAND)
+ bbox.expand!(bbox_update)
# update active record. rails 2.1's dirty handling should take care of
# whether this object needs saving or not.
##
# the number of elements is also passed in so that we can ensure that
- # a single changeset doesn't contain too many elements. this, of course,
- # destroys the optimisation described in the bbox method above.
+ # a single changeset doesn't contain too many elements.
def add_changes!(elements)
self.num_changes += elements
end
attr_writer :tags
def add_tag_keyval(k, v)
- @tags = {} unless @tags
+ @tags ||= {}
# duplicate tags are now forbidden, so we can't allow values
# in the hash to be overwritten.
bbox.to_unscaled.add_bounds_to(el1, "_") if bbox.complete?
- el1["comments_count"] = comments.count.to_s
+ el1["comments_count"] = comments.length.to_s
+ el1["changes_count"] = num_changes.to_s
if include_discussion
el2 = XML::Node.new("discussion")
# bounding box, only the tags of the changeset.
def update_from(other, user)
# ensure that only the user who opened the changeset may modify it.
- raise OSM::APIUserChangesetMismatchError.new unless user.id == user_id
+ raise OSM::APIUserChangesetMismatchError unless user.id == user_id
# can't change a closed changeset
- raise OSM::APIChangesetAlreadyClosedError.new(self) unless is_open?
+ raise OSM::APIChangesetAlreadyClosedError, self unless is_open?
# copy the other's tags
self.tags = other.tags