groonga-client-model 1.0.0 → 1.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/doc/text/news.md +30 -0
  3. data/groonga-client-model.gemspec +1 -1
  4. data/lib/groonga_client_model/log_subscriber.rb +1 -3
  5. data/lib/groonga_client_model/migration.rb +493 -0
  6. data/lib/groonga_client_model/migrator.rb +240 -0
  7. data/lib/groonga_client_model/railtie.rb +4 -2
  8. data/lib/groonga_client_model/railties/groonga.rake +55 -2
  9. data/lib/groonga_client_model/record.rb +39 -1
  10. data/lib/groonga_client_model/schema.rb +8 -0
  11. data/lib/groonga_client_model/schema_loader.rb +4 -9
  12. data/lib/groonga_client_model/test/groonga_server_runner.rb +19 -3
  13. data/lib/groonga_client_model/version.rb +1 -1
  14. data/lib/rails/generators/groonga_client_model/migration/templates/create_table_migration.rb +14 -0
  15. data/lib/rails/generators/groonga_client_model/migration/templates/delete_config_migration.rb +9 -0
  16. data/lib/rails/generators/groonga_client_model/migration/templates/migration.rb +12 -0
  17. data/lib/rails/generators/groonga_client_model/migration/templates/set_config_migration.rb +10 -0
  18. data/lib/rails/generators/groonga_client_model/migration_generator.rb +125 -0
  19. data/lib/rails/generators/groonga_client_model/{model/model_generator.rb → model_generator.rb} +18 -4
  20. data/test/apps/rails4/Gemfile.lock +2 -2
  21. data/test/apps/rails4/db/groonga/migrate/20170303120517_create_posts.rb +8 -0
  22. data/test/apps/rails4/db/groonga/migrate/20170303120527_create_terms.rb +7 -0
  23. data/test/apps/rails4/db/groonga/migrate/20170303120536_create_ages.rb +6 -0
  24. data/test/apps/rails4/log/development.log +22 -0
  25. data/test/apps/rails4/log/test.log +1350 -0
  26. data/test/apps/rails4/test/generators/migration_generator_test.rb +103 -0
  27. data/test/apps/rails4/test/tmp/db/groonga/migrate/20170307045825_set_config_alias_column.rb +10 -0
  28. data/test/apps/rails5/Gemfile.lock +8 -8
  29. data/test/apps/rails5/db/groonga/migrate/20170301061420_create_posts.rb +8 -0
  30. data/test/apps/rails5/db/groonga/migrate/20170303115054_create_terms.rb +7 -0
  31. data/test/apps/rails5/db/groonga/migrate/20170303115135_create_ages.rb +6 -0
  32. data/test/apps/rails5/log/development.log +350 -0
  33. data/test/apps/rails5/log/test.log +3260 -0
  34. data/test/apps/rails5/test/generators/migration_generator_test.rb +103 -0
  35. data/test/apps/rails5/test/tmp/db/groonga/migrate/20170307081511_remove_title_from_posts.rb +5 -0
  36. data/test/apps/rails5/tmp/cache/assets/sprockets/v3.0/5C/5Cws9GLWcOju_f3tIpY01qSaj7zkLAU0a2bQmpf7sS8.cache +1 -0
  37. data/test/apps/rails5/tmp/cache/assets/sprockets/v3.0/XH/XH9pWZvGgK476BpPGID5z8hjzRmGJjtzV0cHBLXhIKc.cache +1 -0
  38. data/test/unit/fixtures/migrate/20170301061420_create_posts.rb +8 -0
  39. data/test/unit/fixtures/migrate/20170303115054_create_terms.rb +7 -0
  40. data/test/unit/fixtures/migrate/20170303115135_create_ages.rb +6 -0
  41. data/test/unit/migration/test_config.rb +62 -0
  42. data/test/unit/migration/test_copy.rb +117 -0
  43. data/test/unit/migration/test_create_table.rb +528 -0
  44. data/test/unit/migration/test_exist.rb +47 -0
  45. data/test/unit/migration/test_load.rb +83 -0
  46. data/test/unit/record/test_active_model.rb +31 -0
  47. data/test/unit/record/test_readers.rb +45 -0
  48. data/test/unit/record/test_timestamps.rb +76 -0
  49. data/test/unit/record/test_validators.rb +295 -0
  50. data/test/unit/run-test.rb +1 -2
  51. data/test/unit/test_helper.rb +109 -0
  52. data/test/unit/test_load_value_generator.rb +8 -7
  53. data/test/unit/test_migrator.rb +156 -0
  54. metadata +64 -11
  55. data/test/apps/rails4/db/schema.grn +0 -9
  56. data/test/apps/rails5/db/schema.grn +0 -11
  57. data/test/unit/test_record.rb +0 -345
