groonga-client-model 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/text/news.md +30 -0
- data/groonga-client-model.gemspec +1 -1
- data/lib/groonga_client_model/log_subscriber.rb +1 -3
- data/lib/groonga_client_model/migration.rb +493 -0
- data/lib/groonga_client_model/migrator.rb +240 -0
- data/lib/groonga_client_model/railtie.rb +4 -2
- data/lib/groonga_client_model/railties/groonga.rake +55 -2
- data/lib/groonga_client_model/record.rb +39 -1
- data/lib/groonga_client_model/schema.rb +8 -0
- data/lib/groonga_client_model/schema_loader.rb +4 -9
- data/lib/groonga_client_model/test/groonga_server_runner.rb +19 -3
- data/lib/groonga_client_model/version.rb +1 -1
- data/lib/rails/generators/groonga_client_model/migration/templates/create_table_migration.rb +14 -0
- data/lib/rails/generators/groonga_client_model/migration/templates/delete_config_migration.rb +9 -0
- data/lib/rails/generators/groonga_client_model/migration/templates/migration.rb +12 -0
- data/lib/rails/generators/groonga_client_model/migration/templates/set_config_migration.rb +10 -0
- data/lib/rails/generators/groonga_client_model/migration_generator.rb +125 -0
- data/lib/rails/generators/groonga_client_model/{model/model_generator.rb → model_generator.rb} +18 -4
- data/test/apps/rails4/Gemfile.lock +2 -2
- data/test/apps/rails4/db/groonga/migrate/20170303120517_create_posts.rb +8 -0
- data/test/apps/rails4/db/groonga/migrate/20170303120527_create_terms.rb +7 -0
- data/test/apps/rails4/db/groonga/migrate/20170303120536_create_ages.rb +6 -0
- data/test/apps/rails4/log/development.log +22 -0
- data/test/apps/rails4/log/test.log +1350 -0
- data/test/apps/rails4/test/generators/migration_generator_test.rb +103 -0
- data/test/apps/rails4/test/tmp/db/groonga/migrate/20170307045825_set_config_alias_column.rb +10 -0
- data/test/apps/rails5/Gemfile.lock +8 -8
- data/test/apps/rails5/db/groonga/migrate/20170301061420_create_posts.rb +8 -0
- data/test/apps/rails5/db/groonga/migrate/20170303115054_create_terms.rb +7 -0
- data/test/apps/rails5/db/groonga/migrate/20170303115135_create_ages.rb +6 -0
- data/test/apps/rails5/log/development.log +350 -0
- data/test/apps/rails5/log/test.log +3260 -0
- data/test/apps/rails5/test/generators/migration_generator_test.rb +103 -0
- data/test/apps/rails5/test/tmp/db/groonga/migrate/20170307081511_remove_title_from_posts.rb +5 -0
- data/test/apps/rails5/tmp/cache/assets/sprockets/v3.0/5C/5Cws9GLWcOju_f3tIpY01qSaj7zkLAU0a2bQmpf7sS8.cache +1 -0
- data/test/apps/rails5/tmp/cache/assets/sprockets/v3.0/XH/XH9pWZvGgK476BpPGID5z8hjzRmGJjtzV0cHBLXhIKc.cache +1 -0
- data/test/unit/fixtures/migrate/20170301061420_create_posts.rb +8 -0
- data/test/unit/fixtures/migrate/20170303115054_create_terms.rb +7 -0
- data/test/unit/fixtures/migrate/20170303115135_create_ages.rb +6 -0
- data/test/unit/migration/test_config.rb +62 -0
- data/test/unit/migration/test_copy.rb +117 -0
- data/test/unit/migration/test_create_table.rb +528 -0
- data/test/unit/migration/test_exist.rb +47 -0
- data/test/unit/migration/test_load.rb +83 -0
- data/test/unit/record/test_active_model.rb +31 -0
- data/test/unit/record/test_readers.rb +45 -0
- data/test/unit/record/test_timestamps.rb +76 -0
- data/test/unit/record/test_validators.rb +295 -0
- data/test/unit/run-test.rb +1 -2
- data/test/unit/test_helper.rb +109 -0
- data/test/unit/test_load_value_generator.rb +8 -7
- data/test/unit/test_migrator.rb +156 -0
- metadata +64 -11
- data/test/apps/rails4/db/schema.grn +0 -9
- data/test/apps/rails5/db/schema.grn +0 -11
- data/test/unit/test_record.rb +0 -345
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bb098148454489683ac35966f22fc18a32b8a3c
|
4
|
+
data.tar.gz: 9ab10bad50574e82563929857c3a5d4a3b209767
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5b863f329f13dc589514544397da3a4e10d9ff830fcb2a69bd6a686574fce6589642c2b132f436e95fbf70f84f1f24e65118bd03f2571a9a7a59ef1a232dd3b
|
7
|
+
data.tar.gz: 6840fa4300924d4e9566cb8f3958e68590ca9f2eb187bb3174e2a5977c6325cf771b6ec414a24fa82e834bcdce50c1697a05c5a1e450a464c94826aafc6db030
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,35 @@
|
|
1
1
|
# NEWS
|
2
2
|
|
3
|
+
## 1.0.1 - 2016-03-09
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Supported migration: The following tasks are available:
|
8
|
+
|
9
|
+
* `groonga:migrate`: migrates the Groonga database to the latest schema.
|
10
|
+
|
11
|
+
* `groonga:migrate:rollback`: rollbacks the last migration.
|
12
|
+
|
13
|
+
* `groonga:migrate:redo`: rollbacks the last migration and
|
14
|
+
re-applies the last migration.
|
15
|
+
|
16
|
+
* Supported auto timestamp columns (`created_at`, `created_on`,
|
17
|
+
`updated_at` and `updated_on`) update.
|
18
|
+
|
19
|
+
* {GroongaClientModel::Record#find}: Supported record object.
|
20
|
+
|
21
|
+
* Added model generator.
|
22
|
+
|
23
|
+
* Added migration generator.
|
24
|
+
|
25
|
+
* {GroongaClientModel::Record}: Supported auto predicate method
|
26
|
+
generation for `Bool` type columns.
|
27
|
+
|
28
|
+
### Fixes
|
29
|
+
|
30
|
+
* Fixed a bug that groonga-client-model is the default ORM even when
|
31
|
+
Active Record is enabled.
|
32
|
+
|
3
33
|
## 1.0.0 - 2016-02-07
|
4
34
|
|
5
35
|
### Fixes
|
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
|
|
43
43
|
spec.files += Dir.glob("doc/text/*")
|
44
44
|
spec.test_files += Dir.glob("test/**/*")
|
45
45
|
|
46
|
-
spec.add_runtime_dependency("groonga-client", ">= 0.4.
|
46
|
+
spec.add_runtime_dependency("groonga-client", ">= 0.4.2")
|
47
47
|
spec.add_runtime_dependency("groonga-command-parser")
|
48
48
|
spec.add_runtime_dependency("activemodel")
|
49
49
|
|
@@ -0,0 +1,493 @@
|
|
1
|
+
# Copyright (C) 2017 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "benchmark"
|
18
|
+
|
19
|
+
module GroongaClientModel
|
20
|
+
class MigrationError < Error
|
21
|
+
end
|
22
|
+
|
23
|
+
class IrreversibleMigrationError < MigrationError
|
24
|
+
end
|
25
|
+
|
26
|
+
class IllegalMigrationNameError < MigrationError
|
27
|
+
class << self
|
28
|
+
def validate(name)
|
29
|
+
case name
|
30
|
+
when /\A[_a-z0-9]+\z/
|
31
|
+
# OK
|
32
|
+
else
|
33
|
+
raise new(name)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :name
|
39
|
+
def initialize(name)
|
40
|
+
@name = name
|
41
|
+
message = "Illegal name for migration file: #{name}\n"
|
42
|
+
message << "\t(only lower case letters, numbers, and '_' allowed)."
|
43
|
+
super(message)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Migration
|
48
|
+
attr_accessor :output
|
49
|
+
attr_reader :client
|
50
|
+
|
51
|
+
def initialize(client)
|
52
|
+
@client = client
|
53
|
+
@output = nil
|
54
|
+
@reverting = false
|
55
|
+
@pending_actions = []
|
56
|
+
end
|
57
|
+
|
58
|
+
def up
|
59
|
+
change
|
60
|
+
end
|
61
|
+
|
62
|
+
def down
|
63
|
+
revert do
|
64
|
+
change
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def create_table(name,
|
69
|
+
type: nil,
|
70
|
+
key_type: nil,
|
71
|
+
tokenizer: nil,
|
72
|
+
default_tokenizer: nil,
|
73
|
+
normalizer: nil,
|
74
|
+
propose: nil)
|
75
|
+
if @reverting
|
76
|
+
@pending_actions << [:remove_table, name]
|
77
|
+
return
|
78
|
+
end
|
79
|
+
|
80
|
+
case propose
|
81
|
+
when :full_text_search
|
82
|
+
type ||= :patricia_trie
|
83
|
+
tokenizer ||= :bigram
|
84
|
+
normalizer ||= :auto
|
85
|
+
end
|
86
|
+
|
87
|
+
type = normalize_table_type(type || :array)
|
88
|
+
if type != "TABLE_NO_KEY" and key_type.nil?
|
89
|
+
key_type ||= "ShortText"
|
90
|
+
end
|
91
|
+
key_type = normalize_type(key_type)
|
92
|
+
if type != "TABLE_NO_KEY" and key_type == "ShortText"
|
93
|
+
tokenizer ||= default_tokenizer
|
94
|
+
tokenizer = normalize_tokenizer(tokenizer)
|
95
|
+
normalizer = normalize_normalizer(normalizer)
|
96
|
+
end
|
97
|
+
options = {type: type}
|
98
|
+
options[:key_type] = key_type if key_type
|
99
|
+
options[:tokenizer] = tokenizer if tokenizer
|
100
|
+
options[:normalizer] = normalizer if normalizer
|
101
|
+
report(__method__, [name, options]) do
|
102
|
+
@client.request(:table_create).
|
103
|
+
parameter(:name, name).
|
104
|
+
flags_parameter(:flags, [type]).
|
105
|
+
parameter(:key_type, key_type).
|
106
|
+
parameter(:default_tokenizer, tokenizer).
|
107
|
+
parameter(:normalizer, normalizer).
|
108
|
+
response
|
109
|
+
end
|
110
|
+
|
111
|
+
yield(CreateTableMigration.new(self, name)) if block_given?
|
112
|
+
end
|
113
|
+
|
114
|
+
def remove_table(name)
|
115
|
+
if @reverting
|
116
|
+
raise IrreversibleMigrationError, "can't revert remove_table(#{name})"
|
117
|
+
end
|
118
|
+
|
119
|
+
report(__method__, [name]) do
|
120
|
+
@client.request(:table_remove).
|
121
|
+
parameter(:name, name).
|
122
|
+
response
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def copy_table(from_table_name, to_table_name)
|
127
|
+
if @reverting
|
128
|
+
message = "can't revert copy_table(#{from_table_name}, #{to_table_name})"
|
129
|
+
raise IrreversibleMigrationError, message
|
130
|
+
end
|
131
|
+
|
132
|
+
report(__method__, [from_table_name, to_table_name]) do
|
133
|
+
@client.request(:table_copy).
|
134
|
+
parameter(:from_name, from_table_name).
|
135
|
+
parameter(:to_name, to_table_name).
|
136
|
+
response
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def add_column(table_name, column_name, value_type,
|
141
|
+
flags: nil,
|
142
|
+
type: nil,
|
143
|
+
sources: nil,
|
144
|
+
source: nil)
|
145
|
+
if @reverting
|
146
|
+
@pending_actions << [:remove_column, table_name, column_name]
|
147
|
+
return
|
148
|
+
end
|
149
|
+
|
150
|
+
value_type = normalize_type(value_type)
|
151
|
+
type = normalize_column_type(type || :scalar)
|
152
|
+
sources ||= source || []
|
153
|
+
flags = Array(flags) | [type]
|
154
|
+
if type == "COLUMN_INDEX"
|
155
|
+
schema = GroongaClientModel::Schema.new
|
156
|
+
case schema.tables[table_name].tokenizer
|
157
|
+
when nil, "TokenDelimit"
|
158
|
+
# do nothing
|
159
|
+
else
|
160
|
+
flags << "WITH_POSITION"
|
161
|
+
end
|
162
|
+
if sources.size > 1
|
163
|
+
flags << "WITH_SECTION"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
options = {
|
167
|
+
flags: flags,
|
168
|
+
value_type: value_type,
|
169
|
+
}
|
170
|
+
options[:sources] = sources unless sources.blank?
|
171
|
+
report(__method__, [table_name, column_name, options]) do
|
172
|
+
@client.request(:column_create).
|
173
|
+
parameter(:table, table_name).
|
174
|
+
parameter(:name, column_name).
|
175
|
+
flags_parameter(:flags, flags).
|
176
|
+
parameter(:type, value_type).
|
177
|
+
values_parameter(:source, sources).
|
178
|
+
response
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def remove_column(table_name, column_name)
|
183
|
+
if @reverting
|
184
|
+
message = "can't revert remove_column(#{table_name}, #{column_name})"
|
185
|
+
raise IrreversibleMigrationError, message
|
186
|
+
end
|
187
|
+
|
188
|
+
report(__method__, [table_name, column_name]) do
|
189
|
+
@client.request(:column_remove).
|
190
|
+
parameter(:table_name, table_name).
|
191
|
+
parameter(:name, column_name).
|
192
|
+
response
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def add_timestamp_columns(table_name)
|
197
|
+
add_column(table_name, :created_at, :time)
|
198
|
+
add_column(table_name, :updated_at, :time)
|
199
|
+
end
|
200
|
+
|
201
|
+
def remove_timestamp_columns(table_name)
|
202
|
+
remove_column(table_name, :updated_at)
|
203
|
+
remove_column(table_name, :created_at)
|
204
|
+
end
|
205
|
+
|
206
|
+
def copy_column(from_full_column_name,
|
207
|
+
to_full_column_name)
|
208
|
+
if @reverting
|
209
|
+
message = "can't revert copy_column"
|
210
|
+
message << "(#{from_full_column_name}, #{to_full_column_name})"
|
211
|
+
raise IrreversibleMigrationError, message
|
212
|
+
end
|
213
|
+
|
214
|
+
from_table_name, from_column_name = from_full_column_name.split(".", 2)
|
215
|
+
to_table_name, to_column_name = to_full_column_name.split(".", 2)
|
216
|
+
report(__method__, [from_full_column_name, to_full_column_name]) do
|
217
|
+
@client.request(:column_copy).
|
218
|
+
parameter(:from_table, from_table_name).
|
219
|
+
parameter(:from_name, from_column_name).
|
220
|
+
parameter(:to_table, to_table_name).
|
221
|
+
parameter(:to_name, to_column_name).
|
222
|
+
response
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def set_config(key, value)
|
227
|
+
if @reverting
|
228
|
+
message = "can't revert set_config(#{key.inspect}, #{value.inspect})"
|
229
|
+
raise IrreversibleMigrationError, message
|
230
|
+
end
|
231
|
+
|
232
|
+
report(__method__, [key, value]) do
|
233
|
+
@client.request(:config_set).
|
234
|
+
parameter(:key, key).
|
235
|
+
parameter(:value, value).
|
236
|
+
response
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def delete_config(key)
|
241
|
+
if @reverting
|
242
|
+
message = "can't revert delete_config(#{key.inspect})"
|
243
|
+
raise IrreversibleMigrationError, message
|
244
|
+
end
|
245
|
+
|
246
|
+
report(__method__, [key]) do
|
247
|
+
@client.request(:config_delete).
|
248
|
+
parameter(:key, key).
|
249
|
+
response
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def load(table_name, values, options={})
|
254
|
+
if @reverting
|
255
|
+
message = "can't revert load(#{table_name.inspect})"
|
256
|
+
raise IrreversibleMigrationError, message
|
257
|
+
end
|
258
|
+
|
259
|
+
case values
|
260
|
+
when Hash
|
261
|
+
json_values = [values].to_json
|
262
|
+
when Array
|
263
|
+
json_values = values.to_json
|
264
|
+
else
|
265
|
+
json_values = values
|
266
|
+
end
|
267
|
+
report(__method__, [table_name]) do
|
268
|
+
@client.request(:load).
|
269
|
+
parameter(:table, table_name).
|
270
|
+
values_parameter(:columns, options[:columns]).
|
271
|
+
parameter(:values, json_values).
|
272
|
+
response
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
def exist?(name)
|
277
|
+
@client.request(:object_exist).
|
278
|
+
parameter(:name, name).
|
279
|
+
response.
|
280
|
+
body
|
281
|
+
end
|
282
|
+
|
283
|
+
def reverting?
|
284
|
+
@reverting
|
285
|
+
end
|
286
|
+
|
287
|
+
private
|
288
|
+
def puts(*args)
|
289
|
+
if @output
|
290
|
+
@output.puts(*args)
|
291
|
+
else
|
292
|
+
super
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def report(method_name, arguments)
|
297
|
+
argument_list = arguments.collect(&:inspect).join(", ")
|
298
|
+
puts("-- #{method_name}(#{argument_list})")
|
299
|
+
time = Benchmark.measure do
|
300
|
+
yield
|
301
|
+
end
|
302
|
+
puts(" -> %.4fs" % time.real)
|
303
|
+
end
|
304
|
+
|
305
|
+
def revert
|
306
|
+
@pending_actions.clear
|
307
|
+
@reverting = true
|
308
|
+
begin
|
309
|
+
yield
|
310
|
+
ensure
|
311
|
+
@reverting = false
|
312
|
+
end
|
313
|
+
@pending_actions.reverse_each do |action|
|
314
|
+
public_send(*action)
|
315
|
+
end
|
316
|
+
@pending_actions.clear
|
317
|
+
end
|
318
|
+
|
319
|
+
def normalize_table_type(type)
|
320
|
+
case type.to_s
|
321
|
+
when "array", /\A(?:TABLE_)?NO_KEY\z/i
|
322
|
+
"TABLE_NO_KEY"
|
323
|
+
when "hash", "hash_table", /\A(?:TABLE_)?HASH_KEY\z/i
|
324
|
+
"TABLE_HASH_KEY"
|
325
|
+
when "pat", "patricia_trie", /\A(?:TABLE_)?PAT_KEY\z/i
|
326
|
+
"TABLE_PAT_KEY"
|
327
|
+
when "dat", "double_array_trie", /\A(?:TABLE_)?DAT_KEY\z/i
|
328
|
+
"TABLE_DAT_KEY"
|
329
|
+
else
|
330
|
+
message = "table type must be one of "
|
331
|
+
message << "[:array, :hash_table, :patricia_trie, :double_array_trie]: "
|
332
|
+
message << "#{type.inspect}"
|
333
|
+
raise ArgumentError, message
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def normalize_column_type(type)
|
338
|
+
case type.to_s
|
339
|
+
when "scalar", /\A(?:COLUMN_)?SCALAR\z/i
|
340
|
+
"COLUMN_SCALAR"
|
341
|
+
when "vector", /\A(?:COLUMN_)?VECTOR\z/i
|
342
|
+
"COLUMN_VECTOR"
|
343
|
+
when "index", /\A(?:COLUMN_)?INDEX\z/i
|
344
|
+
"COLUMN_INDEX"
|
345
|
+
else
|
346
|
+
message = "table type must be one of "
|
347
|
+
message << "[:array, :hash_table, :patricia_trie, :double_array_trie]: "
|
348
|
+
message << "#{type.inspect}"
|
349
|
+
raise ArgumentError, message
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
def normalize_type(type)
|
354
|
+
case type.to_s
|
355
|
+
when /\Abool(?:ean)?\z/i
|
356
|
+
"Bool"
|
357
|
+
when /\Aint(8|16|32|64)\z/i
|
358
|
+
"Int#{$1}"
|
359
|
+
when /\Auint(8|16|32|64)\z/i
|
360
|
+
"UInt#{$1}"
|
361
|
+
when /\Afloat\z/i
|
362
|
+
"Float"
|
363
|
+
when /\Atime\z/i
|
364
|
+
"Time"
|
365
|
+
when /\Ashort_?text\z/i
|
366
|
+
"ShortText"
|
367
|
+
when /\Atext\z/i
|
368
|
+
"Text"
|
369
|
+
when /\Along_?text\z/i
|
370
|
+
"LongText"
|
371
|
+
when /\Atokyo_?geo_?point\z/i
|
372
|
+
"TokyoGeoPoint"
|
373
|
+
when /\A(?:wgs84)?_?geo_?point\z/i
|
374
|
+
"WGS84GeoPoint"
|
375
|
+
else
|
376
|
+
type
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
def normalize_tokenizer(tokenizer)
|
381
|
+
case tokenizer.to_s
|
382
|
+
when /\A(?:token_?)?bigram\z/i
|
383
|
+
"TokenBigram"
|
384
|
+
when /\A(?:token_?)?delimit\z/i
|
385
|
+
"TokenDelimit"
|
386
|
+
when /\A(?:token_?)?mecab\z/i
|
387
|
+
"TokenMecab"
|
388
|
+
else
|
389
|
+
tokenizer
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
def normalize_normalizer(normalizer)
|
394
|
+
case normalizer.to_s
|
395
|
+
when /\A(?:normalizer_?)?auto\z/i
|
396
|
+
"NormalizerAuto"
|
397
|
+
else
|
398
|
+
normalizer
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
class CreateTableMigration
|
403
|
+
def initialize(migration, table_name)
|
404
|
+
@migration = migration
|
405
|
+
@table_name = table_name
|
406
|
+
end
|
407
|
+
|
408
|
+
def boolean(column_name, options={})
|
409
|
+
@migration.add_column(@table_name, column_name, :bool, options)
|
410
|
+
end
|
411
|
+
alias_method :bool, :boolean
|
412
|
+
|
413
|
+
def integer(column_name, options={})
|
414
|
+
options = options.dup
|
415
|
+
bit = options.delete(:bit) || 32
|
416
|
+
unsigned = options.delete(:unsigned)
|
417
|
+
if unsigned
|
418
|
+
type = "uint#{bit}"
|
419
|
+
else
|
420
|
+
type = "int#{bit}"
|
421
|
+
end
|
422
|
+
@migration.add_column(@table_name, column_name, type, options)
|
423
|
+
end
|
424
|
+
|
425
|
+
def float(column_name, options={})
|
426
|
+
@migration.add_column(@table_name, column_name, :float, options)
|
427
|
+
end
|
428
|
+
|
429
|
+
def time(column_name, options={})
|
430
|
+
@migration.add_column(@table_name, column_name, :time, options)
|
431
|
+
end
|
432
|
+
|
433
|
+
def short_text(column_name, options={})
|
434
|
+
@migration.add_column(@table_name, column_name, :short_text, options)
|
435
|
+
end
|
436
|
+
|
437
|
+
def text(column_name, options={})
|
438
|
+
@migration.add_column(@table_name, column_name, :text, options)
|
439
|
+
end
|
440
|
+
|
441
|
+
def long_text(column_name, options={})
|
442
|
+
@migration.add_column(@table_name, column_name, :long_text, options)
|
443
|
+
end
|
444
|
+
|
445
|
+
def geo_point(column_name, options={})
|
446
|
+
options = options.dup
|
447
|
+
datum = options.delete(:datum) || :wgs84
|
448
|
+
case datum
|
449
|
+
when :wgs84
|
450
|
+
type = "WGS84GeoPoint"
|
451
|
+
when :tokyo
|
452
|
+
type = "TokyoGeoPoint"
|
453
|
+
else
|
454
|
+
message = "invalid geodetic datum: "
|
455
|
+
message << "available: [:wgs84, :tokyo]: #{datum.inspect}"
|
456
|
+
raise ArgumentError, message
|
457
|
+
end
|
458
|
+
@migration.add_column(@table_name, column_name, type, options)
|
459
|
+
end
|
460
|
+
|
461
|
+
def wgs84_geo_point(column_name, options={})
|
462
|
+
geo_point(column_name, options.merge(datum: :wgs84))
|
463
|
+
end
|
464
|
+
|
465
|
+
def tokyo_geo_point(column_name, options={})
|
466
|
+
geo_point(column_name, options.merge(datum: :tokyo))
|
467
|
+
end
|
468
|
+
|
469
|
+
def reference(column_name, reference_table_name, options={})
|
470
|
+
@migration.add_column(@table_name,
|
471
|
+
column_name,
|
472
|
+
reference_table_name,
|
473
|
+
options)
|
474
|
+
end
|
475
|
+
|
476
|
+
def timestamps
|
477
|
+
@migration.add_timestamp_columns(@table_name)
|
478
|
+
end
|
479
|
+
|
480
|
+
def index(source_table_name, source_column_names, options={})
|
481
|
+
options = options.dup
|
482
|
+
source_column_names = Array(source_column_names)
|
483
|
+
column_name = options.delete(:name)
|
484
|
+
column_name ||= [source_table_name, *source_column_names].join("_")
|
485
|
+
@migration.add_column(@table_name,
|
486
|
+
column_name,
|
487
|
+
source_table_name,
|
488
|
+
options.merge(:type => :index,
|
489
|
+
:sources => source_column_names))
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|