Avoid more models in old migrations
[rails.git] / db / migrate / 006_tile_nodes.rb
1 require "migrate"
2
3 class TileNodes < ActiveRecord::Migration[4.2]
4   class Node < ActiveRecord::Base
5     self.table_name = "current_nodes"
6   end
7
8   class OldNode < ActiveRecord::Base
9     self.table_name = "nodes"
10   end
11
12   def self.upgrade_table(from_table, to_table, model)
13     if ENV["USE_DB_FUNCTIONS"]
14       execute <<-SQL
15       INSERT INTO #{to_table} (id, latitude, longitude, user_id, visible, tags, timestamp, tile)
16       SELECT id, ROUND(latitude * 10000000), ROUND(longitude * 10000000),
17              user_id, visible, tags, timestamp,
18              tile_for_point(CAST(ROUND(latitude * 10000000) AS INTEGER),
19                             CAST(ROUND(longitude * 10000000) AS INTEGER))
20       FROM #{from_table}
21       SQL
22     else
23       execute <<-SQL
24       INSERT INTO #{to_table} (id, latitude, longitude, user_id, visible, tags, timestamp, tile)
25       SELECT id, ROUND(latitude * 10000000), ROUND(longitude * 10000000),
26              user_id, visible, tags, timestamp, 0
27       FROM #{from_table}
28       SQL
29
30       model.all.each(&:save!)
31     end
32   end
33
34   def self.downgrade_table(from_table, to_table)
35     execute <<-SQL
36     INSERT INTO #{to_table} (id, latitude, longitude, user_id, visible, tags, timestamp)
37     SELECT id, latitude / 10000000, longitude / 10000000,
38            user_id, visible, tags, timestamp
39     FROM #{from_table}
40     SQL
41   end
42
43   def self.up
44     remove_index "current_nodes", :name => "current_nodes_timestamp_idx"
45
46     rename_table "current_nodes", "current_nodes_v5"
47
48     create_table "current_nodes", :id => false do |t|
49       t.column "id",        :bigserial, :primary_key => true, :null => false
50       t.column "latitude",  :integer, :null => false
51       t.column "longitude", :integer, :null => false
52       t.column "user_id",   :bigint, :null => false
53       t.column "visible",   :boolean, :null => false
54       t.column "tags",      :text, :default => "", :null => false
55       t.column "timestamp", :datetime, :null => false
56       t.column "tile",      :integer, :null => false
57     end
58
59     add_index "current_nodes", ["timestamp"], :name => "current_nodes_timestamp_idx"
60     add_index "current_nodes", ["tile"], :name => "current_nodes_tile_idx"
61
62     change_column "current_nodes", "tile", :bigint
63
64     upgrade_table "current_nodes_v5", "current_nodes", Node
65
66     drop_table "current_nodes_v5"
67
68     remove_index "nodes", :name => "nodes_uid_idx"
69     remove_index "nodes", :name => "nodes_timestamp_idx"
70     rename_table "nodes", "nodes_v5"
71
72     create_table "nodes", :id => false do |t|
73       t.column "id",        :bigint, :null => false
74       t.column "latitude",  :integer, :null => false
75       t.column "longitude", :integer, :null => false
76       t.column "user_id",   :bigint, :null => false
77       t.column "visible",   :boolean, :null => false
78       t.column "tags",      :text, :default => "", :null => false
79       t.column "timestamp", :datetime, :null => false
80       t.column "tile",      :integer, :null => false
81     end
82
83     add_index "nodes", ["id"], :name => "nodes_uid_idx"
84     add_index "nodes", ["timestamp"], :name => "nodes_timestamp_idx"
85     add_index "nodes", ["tile"], :name => "nodes_tile_idx"
86
87     change_column "nodes", "tile", :bigint
88
89     upgrade_table "nodes_v5", "nodes", OldNode
90
91     drop_table "nodes_v5"
92   end
93
94   def self.down
95     rename_table "current_nodes", "current_nodes_v6"
96
97     create_table "current_nodes", :id => false do |t|
98       t.column "id",        :bigserial, :primary_key => true, :null => false
99       t.column "latitude",  :float, :limit => 53, :null => false
100       t.column "longitude", :float, :limit => 53, :null => false
101       t.column "user_id",   :bigint, :null => false
102       t.column "visible",   :boolean, :null => false
103       t.column "tags",      :text, :default => "", :null => false
104       t.column "timestamp", :datetime, :null => false
105     end
106
107     add_index "current_nodes", %w[latitude longitude], :name => "current_nodes_lat_lon_idx"
108     add_index "current_nodes", ["timestamp"], :name => "current_nodes_timestamp_idx"
109
110     downgrade_table "current_nodes_v6", "current_nodes"
111
112     drop_table "current_nodes_v6"
113
114     rename_table "nodes", "nodes_v6"
115
116     create_table "nodes", :id => false do |t|
117       t.column "id",        :bigint, :null => false
118       t.column "latitude",  :float, :limit => 53, :null => false
119       t.column "longitude", :float, :limit => 53, :null => false
120       t.column "user_id",   :bigint, :null => false
121       t.column "visible",   :boolean, :null => false
122       t.column "tags",      :text, :default => "", :null => false
123       t.column "timestamp", :datetime, :null => false
124     end
125
126     add_index "nodes", ["id"], :name => "nodes_uid_idx"
127     add_index "nodes", %w[latitude longitude], :name => "nodes_latlon_idx"
128     add_index "nodes", ["timestamp"], :name => "nodes_timestamp_idx"
129
130     downgrade_table "nodes_v6", "nodes"
131
132     drop_table "nodes_v6"
133   end
134 end