@@ -0,0 +1,103 @@
1
+ require "test_helper"
2
+ require "rails/generators/groonga_client_model/migration_generator"
3
+
4
+ class MigrationGeneratorTest < Rails::Generators::TestCase
5
+ tests GroongaClientModel::Generators::MigrationGenerator
6
+ destination File.expand_path("../tmp", __dir__)
7
+ setup :prepare_destination
8
+
9
+ test "add_column" do
10
+ run_generator(["add_title_to_posts", "title:short_text"])
11
+ assert_migration("db/groonga/migrate/add_title_to_posts.rb", <<-MIGRATION)
12
+ class AddTitleToPosts < GroongaClientModel::Migration
13
+ def change
14
+ add_column :posts, :title, :short_text
15
+ end
16
+ end
17
+ MIGRATION
18
+ end
19
+
20
+ test "remove_column" do
21
+ run_generator(["remove_title_from_posts", "title"])
22
+ assert_migration("db/groonga/migrate/remove_title_from_posts.rb", <<-MIGRATION)
23
+ class RemoveTitleFromPosts < GroongaClientModel::Migration
24
+ def change
25
+ remove_column :posts, :title
26
+ end
27
+ end
28
+ MIGRATION
29
+ end
30
+
31
+ test "create_table" do
32
+ run_generator(["create_posts"])
33
+ assert_migration("db/groonga/migrate/create_posts.rb", <<-MIGRATION)
34
+ class CreatePosts < GroongaClientModel::Migration
35
+ def change
36
+ create_table :posts do |t|
37
+ end
38
+ end
39
+ end
40
+ MIGRATION
41
+ end
42
+
43
+ test "create_table: _key" do
44
+ run_generator(["create_posts", "_key:short_text"])
45
+ assert_migration("db/groonga/migrate/create_posts.rb", <<-MIGRATION)
46
+ class CreatePosts < GroongaClientModel::Migration
47
+ def change
48
+ create_table :posts,
49
+ type: :hash_table,
50
+ key_type: :short_text do |t|
51
+ end
52
+ end
53
+ end
54
+ MIGRATION
55
+ end
56
+
57
+ test "set_config" do
58
+ run_generator(["set_config_alias_column"])
59
+ assert_migration("db/groonga/migrate/set_config_alias_column.rb", <<-MIGRATION)
60
+ class SetConfigAliasColumn < GroongaClientModel::Migration
61
+ def up
62
+ set_config "alias.column", "new value"
63
+ end
64
+
65
+ def down
66
+ # set_config "alias.column", "old value"
67
+ # delete_config "alias.column"
68
+ end
69
+ end
70
+ MIGRATION
71
+ end
72
+
73
+ test "set_config: value" do
74
+ run_generator(["set_config_alias_column", "aliases.real_name"])
75
+ assert_migration("db/groonga/migrate/set_config_alias_column.rb", <<-MIGRATION)
76
+ class SetConfigAliasColumn < GroongaClientModel::Migration
77
+ def up
78
+ set_config "alias.column", "aliases.real_name"
79
+ end
80
+
81
+ def down
82
+ # set_config "alias.column", "old value"
83
+ # delete_config "alias.column"
84
+ end
85
+ end
86
+ MIGRATION
87
+ end
88
+
89
+ test "delete_config" do
90
+ run_generator(["delete_config_alias_column"])
91
+ assert_migration("db/groonga/migrate/delete_config_alias_column.rb", <<-MIGRATION)
92
+ class DeleteConfigAliasColumn < GroongaClientModel::Migration
93
+ def up
94
+ delete_config "alias.column"
95
+ end
96
+
97
+ def down
98
+ # set_config "alias.column", "old value"
99
+ end
100
+ end
101
+ MIGRATION
102
+ end
103
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveTitleFromPosts < GroongaClientModel::Migration
2
+ def change
3
+ remove_column :posts, :title
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ "%M��(Y���f�bgN��!�+�ZR?�Q�IE�
@@ -0,0 +1 @@
1
+ "%�o1��?P�k�0�pw�Ře��„�^�r��e���
@@ -0,0 +1,8 @@
1
+ class CreatePosts < GroongaClientModel::Migration
2
+ def change
3
+ create_table :posts do |t|
4
+ t.short_text :title
5
+ t.text :body
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ class CreateTerms < GroongaClientModel::Migration
2
+ def change
3
+ create_table :terms, propose: :full_text_search do |t|
4
+ t.index :posts, :body
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ class CreateAges < GroongaClientModel::Migration
2
+ def change
3
+ create_table :ages, type: :hash_table, key_type: :uint32 do |t|
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,62 @@
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
+ class TestMigrationConfig < Test::Unit::TestCase
18
+ include GroongaClientModel::TestHelper
19
+ include TestHelper::Migration
20
+
21
+ test("#set_config") do
22
+ expected_up_report = <<-REPORT
23
+ -- set_config("alias.column", "aliases.real_name")
24
+ -> 0.0s
25
+ REPORT
26
+ expected_down_report = nil
27
+ expected_dump = <<-DUMP.chomp
28
+ config_set alias.column aliases.real_name
29
+ DUMP
30
+ assert_migrate(expected_up_report,
31
+ expected_down_report,
32
+ expected_dump) do |migration|
33
+ migration.instance_eval do
34
+ set_config("alias.column", "aliases.real_name")
35
+ end
36
+ end
37
+ end
38
+
39
+ test("#delete_config") do
40
+ open_client do |client|
41
+ client.request(:config_set).
42
+ parameter(:key, "alias.column").
43
+ parameter(:value, "aliases.real_name").
44
+ response
45
+ end
46
+
47
+ expected_up_report = <<-REPORT
48
+ -- delete_config("alias.column")
49
+ -> 0.0s
50
+ REPORT
51
+ expected_down_report = nil
52
+ expected_dump = <<-DUMP.chomp
53
+ DUMP
54
+ assert_migrate(expected_up_report,
55
+ expected_down_report,
56
+ expected_dump) do |migration|
57
+ migration.instance_eval do
58
+ delete_config("alias.column")
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,117 @@
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
+ class TestMigrationCopy < Test::Unit::TestCase
18
+ include GroongaClientModel::TestHelper
19
+ include TestHelper::Migration
20
+
21
+ setup do
22
+ open_client do |client|
23
+ client.table_create(name: "posts",
24
+ flags: "TABLE_HASH_KEY",
25
+ key_type: "ShortText")
26
+ client.column_create(table: "posts",
27
+ name: "content",
28
+ flags: "COLUMN_SCALAR",
29
+ type: "Text")
30
+ client.table_create(name: "entries",
31
+ flags: "TABLE_PAT_KEY",
32
+ key_type: "ShortText")
33
+ client.column_create(table: "entries",
34
+ name: "content",
35
+ flags: "COLUMN_SCALAR",
36
+ type: "LongText")
37
+ values = [
38
+ {"_key" => "Groonga", "content" => "Very good!"},
39
+ {"_key" => "Ruby", "content" => "Very exciting!"},
40
+ ]
41
+ client.load(table: "posts",
42
+ values: values)
43
+ end
44
+ end
45
+
46
+ test("#copy_table") do
47
+ expected_up_report = <<-REPORT
48
+ -- copy_table(:posts, :entries)
49
+ -> 0.0s
50
+ REPORT
51
+ expected_down_report = nil
52
+ expected_dump = <<-DUMP.chomp
53
+ table_create entries TABLE_PAT_KEY ShortText
54
+ column_create entries content COLUMN_SCALAR LongText
55
+
56
+ table_create posts TABLE_HASH_KEY ShortText
57
+ column_create posts content COLUMN_SCALAR Text
58
+
59
+ load --table entries
60
+ [
61
+ ["_key","content"],
62
+ ["Groonga",""],
63
+ ["Ruby",""]
64
+ ]
65
+
66
+ load --table posts
67
+ [
68
+ ["_key","content"],
69
+ ["Groonga","Very good!"],
70
+ ["Ruby","Very exciting!"]
71
+ ]
72
+ DUMP
73
+ assert_migrate(expected_up_report,
74
+ expected_down_report,
75
+ expected_dump) do |migration|
76
+ migration.instance_eval do
77
+ copy_table(:posts, :entries)
78
+ end
79
+ end
80
+ end
81
+
82
+ test("#copy_column") do
83
+ expected_up_report = <<-REPORT
84
+ -- copy_column("posts.content", "entries.content")
85
+ -> 0.0s
86
+ REPORT
87
+ expected_down_report = nil
88
+ expected_dump = <<-DUMP.chomp
89
+ table_create entries TABLE_PAT_KEY ShortText
90
+ column_create entries content COLUMN_SCALAR LongText
91
+
92
+ table_create posts TABLE_HASH_KEY ShortText
93
+ column_create posts content COLUMN_SCALAR Text
94
+
95
+ load --table entries
96
+ [
97
+ ["_key","content"],
98
+ ["Groonga","Very good!"],
99
+ ["Ruby","Very exciting!"]
100
+ ]
101
+
102
+ load --table posts
103
+ [
104
+ ["_key","content"],
105
+ ["Groonga","Very good!"],
106
+ ["Ruby","Very exciting!"]
107
+ ]
108
+ DUMP
109
+ assert_migrate(expected_up_report,
110
+ expected_down_report,
111
+ expected_dump) do |migration|
112
+ migration.instance_eval do
113
+ copy_column("posts.content", "entries.content")
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,528 @@
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
+ class TestMigrationCreateTable < Test::Unit::TestCase
18
+ include GroongaClientModel::TestHelper
19
+ include TestHelper::Migration
20
+
21
+ test("default") do
22
+ expected_up_report = <<-REPORT
23
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
24
+ -> 0.0s
25
+ REPORT
26
+ expected_down_report = <<-REPORT
27
+ -- remove_table(:posts)
28
+ -> 0.0s
29
+ REPORT
30
+ expected_dump = <<-DUMP.chomp
31
+ table_create posts TABLE_NO_KEY
32
+ DUMP
33
+ assert_migrate(expected_up_report,
34
+ expected_down_report,
35
+ expected_dump) do |migration|
36
+ migration.instance_eval do
37
+ create_table(:posts)
38
+ end
39
+ end
40
+ end
41
+
42
+ sub_test_case(":type => :patricia_trie") do
43
+ test("default") do
44
+ expected_up_report = <<-REPORT
45
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText"})
46
+ -> 0.0s
47
+ REPORT
48
+ expected_down_report = <<-REPORT
49
+ -- remove_table(:terms)
50
+ -> 0.0s
51
+ REPORT
52
+ expected_dump = <<-DUMP.chomp
53
+ table_create terms TABLE_PAT_KEY ShortText
54
+ DUMP
55
+ assert_migrate(expected_up_report,
56
+ expected_down_report,
57
+ expected_dump) do |migration|
58
+ migration.instance_eval do
59
+ create_table(:terms, :type => :patricia_trie)
60
+ end
61
+ end
62
+ end
63
+
64
+ test("tokenizer") do
65
+ expected_up_report = <<-REPORT
66
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText", :tokenizer=>"TokenBigram"})
67
+ -> 0.0s
68
+ REPORT
69
+ expected_down_report = <<-REPORT
70
+ -- remove_table(:terms)
71
+ -> 0.0s
72
+ REPORT
73
+ expected_dump = <<-DUMP.chomp
74
+ table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram
75
+ DUMP
76
+ assert_migrate(expected_up_report,
77
+ expected_down_report,
78
+ expected_dump) do |migration|
79
+ migration.instance_eval do
80
+ create_table(:terms,
81
+ :type => :patricia_trie,
82
+ :tokenizer => :bigram)
83
+ end
84
+ end
85
+ end
86
+
87
+ test("normalizer") do
88
+ expected_up_report = <<-REPORT
89
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText", :normalizer=>"NormalizerAuto"})
90
+ -> 0.0s
91
+ REPORT
92
+ expected_down_report = <<-REPORT
93
+ -- remove_table(:terms)
94
+ -> 0.0s
95
+ REPORT
96
+ expected_dump = <<-DUMP.chomp
97
+ table_create terms TABLE_PAT_KEY ShortText --normalizer NormalizerAuto
98
+ DUMP
99
+ assert_migrate(expected_up_report,
100
+ expected_down_report,
101
+ expected_dump) do |migration|
102
+ migration.instance_eval do
103
+ create_table(:terms,
104
+ :type => :patricia_trie,
105
+ :normalizer => :auto)
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ sub_test_case("propose") do
112
+ test("full_text_search") do
113
+ expected_up_report = <<-REPORT
114
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText", :tokenizer=>"TokenBigram", :normalizer=>"NormalizerAuto"})
115
+ -> 0.0s
116
+ REPORT
117
+ expected_down_report = <<-REPORT
118
+ -- remove_table(:terms)
119
+ -> 0.0s
120
+ REPORT
121
+ expected_dump = <<-DUMP.chomp
122
+ table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
123
+ DUMP
124
+ assert_migrate(expected_up_report,
125
+ expected_down_report,
126
+ expected_dump) do |migration|
127
+ migration.instance_eval do
128
+ create_table(:terms, :propose => :full_text_search)
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ sub_test_case("columns") do
135
+ def assert_migrate_add_column(column_name,
136
+ groonga_type,
137
+ options={})
138
+ expected_up_report = <<-REPORT
139
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
140
+ -> 0.0s
141
+ -- add_column(:posts, :#{column_name}, {:flags=>["COLUMN_SCALAR"], :value_type=>#{groonga_type.inspect}})
142
+ -> 0.0s
143
+ REPORT
144
+ expected_down_report = <<-REPORT
145
+ -- remove_table(:posts)
146
+ -> 0.0s
147
+ REPORT
148
+ expected_dump = <<-DUMP.chomp
149
+ table_create posts TABLE_NO_KEY
150
+ column_create posts #{column_name} COLUMN_SCALAR #{groonga_type}
151
+ DUMP
152
+ assert_migrate(expected_up_report,
153
+ expected_down_report,
154
+ expected_dump) do |migration|
155
+ migration.instance_eval do
156
+ create_table(:posts) do |table|
157
+ yield(table)
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ sub_test_case("#boolean") do
164
+ test("default") do
165
+ assert_migrate_add_column(:published, "Bool") do |table|
166
+ table.boolean(:published)
167
+ end
168
+ end
169
+
170
+ test("alias: #bool") do
171
+ assert_migrate_add_column(:published, "Bool") do |table|
172
+ table.bool(:published)
173
+ end
174
+ end
175
+ end
176
+
177
+ sub_test_case("#integer") do
178
+ test("default") do
179
+ assert_migrate_add_column(:score, "Int32") do |table|
180
+ table.integer(:score)
181
+ end
182
+ end
183
+
184
+ test("bit: 8") do
185
+ assert_migrate_add_column(:score, "Int8") do |table|
186
+ table.integer(:score, bit: 8)
187
+ end
188
+ end
189
+
190
+ test("bit: 16") do
191
+ assert_migrate_add_column(:score, "Int16") do |table|
192
+ table.integer(:score, bit: 16)
193
+ end
194
+ end
195
+
196
+ test("bit: 32") do
197
+ assert_migrate_add_column(:score, "Int32") do |table|
198
+ table.integer(:score, bit: 32)
199
+ end
200
+ end
201
+
202
+ test("bit: 64") do
203
+ assert_migrate_add_column(:score, "Int64") do |table|
204
+ table.integer(:score, bit: 64)
205
+ end
206
+ end
207
+
208
+ test("bit: 8, unsigned: true") do
209
+ assert_migrate_add_column(:score, "UInt8") do |table|
210
+ table.integer(:score, bit: 8, unsigned: true)
211
+ end
212
+ end
213
+
214
+ test("bit: 16, unsigned: true") do
215
+ assert_migrate_add_column(:score, "UInt16") do |table|
216
+ table.integer(:score, bit: 16, unsigned: true)
217
+ end
218
+ end
219
+
220
+ test("bit: 32, unsigned: true") do
221
+ assert_migrate_add_column(:score, "UInt32") do |table|
222
+ table.integer(:score, bit: 32, unsigned: true)
223
+ end
224
+ end
225
+
226
+ test("bit: 64, unsigned: true") do
227
+ assert_migrate_add_column(:score, "UInt64") do |table|
228
+ table.integer(:score, bit: 64, unsigned: true)
229
+ end
230
+ end
231
+ end
232
+
233
+ sub_test_case("#float") do
234
+ test("default") do
235
+ assert_migrate_add_column(:score, "Float") do |table|
236
+ table.float(:score)
237
+ end
238
+ end
239
+ end
240
+
241
+ sub_test_case("#time") do
242
+ test("default") do
243
+ assert_migrate_add_column(:published_at, "Time") do |table|
244
+ table.time(:published_at)
245
+ end
246
+ end
247
+ end
248
+
249
+ sub_test_case("#short_text") do
250
+ test("default") do
251
+ assert_migrate_add_column(:title, "ShortText") do |table|
252
+ table.short_text(:title)
253
+ end
254
+ end
255
+ end
256
+
257
+ sub_test_case("#text") do
258
+ test("default") do
259
+ assert_migrate_add_column(:content, "Text") do |table|
260
+ table.text(:content)
261
+ end
262
+ end
263
+ end
264
+
265
+ sub_test_case("#long_text") do
266
+ test("default") do
267
+ assert_migrate_add_column(:content, "LongText") do |table|
268
+ table.long_text(:content)
269
+ end
270
+ end
271
+ end
272
+
273
+ sub_test_case("#geo_point") do
274
+ test("default") do
275
+ assert_migrate_add_column(:location, "WGS84GeoPoint") do |table|
276
+ table.geo_point(:location)
277
+ end
278
+ end
279
+
280
+ test("datum: :wgs84") do
281
+ assert_migrate_add_column(:location, "WGS84GeoPoint") do |table|
282
+ table.geo_point(:location, datum: :wgs84)
283
+ end
284
+ end
285
+
286
+ test("datum: :tokyo") do
287
+ assert_migrate_add_column(:location, "TokyoGeoPoint") do |table|
288
+ table.geo_point(:location, datum: :tokyo)
289
+ end
290
+ end
291
+
292
+ test("alias: #wgs84_geo_point") do
293
+ assert_migrate_add_column(:location, "WGS84GeoPoint") do |table|
294
+ table.wgs84_geo_point(:location)
295
+ end
296
+ end
297
+
298
+ test("alias: #tokyo_geo_point") do
299
+ assert_migrate_add_column(:location, "TokyoGeoPoint") do |table|
300
+ table.tokyo_geo_point(:location)
301
+ end
302
+ end
303
+ end
304
+
305
+ sub_test_case("#reference") do
306
+ def assert_migrate_add_reference_column(column_name,
307
+ reference_table_name,
308
+ options={})
309
+ open_client do |client|
310
+ client.table_create(name: reference_table_name,
311
+ flags: "TABLE_HASH_KEY",
312
+ key_type: "ShortText")
313
+ end
314
+
315
+ flags = []
316
+ case options[:type]
317
+ when :vector
318
+ flags << "COLUMN_VECTOR"
319
+ else
320
+ flags << "COLUMN_SCALAR"
321
+ end
322
+
323
+ expected_up_report = <<-REPORT
324
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
325
+ -> 0.0s
326
+ -- add_column(:posts, :#{column_name}, {:flags=>#{flags.inspect}, :value_type=>#{reference_table_name.inspect}})
327
+ -> 0.0s
328
+ REPORT
329
+ expected_down_report = <<-REPORT
330
+ -- remove_table(:posts)
331
+ -> 0.0s
332
+ REPORT
333
+ expected_dump = <<-DUMP.chomp
334
+ table_create posts TABLE_NO_KEY
335
+
336
+ table_create #{reference_table_name} TABLE_HASH_KEY ShortText
337
+
338
+ column_create posts #{column_name} #{flags.join("|")} #{reference_table_name}
339
+ DUMP
340
+ assert_migrate(expected_up_report,
341
+ expected_down_report,
342
+ expected_dump) do |migration|
343
+ migration.instance_eval do
344
+ create_table(:posts) do |table|
345
+ yield(table)
346
+ end
347
+ end
348
+ end
349
+ end
350
+
351
+ test("default") do
352
+ assert_migrate_add_reference_column(:user, :users) do |table|
353
+ table.reference(:user, :users)
354
+ end
355
+ end
356
+
357
+ test("type: :vector") do
358
+ assert_migrate_add_reference_column(:user,
359
+ :users,
360
+ type: :vector) do |table|
361
+ table.reference(:user, :users, type: :vector)
362
+ end
363
+ end
364
+ end
365
+
366
+ sub_test_case("#timestamps") do
367
+ test("default") do
368
+ expected_up_report = <<-REPORT
369
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
370
+ -> 0.0s
371
+ -- add_column(:posts, :created_at, {:flags=>["COLUMN_SCALAR"], :value_type=>"Time"})
372
+ -> 0.0s
373
+ -- add_column(:posts, :updated_at, {:flags=>["COLUMN_SCALAR"], :value_type=>"Time"})
374
+ -> 0.0s
375
+ REPORT
376
+ expected_down_report = <<-REPORT
377
+ -- remove_table(:posts)
378
+ -> 0.0s
379
+ REPORT
380
+ expected_dump = <<-DUMP.chomp
381
+ table_create posts TABLE_NO_KEY
382
+ column_create posts created_at COLUMN_SCALAR Time
383
+ column_create posts updated_at COLUMN_SCALAR Time
384
+ DUMP
385
+ assert_migrate(expected_up_report,
386
+ expected_down_report,
387
+ expected_dump) do |migration|
388
+ migration.instance_eval do
389
+ create_table(:posts) do |table|
390
+ table.timestamps
391
+ end
392
+ end
393
+ end
394
+ end
395
+ end
396
+
397
+ sub_test_case("#index") do
398
+ test("for full text search") do
399
+ expected_up_report = <<-REPORT
400
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
401
+ -> 0.0s
402
+ -- add_column(:posts, :content, {:flags=>["COLUMN_SCALAR"], :value_type=>"Text"})
403
+ -> 0.0s
404
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText", :tokenizer=>"TokenBigram", :normalizer=>"NormalizerAuto"})
405
+ -> 0.0s
406
+ -- add_column(:terms, "posts_content", {:flags=>["COLUMN_INDEX", "WITH_POSITION"], :value_type=>:posts, :sources=>[:content]})
407
+ -> 0.0s
408
+ REPORT
409
+ expected_down_report = <<-REPORT
410
+ -- remove_table(:terms)
411
+ -> 0.0s
412
+ -- remove_table(:posts)
413
+ -> 0.0s
414
+ REPORT
415
+ expected_dump = <<-DUMP.chomp
416
+ table_create posts TABLE_NO_KEY
417
+ column_create posts content COLUMN_SCALAR Text
418
+
419
+ table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
420
+
421
+ column_create terms posts_content COLUMN_INDEX|WITH_POSITION posts content
422
+ DUMP
423
+ assert_migrate(expected_up_report,
424
+ expected_down_report,
425
+ expected_dump) do |migration|
426
+ migration.instance_eval do
427
+ create_table(:posts) do |table|
428
+ table.text(:content)
429
+ end
430
+
431
+ create_table(:terms,
432
+ :type => :patricia_trie,
433
+ :tokenizer => :bigram,
434
+ :normalizer => :auto) do |table|
435
+ table.index(:posts, :content)
436
+ end
437
+ end
438
+ end
439
+ end
440
+
441
+ test("multi sources") do
442
+ expected_up_report = <<-REPORT
443
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
444
+ -> 0.0s
445
+ -- add_column(:posts, :title, {:flags=>["COLUMN_SCALAR"], :value_type=>"ShortText"})
446
+ -> 0.0s
447
+ -- add_column(:posts, :content, {:flags=>["COLUMN_SCALAR"], :value_type=>"Text"})
448
+ -> 0.0s
449
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText", :tokenizer=>"TokenBigram", :normalizer=>"NormalizerAuto"})
450
+ -> 0.0s
451
+ -- add_column(:terms, "posts_title_content", {:flags=>["COLUMN_INDEX", "WITH_POSITION", "WITH_SECTION"], :value_type=>:posts, :sources=>[:title, :content]})
452
+ -> 0.0s
453
+ REPORT
454
+ expected_down_report = <<-REPORT
455
+ -- remove_table(:terms)
456
+ -> 0.0s
457
+ -- remove_table(:posts)
458
+ -> 0.0s
459
+ REPORT
460
+ expected_dump = <<-DUMP.chomp
461
+ table_create posts TABLE_NO_KEY
462
+ column_create posts content COLUMN_SCALAR Text
463
+ column_create posts title COLUMN_SCALAR ShortText
464
+
465
+ table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
466
+
467
+ column_create terms posts_title_content COLUMN_INDEX|WITH_SECTION|WITH_POSITION posts title,content
468
+ DUMP
469
+ assert_migrate(expected_up_report,
470
+ expected_down_report,
471
+ expected_dump) do |migration|
472
+ migration.instance_eval do
473
+ create_table(:posts) do |table|
474
+ table.short_text(:title)
475
+ table.text(:content)
476
+ end
477
+
478
+ create_table(:terms,
479
+ :propose => :full_text_search) do |table|
480
+ table.index(:posts, [:title, :content])
481
+ end
482
+ end
483
+ end
484
+ end
485
+
486
+ test("custom name") do
487
+ expected_up_report = <<-REPORT
488
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
489
+ -> 0.0s
490
+ -- add_column(:posts, :content, {:flags=>["COLUMN_SCALAR"], :value_type=>"Text"})
491
+ -> 0.0s
492
+ -- create_table(:terms, {:type=>"TABLE_PAT_KEY", :key_type=>"ShortText", :tokenizer=>"TokenBigram", :normalizer=>"NormalizerAuto"})
493
+ -> 0.0s
494
+ -- add_column(:terms, :posts, {:flags=>["COLUMN_INDEX", "WITH_POSITION"], :value_type=>:posts, :sources=>[:content]})
495
+ -> 0.0s
496
+ REPORT
497
+ expected_down_report = <<-REPORT
498
+ -- remove_table(:terms)
499
+ -> 0.0s
500
+ -- remove_table(:posts)
501
+ -> 0.0s
502
+ REPORT
503
+ expected_dump = <<-DUMP.chomp
504
+ table_create posts TABLE_NO_KEY
505
+ column_create posts content COLUMN_SCALAR Text
506
+
507
+ table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
508
+
509
+ column_create terms posts COLUMN_INDEX|WITH_POSITION posts content
510
+ DUMP
511
+ assert_migrate(expected_up_report,
512
+ expected_down_report,
513
+ expected_dump) do |migration|
514
+ migration.instance_eval do
515
+ create_table(:posts) do |table|
516
+ table.text(:content)
517
+ end
518
+
519
+ create_table(:terms,
520
+ :propose => :full_text_search) do |table|
521
+ table.index(:posts, [:content], name: :posts)
522
+ end
523
+ end
524
+ end
525
+ end
526
+ end
527
+ end
528
+ end