]> git.openstreetmap.org Git - rails.git/blobdiff - db/migrate/024_order_relation_members.rb
Merge 12304:14009 from trunk.
[rails.git] / db / migrate / 024_order_relation_members.rb
diff --git a/db/migrate/024_order_relation_members.rb b/db/migrate/024_order_relation_members.rb
new file mode 100644 (file)
index 0000000..5500edf
--- /dev/null
@@ -0,0 +1,33 @@
+class OrderRelationMembers < ActiveRecord::Migration
+  def self.up
+    # add sequence column. rails won't let us define an ordering here,
+    # as defaults must be constant.
+    add_column(:relation_members, :sequence_id, :integer,
+               :default => 0, :null => false)
+
+    # update the sequence column with default (partial) ordering by 
+    # element ID. the sequence ID is a smaller int type, so we can't
+    # just copy the member_id.
+    execute("update relation_members set sequence_id = mod(member_id, 16384)")
+
+    # need to update the primary key to include the sequence number, 
+    # otherwise the primary key will barf when we have repeated members.
+    # mysql barfs on this anyway, so we need a single command. this may
+    # not work in postgres... needs testing.
+    alter_primary_key("relation_members", [:id, :version, :member_type, :member_id, :member_role, :sequence_id])
+
+    # do the same for the current tables
+    add_column(:current_relation_members, :sequence_id, :integer,
+               :default => 0, :null => false)
+    execute("update current_relation_members set sequence_id = mod(member_id, 16384)")
+    alter_primary_key("current_relation_members", [:id, :member_type, :member_id, :member_role, :sequence_id])
+  end
+
+  def self.down
+    alter_primary_key("current_relation_members", [:id, :member_type, :member_id, :member_role])
+    remove_column :relation_members, :sequence_id
+
+    alter_primary_key("relation_members", [:id, :version, :member_type, :member_id, :member_role])
+    remove_column :current_relation_members, :sequence_id
+  end
+end