rigrate 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,262 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class ParserTest < TestHelper
4
+ def setup
5
+ @parser = Parser.new
6
+
7
+ # define two real sqlite db in disk
8
+ @hr = SQLite3::Database.new(File.join(Dir.tmpdir, 'hr.sqlite3'))
9
+ @oa = SQLite3::Database.new(File.join(Dir.tmpdir, 'oa.sqlite3'))
10
+
11
+ # fuck slowing .....
12
+ @hr.execute("create table users(id integer, name varchar, age integer, flag varchar);")
13
+ 5.times do |i|
14
+ @hr.execute("insert into users values(#{i}, 'hrname#{i}', #{20 + i}, 'hr')")
15
+ end
16
+
17
+ @oa.execute("create table users(idx integer, name varchar, age integer, flag varchar);")
18
+ 10.times do |i|
19
+ @oa.execute("insert into users values(#{i}, 'oaname#{i}', #{40 + i}, 'oa')")
20
+ end
21
+ end
22
+
23
+ def test_lex
24
+ @parser.lex("from oa.user to hr.account")
25
+
26
+ assert_equal 4, @parser.tokens.size
27
+ assert_equal 4, @parser.tokens.size
28
+ end
29
+
30
+ def test_lex2
31
+ @parser.lex("FroM oa.sql('select * from user')\
32
+ to hr.account on :jc=>:job_code")
33
+ assert_equal 6, @parser.tokens.size
34
+ end
35
+
36
+ def test_lext4
37
+ @parser.lex("FroM oa.sql('select * from user')\
38
+ to hr.account on :jc=>:job_code using :echo")
39
+ assert_equal 8, @parser.tokens.size
40
+ assert_equal :USING_TAG, @parser.tokens[-2].type
41
+ end
42
+
43
+ def test_lex3
44
+ str =<<EOF
45
+ # comment test
46
+ # comment 2222
47
+ from
48
+ oa.user(:id)
49
+ join
50
+ hr.account(:job_code)
51
+ union
52
+ hr2.account(:test)
53
+ to
54
+ oa_test.user(:id)
55
+ on :job_code=>:jc
56
+ using :sync
57
+ EOF
58
+ @parser.lex(str)
59
+ assert_equal 13, @parser.tokens.size
60
+ end
61
+
62
+ def test_parser_full_migration
63
+ str =<<SCRIPT
64
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
65
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
66
+
67
+ from oa.users to hr.users
68
+ SCRIPT
69
+
70
+ # migration
71
+ parser = Parser.new
72
+ parser.lex(str)
73
+ parser.parsing
74
+
75
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
76
+ rs = db.dbh.select("select * from users")
77
+ assert_equal 10, rs.size
78
+ assert_equal 'oa', rs.rows.first[3]
79
+ end
80
+
81
+ def test_parser_full_table_migration_with_columns
82
+ str =<<SCRIPT
83
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
84
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
85
+
86
+ from
87
+ oa.sql('select * from users')
88
+ to
89
+ hr.users(:id, :name, :age, :flag)
90
+ SCRIPT
91
+
92
+ # migration
93
+ parser = Parser.new
94
+ parser.lex(str)
95
+ parser.parsing
96
+
97
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
98
+ rs = db.dbh.select("select * from users")
99
+ assert_equal 10, rs.size
100
+ assert_equal 'oa', rs.rows.first[3]
101
+ end
102
+
103
+ def test_parser_migration_with_single_condition
104
+ str =<<SCRIPT
105
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
106
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
107
+
108
+ from
109
+ oa.sql('select idx,name,flag from users where idx in (1,2)')
110
+ to
111
+ hr.users(:id, :name, :flag)
112
+ on :idx=>:id
113
+ SCRIPT
114
+
115
+ # migration
116
+ parser = Parser.new
117
+ parser.lex(str)
118
+ parser.parsing
119
+
120
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
121
+ rs = db.dbh.select("select * from users")
122
+ # TODO need rework
123
+ assert rs
124
+ end
125
+
126
+ def test_parser_join_result
127
+ str =<<SCRIPT
128
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
129
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
130
+ ds :oa_alias, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
131
+
132
+ from
133
+ oa.sql('select idx,name from users where idx=1 or idx = 2')
134
+ join
135
+ oa_alias.sql('select idx,flag from users where idx=1 or idx=2')
136
+ on :idx => :idx
137
+ to
138
+ hr.users(:id, :name, :flag)
139
+ SCRIPT
140
+
141
+ # migration
142
+ parser = Parser.new
143
+ parser.lex(str)
144
+ parser.parsing
145
+
146
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
147
+ rs = db.dbh.select("select * from users")
148
+ assert_equal 2, rs.size
149
+ assert_equal 'oa', rs.rows.first[3]
150
+ end
151
+
152
+ def test_parser_union_parted_fields
153
+ str =<<SCRIPT
154
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
155
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
156
+ ds :oa_alias, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
157
+
158
+ from
159
+ oa.sql('select idx,name,flag from users where idx=1 or idx = 2')
160
+ union
161
+ oa_alias.sql('select idx,name,flag from users where idx=2 or idx=3')
162
+ to
163
+ hr.users(:id, :name, :flag)
164
+ SCRIPT
165
+
166
+ # migration
167
+ parser = Parser.new
168
+ parser.lex(str)
169
+ parser.parsing
170
+
171
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
172
+ rs = db.dbh.select("select * from users")
173
+ assert_equal 4, rs.size
174
+ assert_equal 'oa', rs.rows.first[3]
175
+ end
176
+
177
+ def test_parser_minus_parted_fields
178
+ str =<<SCRIPT
179
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
180
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
181
+ ds :oa_alias, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
182
+
183
+ from
184
+ oa.sql('select idx,name,flag from users where idx=1 or idx = 2')
185
+ minus
186
+ oa_alias.sql('select idx,name,flag from users where idx=2 or idx=3')
187
+ to
188
+ hr.users(:id, :name, :flag)
189
+ SCRIPT
190
+
191
+ # migration
192
+ parser = Parser.new
193
+ parser.lex(str)
194
+ parser.parsing
195
+
196
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
197
+ rs = db.dbh.select("select * from users")
198
+ assert_equal 1, rs.size
199
+ assert_equal 'oa', rs.rows.first[3]
200
+ end
201
+
202
+ def test_echo_and_mode
203
+ str_echo =<<SCRIPT
204
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
205
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
206
+
207
+ from oa.users to hr.users using :echo
208
+ SCRIPT
209
+
210
+ # migration
211
+ parser = Parser.new
212
+ parser.lex(str_echo).parsing
213
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
214
+ assert_equal 10, db.dbh.select("select * from users").size
215
+ end
216
+
217
+ def test_contribute_and_mode
218
+ str_echo =<<SCRIPT
219
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
220
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
221
+
222
+ from oa.users to hr.users using :contribute
223
+ SCRIPT
224
+
225
+ # migration
226
+ parser = Parser.new
227
+ parser.lex(str_echo).parsing
228
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
229
+ assert_equal 15, db.dbh.select("select * from users").size
230
+ end
231
+
232
+ def test_multi_migration_task
233
+ str =<<SCRIPT
234
+ ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
235
+ ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
236
+
237
+ from oa.users to hr.users
238
+ from hr.users to oa.users
239
+ SCRIPT
240
+
241
+ # migration
242
+ parser = Parser.new
243
+ parser.lex(str)
244
+ parser.parsing
245
+
246
+ db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}")
247
+ rs = db.dbh.select("select * from users")
248
+ rs2 = db.dbh.select('select * from users')
249
+ assert_equal 10, rs.size
250
+ assert_equal 10, rs2.size
251
+ assert_equal 'oa', rs.rows.first[3]
252
+ end
253
+
254
+ def teardown
255
+ @hr.execute('drop table users')
256
+ @hr.close
257
+ @oa.execute('drop table users')
258
+ @oa.close
259
+ # FileUtils.rm File.join(Dir.tmpdir, 'oa.sqlite3')
260
+ # FileUtils.rm File.join(Dir.tmpdir, 'hr.sqlite3')
261
+ end
262
+ end
@@ -0,0 +1,300 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class ResultSetTest < TestHelper
4
+ def setup
5
+ @tbl_name = 'users'
6
+
7
+ @db = Sqlite.new
8
+ setup_sql =<<SQL
9
+ create table users (
10
+ id integer primary key not null,
11
+ name varchar,
12
+ age integer,
13
+ birthday datetime default current_date
14
+ );
15
+
16
+ insert into users(id, name, age) values(1, 'jyp1', 23);
17
+ insert into users(id, name, age) values(2, 'jyp2', 24);
18
+ insert into users(id, name, age) values(3, 'jyp3', 25);
19
+ insert into users(id, name, age) values(4, 'jyp4', 26);
20
+
21
+ insert into users(id, name, age) values(5, 'jyp5', 23);
22
+ insert into users(id, name, age) values(6, 'jyp6', 24);
23
+ insert into users(id, name, age) values(7, 'jyp7', 25);
24
+ insert into users(id, name, age) values(8, 'jyp8', 26);
25
+ SQL
26
+
27
+ # setup data
28
+ @db.execute_batch(setup_sql)
29
+ @rs = @db.select("select * from users where id < 5")
30
+ @rs2 = @db.select("select * from users where id > 4")
31
+ end
32
+
33
+ def test_rs_attribute_db
34
+ assert_instance_of Sqlite, @rs.db
35
+ end
36
+
37
+ def test_rs_attribute_target_tbl_name
38
+ assert_equal 'users', @rs.target_tbl_name
39
+ end
40
+
41
+ def test_rs_attribute_rows
42
+ assert_operator 0, :<, @rs.rows.size
43
+ end
44
+
45
+ def test_rs_attribute_rows_item_type
46
+ assert_instance_of Array, @rs.rows.first.data
47
+ end
48
+
49
+ def test_fill_with_nil
50
+ rows = [[1, 2], [2, 3]]
51
+ assert_equal [[1, 2, nil], [2, 3, nil]], @rs.send(:fill_with_nil, rows, 1)
52
+ end
53
+
54
+ def test_get_columns_idx
55
+ assert_equal [1, 2], @rs.send(:column_idx, :name, :age)
56
+ end
57
+
58
+ def test_get_columns_idx2
59
+ assert_equal [], @rs.send(:column_idx, :testtesttest)
60
+ end
61
+
62
+ def test_union_two_result
63
+ assert_equal 8, @rs.union(@rs2).rows.size
64
+ end
65
+
66
+ def test_union_two_result_2
67
+ rs1 = ResultSet.new.tap do |rs|
68
+ rs.column_info = [Column.new(:name1, :type1),
69
+ Column.new(:name2, :type2)]
70
+ rs.rows = [Row.new([111, 112]),
71
+ Row.new([121, 122])]
72
+ end
73
+
74
+ rs2 = ResultSet.new.tap do |rs|
75
+ rs.column_info = [Column.new(:name5, :type3),
76
+ Column.new(:name6, :type4),
77
+ Column.new(:name7, :type5)]
78
+ rs.rows = [Row.new([211, 212, 213]),
79
+ Row.new([221, 222, 223])]
80
+ end
81
+
82
+ assert_equal 4, rs1.union(rs2).rows.size
83
+ end
84
+
85
+ def test_union_two_result_3
86
+ rs1 = ResultSet.new.tap do |rs|
87
+ rs.column_info = [Column.new(:name1, :type1),
88
+ Column.new(:name2, :type2)]
89
+ rs.rows = [Row.new([111, 112]),
90
+ Row.new([121, 122])]
91
+ end
92
+
93
+ rs2 = ResultSet.new.tap do |rs|
94
+ rs.column_info = [Column.new(:name5, :type3),
95
+ Column.new(:name6, :type4),
96
+ Column.new(:name7, :type5)]
97
+ rs.rows = [Row.new([211, 212, 213]),
98
+ Row.new([221, 222, 223])]
99
+ end
100
+
101
+ assert_equal 4, rs2.union(rs1).rows.size
102
+
103
+ # all rows type are Rigrate::Row
104
+ row = rs2.rows.select { |r| ! Row === r }
105
+ assert_equal 0, row.size
106
+ end
107
+
108
+ def test_join_two_result_1
109
+ assert_raises(ResultSetError) do
110
+ @rs.join(@rs2)
111
+ end
112
+ end
113
+
114
+ def test_join_two_resulset_2
115
+ rs1 = ResultSet.new.tap do |rs|
116
+ rs.column_info = [Column.new('name1', :type1),
117
+ Column.new('name2', :type2)]
118
+ rs.rows = [Row.new([1, 112]),
119
+ Row.new([2, 122]),
120
+ Row.new([3, 122])]
121
+ end
122
+
123
+ rs2 = ResultSet.new.tap do |rs|
124
+ rs.column_info = [Column.new('name5', :type3),
125
+ Column.new('name6', :type4),
126
+ Column.new('name7', :type5)]
127
+ rs.rows = [Row.new([1, 212, 213]),
128
+ Row.new([2, 222, 223]),
129
+ Row.new([2, 332, 333])]
130
+ end
131
+
132
+ rs = rs1.join(rs2, :name1 => :name5)
133
+ # rows size is 3
134
+ assert_equal 4, rs.rows.size
135
+ # column size is 4
136
+ assert_equal 4, rs.column_info.size
137
+ # column name1 should fill with 2 nil
138
+ row = rs.rows.select {|r| r[0] == 3}.first
139
+ assert_equal 2, row.data.select {|field| field.nil?}.size
140
+ end
141
+
142
+ def test_minus_1
143
+ rs1 = ResultSet.new.tap do |rs|
144
+ rs.column_info = [Column.new('name1', :type1),
145
+ Column.new('name2', :type2)]
146
+ rs.rows = [Row.new([1, 112]),
147
+ Row.new([2, 122])]
148
+ end
149
+
150
+ rs2 = ResultSet.new.tap do |rs|
151
+ rs.column_info = [Column.new('name5', :type3),
152
+ Column.new('name6', :type4)]
153
+ rs.rows = [Row.new([1, 112])]
154
+ end
155
+
156
+ assert_equal 1, (rs1 - rs2).rows.size
157
+ end
158
+
159
+ def test_get_sql
160
+ rs = @db.select('select id,name,age from users')
161
+
162
+
163
+ # get insert
164
+ assert_equal "insert into users (id,name,age) values (?,?,?)", rs.get_sql(:insert)
165
+ # get update
166
+ assert_equal "update users set name=?,age=? where id=?", rs.get_sql(:update)
167
+ assert_equal "update users set id=?,name=? where age=?", rs.get_sql(:update, ['age'])
168
+ # get delete
169
+ assert_equal "delete from users where id=?", rs.get_sql(:delete, ['id'])
170
+ end
171
+
172
+ def test_handle_delete
173
+ rs_old = @db.select("select * from users")
174
+ rs_old.rows.first.status = RowStatus::DELETE
175
+
176
+ # delete the first row
177
+ rs_old.handle_delete!
178
+ rs_new = @db.select("select * from users")
179
+ # result set size reduce 1
180
+ assert_equal rs_old.size, (rs_new.size + 1)
181
+ end
182
+
183
+ def test_handle_update
184
+ rs = @db.select("select * from users")
185
+ # update the first row name of rs
186
+ temp = 'xxxxxxxxxxx'
187
+ rs.rows.first[1] = temp
188
+ rs.handle_update!
189
+ new_rs = @db.select('select * from users')
190
+ assert_equal new_rs.rows.first[1], temp
191
+ end
192
+
193
+ def test_handle_update2
194
+ rs = @db.select('select name,age from users')
195
+ temp = 1000
196
+ rs.rows.first[1] = temp
197
+ rs.handle_update!(['name'])
198
+ new_rs = @db.select('select name,age from users')
199
+ assert_equal new_rs.rows.first[1], temp
200
+ end
201
+
202
+ def test_handle_insert
203
+ rs = @db.select('select * from users')
204
+ old_size = rs.size
205
+ n_row = Row.new.tap do |row|
206
+ row.data = [50, 'jiyaping', 25, '1990-08-02']
207
+ row.status = RowStatus::NEW
208
+ end
209
+ rs.rows << n_row
210
+ rs.handle_insert!
211
+
212
+ new_rs = @db.select('select * from users')
213
+
214
+ assert_equal new_rs.size, (old_size + 1)
215
+ assert_equal new_rs.rows.last[1], 'jiyaping'
216
+ end
217
+
218
+ def test_handle_save
219
+ rs = @db.select('select * from users')
220
+ rs.rows.first.status = RowStatus::DELETE
221
+ old_size = rs.size
222
+ n_row = Row.new.tap do |row|
223
+ row.data = [50, 'jiyaping', 25, '1990-08-02']
224
+ row.status = RowStatus::NEW
225
+ end
226
+ rs.rows << n_row
227
+ new_rs = @db.select('select * from users')
228
+ assert_equal new_rs.size, old_size
229
+ end
230
+
231
+ def test_handle_row
232
+ rs1 = @db.select('select * from users where id = 1')
233
+ rs2 = @db.select('select * from users where id in (1,2)')
234
+ mode = :echo
235
+ rows = rs1.handle_rows(rs2.rows, mode)
236
+ assert_equal 3, rows.size
237
+ new_rows = rows.select do |r|
238
+ r.status == RowStatus::NEW
239
+ end
240
+
241
+ upd_rows = rows.select do |r|
242
+ r.status == RowStatus::UPDATED
243
+ end
244
+
245
+ del_rows = rows.select do |r|
246
+ r.status == RowStatus::DELETE
247
+ end
248
+
249
+ assert_equal 2, new_rows.size
250
+ assert_equal 0, upd_rows.size
251
+ assert_equal 1, del_rows.size
252
+ end
253
+
254
+ def test_handle_row2
255
+ rs1 = @db.select('select id,name,age from users where id = 1')
256
+ rs2 = @db.select('select id idx,name,age from users where id =2')
257
+
258
+ rows = rs1.handle_rows(rs2.rows, [0], [0])
259
+ assert_equal 1, rows.size
260
+ new_rows = rows.select do |r|
261
+ r.status == RowStatus::NEW
262
+ end
263
+
264
+ upd_rows = rows.select do |r|
265
+ r.status == RowStatus::UPDATED
266
+ end
267
+
268
+ del_rows = rows.select do |r|
269
+ r.status == RowStatus::DELETE
270
+ end
271
+
272
+ orig_rows = rows.select do |r|
273
+ r.status == RowStatus::DELETE
274
+ end
275
+
276
+ assert_equal 1, new_rows.size
277
+ assert_equal 0, upd_rows.size
278
+ assert_equal 0, del_rows.size
279
+ assert_equal 0, orig_rows.size
280
+ end
281
+
282
+ def test_migrate_from
283
+ rs1 = @db.select('select id,name,age from users')
284
+ old_size = rs1.size
285
+ rs2 = @db.select('select id idx,name,age from users')
286
+
287
+ rs2.rows.first[1] = 'xxxxxxxx'
288
+ rs2.rows << Row.new.tap do |row|
289
+ row.status = RowStatus::NEW
290
+ row.data = [10, 'jiyaping', 25]
291
+ end
292
+
293
+ rs2.rows.delete_at(3)
294
+
295
+ rs1.migrate_from(rs2,nil,{:mode=>:echo})
296
+
297
+ new_rs = @db.select('select id,name,age from users')
298
+ assert_equal old_size, (new_rs.size)
299
+ end
300
+ end