groonga 0.0.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/NEWS.ja.rdoc +56 -0
  2. data/NEWS.rdoc +58 -0
  3. data/Rakefile +2 -3
  4. data/benchmark/read-write-many-small-items.rb +16 -32
  5. data/benchmark/write-many-small-items.rb +14 -28
  6. data/example/bookmark.rb +19 -17
  7. data/example/index-html.rb +11 -1
  8. data/example/search/config.ru +14 -9
  9. data/ext/rb-grn-array.c +6 -6
  10. data/ext/rb-grn-column.c +348 -18
  11. data/ext/rb-grn-context.c +8 -4
  12. data/ext/rb-grn-database.c +6 -7
  13. data/ext/rb-grn-exception.c +101 -5
  14. data/ext/rb-grn-expression.c +206 -23
  15. data/ext/rb-grn-fix-size-column.c +6 -39
  16. data/ext/rb-grn-hash.c +24 -24
  17. data/ext/rb-grn-index-column.c +74 -19
  18. data/ext/rb-grn-logger.c +48 -0
  19. data/ext/rb-grn-object.c +281 -67
  20. data/ext/rb-grn-operation.c +1 -1
  21. data/ext/rb-grn-patricia-trie-cursor.c +10 -1
  22. data/ext/rb-grn-patricia-trie.c +268 -7
  23. data/ext/rb-grn-query.c +52 -1
  24. data/ext/rb-grn-record.c +8 -2
  25. data/ext/rb-grn-snippet.c +63 -1
  26. data/ext/rb-grn-table-cursor-key-support.c +15 -1
  27. data/ext/rb-grn-table-cursor.c +57 -0
  28. data/ext/rb-grn-table-key-support.c +382 -46
  29. data/ext/rb-grn-table.c +729 -192
  30. data/ext/rb-grn-type.c +63 -12
  31. data/ext/rb-grn-utils.c +156 -158
  32. data/ext/rb-grn-variable.c +18 -0
  33. data/ext/rb-grn.h +85 -21
  34. data/ext/rb-groonga.c +13 -3
  35. data/extconf.rb +19 -4
  36. data/html/developer.html +1 -1
  37. data/html/header.html.erb +1 -1
  38. data/html/index.html +4 -4
  39. data/lib/groonga.rb +10 -0
  40. data/lib/groonga/expression-builder.rb +81 -42
  41. data/lib/groonga/patricia-trie.rb +13 -0
  42. data/lib/groonga/record.rb +158 -13
  43. data/lib/groonga/schema.rb +339 -33
  44. data/pkg-config.rb +6 -1
  45. data/test-unit/lib/test/unit.rb +23 -42
  46. data/test-unit/lib/test/unit/assertionfailederror.rb +11 -0
  47. data/test-unit/lib/test/unit/assertions.rb +87 -9
  48. data/test-unit/lib/test/unit/autorunner.rb +20 -11
  49. data/test-unit/lib/test/unit/collector.rb +1 -8
  50. data/test-unit/lib/test/unit/collector/load.rb +2 -3
  51. data/test-unit/lib/test/unit/color-scheme.rb +13 -1
  52. data/test-unit/lib/test/unit/diff.rb +223 -37
  53. data/test-unit/lib/test/unit/error.rb +4 -0
  54. data/test-unit/lib/test/unit/failure.rb +31 -5
  55. data/test-unit/lib/test/unit/notification.rb +8 -4
  56. data/test-unit/lib/test/unit/omission.rb +51 -3
  57. data/test-unit/lib/test/unit/pending.rb +4 -0
  58. data/test-unit/lib/test/unit/testcase.rb +55 -4
  59. data/test-unit/lib/test/unit/ui/console/testrunner.rb +190 -4
  60. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +14 -0
  61. data/test-unit/lib/test/unit/ui/testrunner.rb +8 -0
  62. data/test-unit/lib/test/unit/version.rb +1 -1
  63. data/test-unit/sample/{tc_adder.rb → test_adder.rb} +3 -1
  64. data/test-unit/sample/{tc_subtracter.rb → test_subtracter.rb} +3 -1
  65. data/test-unit/sample/test_user.rb +1 -0
  66. data/test-unit/test/collector/test-descendant.rb +2 -4
  67. data/test-unit/test/collector/test_objectspace.rb +7 -5
  68. data/test-unit/test/run-test.rb +2 -0
  69. data/test-unit/test/test-color-scheme.rb +7 -0
  70. data/test-unit/test/test-diff.rb +48 -7
  71. data/test-unit/test/test-omission.rb +1 -1
  72. data/test-unit/test/test-testcase.rb +47 -0
  73. data/test-unit/test/test_assertions.rb +79 -10
  74. data/test/groonga-test-utils.rb +6 -1
  75. data/test/test-array.rb +29 -14
  76. data/test/test-column.rb +107 -55
  77. data/test/test-context.rb +5 -0
  78. data/test/test-database.rb +2 -37
  79. data/test/test-exception.rb +9 -1
  80. data/test/test-expression-builder.rb +23 -5
  81. data/test/test-expression.rb +44 -8
  82. data/test/test-fix-size-column.rb +16 -5
  83. data/test/test-gqtp.rb +70 -0
  84. data/test/test-hash.rb +142 -43
  85. data/test/test-index-column.rb +9 -9
  86. data/test/test-patricia-trie.rb +79 -20
  87. data/test/test-procedure.rb +4 -2
  88. data/test/test-record.rb +32 -20
  89. data/test/test-remote.rb +3 -2
  90. data/test/test-schema.rb +226 -92
  91. data/test/test-table-cursor.rb +103 -1
  92. data/test/test-table-offset-and-limit.rb +102 -0
  93. data/test/test-table-select-normalize.rb +4 -4
  94. data/test/test-table-select.rb +52 -8
  95. data/test/test-table.rb +235 -116
  96. data/test/test-type.rb +2 -2
  97. data/test/test-variable-size-column.rb +21 -5
  98. data/test/test-vector-column.rb +76 -0
  99. data/{TUTORIAL.ja.rdoc → text/TUTORIAL.ja.rdoc} +52 -52
  100. data/text/expression.rdoc +284 -0
  101. metadata +11 -7
  102. data/test-unit/sample/ts_examples.rb +0 -7
@@ -23,11 +23,11 @@ class IndexColumnTest < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_array_set_with_record
26
- articles = Groonga::Array.create(:name => "<articles>")
27
- articles.define_column("content", "<text>")
26
+ articles = Groonga::Array.create(:name => "Articles")
27
+ articles.define_column("content", "Text")
28
28
 
29
- terms = Groonga::Hash.create(:name => "<terms>",
30
- :default_tokenizer => "<token:bigram>")
29
+ terms = Groonga::Hash.create(:name => "Terms",
30
+ :default_tokenizer => "TokenBigram")
31
31
  content_index = terms.define_index_column("content", articles,
32
32
  :with_section => true)
33
33
 
@@ -56,13 +56,13 @@ class IndexColumnTest < Test::Unit::TestCase
56
56
  end
57
57
 
58
58
  def test_shorter_query_than_ngram
59
- articles = Groonga::Array.create(:name => "<articles>")
60
- articles.define_column("content", "<text>")
59
+ articles = Groonga::Array.create(:name => "Articles")
60
+ articles.define_column("content", "Text")
61
61
 
62
- terms = Groonga::PatriciaTrie.create(:name => "<terms>",
63
- :default_tokenizer => "<token:bigram>")
62
+ terms = Groonga::PatriciaTrie.create(:name => "Terms",
63
+ :default_tokenizer => "TokenBigram")
64
64
  content_index = terms.define_index_column("content", articles,
65
- :source => "<articles>.content")
65
+ :source => "Articles.content")
66
66
  articles.add(:content => 'l')
67
67
  articles.add(:content => 'll')
68
68
  articles.add(:content => 'hello')
@@ -27,19 +27,17 @@ class PatriciaTrieTest < Test::Unit::TestCase
27
27
  def test_tokenizer
28
28
  trie = Groonga::PatriciaTrie.create
29
29
  assert_nil(trie.default_tokenizer)
30
- trie.default_tokenizer = "<token:trigram>"
31
- assert_equal(Groonga::Context.default["<token:trigram>"],
30
+ trie.default_tokenizer = "TokenTrigram"
31
+ assert_equal(Groonga::Context.default["TokenTrigram"],
32
32
  trie.default_tokenizer)
33
33
  end
34
34
 
35
35
  def test_search
36
- omit("creating entry is broken.")
36
+ users = Groonga::Array.create(:name => "Users")
37
+ user_name = users.define_column("name", "ShortText")
37
38
 
38
- users = Groonga::Array.create(:name => "<users>")
39
- user_name = users.define_column("name", "<shorttext>")
40
-
41
- bookmarks = Groonga::PatriciaTrie.create(:name => "<bookmarks>",
42
- :key_type => "<shorttext>")
39
+ bookmarks = Groonga::PatriciaTrie.create(:name => "Bookmarks",
40
+ :key_type => "ShortText")
43
41
  bookmark_user_id = bookmarks.define_column("user_id", users)
44
42
 
45
43
  daijiro = users.add
@@ -56,35 +54,35 @@ class PatriciaTrieTest < Test::Unit::TestCase
56
54
  end
57
55
 
58
56
  def test_add
59
- users = Groonga::PatriciaTrie.create(:name => "<users>")
57
+ users = Groonga::PatriciaTrie.create(:name => "Users")
60
58
  users.define_column("address", "<text>")
61
59
  me = users.add("me", :address => "me@example.com")
62
60
  assert_equal("me@example.com", me[:address])
63
61
  end
64
62
 
65
63
  def test_default_tokenizer_on_create
66
- terms = Groonga::PatriciaTrie.create(:name => "<terms>",
67
- :default_tokenizer => "<token:unigram>")
64
+ terms = Groonga::PatriciaTrie.create(:name => "Terms",
65
+ :default_tokenizer => "TokenUnigram")
68
66
  assert_equal(context[Groonga::Type::UNIGRAM],
69
67
  terms.default_tokenizer)
70
68
  end
71
69
 
72
70
  def test_duplicated_name
73
- Groonga::PatriciaTrie.create(:name => "<users>")
71
+ Groonga::PatriciaTrie.create(:name => "Users")
74
72
  assert_raise(Groonga::InvalidArgument) do
75
- Groonga::PatriciaTrie.create(:name => "<users>")
73
+ Groonga::PatriciaTrie.create(:name => "Users")
76
74
  end
77
75
  end
78
76
 
79
77
  def test_open_same_name
80
- users_created = Groonga::PatriciaTrie.create(:name => "<users>")
81
- users_opened = Groonga::PatriciaTrie.open(:name => "<users>")
78
+ users_created = Groonga::PatriciaTrie.create(:name => "Users")
79
+ users_opened = Groonga::PatriciaTrie.open(:name => "Users")
82
80
  users_opened.add("morita")
83
81
  assert_equal(1, users_created.size)
84
82
  end
85
83
 
86
84
  def test_has_key?
87
- users = Groonga::PatriciaTrie.create(:name => "<users>")
85
+ users = Groonga::PatriciaTrie.create(:name => "Users")
88
86
  assert_false(users.has_key?("morita"))
89
87
  users.add("morita")
90
88
  assert_true(users.has_key?("morita"))
@@ -95,28 +93,31 @@ class PatriciaTrieTest < Test::Unit::TestCase
95
93
  words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
96
94
  :key_normalize => true)
97
95
  words.add("リンク")
96
+ arupaka = words.add("アルパカ")
97
+ words.add("アルパカ(生物)")
98
98
  adventure_of_link = words.add('リンクの冒険')
99
99
  words.add('冒険')
100
100
  gaxtu = words.add('ガッ')
101
101
  muteki = words.add('MUTEKI')
102
102
  assert_equal([[muteki, "muTEki", 0, 6],
103
103
  [adventure_of_link, "リンクの冒険", 7, 18],
104
- [gaxtu, "ガッ", 42, 6]],
105
- words.scan('muTEki リンクの冒険 ミリバール ガッ'))
104
+ [arupaka, "アルパカ", 42, 12],
105
+ [gaxtu, "ガッ", 55, 6]],
106
+ words.scan('muTEki リンクの冒険 ミリバール アルパカ ガッ'))
106
107
  end
107
108
 
108
109
  def test_tag_keys
109
110
  Groonga::Context.default_options = {:encoding => "utf-8"}
110
111
  words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
111
112
  :key_normalize => true)
112
- words.add("リンク")
113
+ words.add('リンク')
113
114
  words.add('リンクの冒険')
114
115
  words.add('冒険')
115
116
  words.add('㍊')
116
117
  words.add('ガッ')
117
118
  words.add('MUTEKI')
118
119
 
119
- text = 'muTEki リンクの冒険 マッチしない ミリバール ガッ'
120
+ text = 'muTEki リンクの冒険 マッチしない ミリバール ガッ おわり'
120
121
  actual = words.tag_keys(text) do |record, word|
121
122
  "<#{word}(#{record.key})>"
122
123
  end
@@ -124,7 +125,65 @@ class PatriciaTrieTest < Test::Unit::TestCase
124
125
  "<リンクの冒険(リンクの冒険)> " +
125
126
  "マッチしない " +
126
127
  "<ミリバール(ミリバール)> " +
128
+ "<ガッ(ガッ)> " +
129
+ "おわり",
130
+ actual)
131
+ end
132
+
133
+ def test_tag_keys_with_last_match
134
+ Groonga::Context.default_options = {:encoding => "utf-8"}
135
+ words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
136
+ :key_normalize => true)
137
+ words.add('ガッ')
138
+ words.add('MUTEKI')
139
+
140
+ text = 'muTEki マッチしない ガッ'
141
+ actual = words.tag_keys(text) do |record, word|
142
+ "<#{word}(#{record.key})>"
143
+ end
144
+ assert_equal("<muTEki(muteki)> " +
145
+ "マッチしない " +
127
146
  "<ガッ(ガッ)>",
128
147
  actual)
129
148
  end
149
+
150
+ def test_tag_keys_with_no_match
151
+ Groonga::Context.default_options = {:encoding => "utf-8"}
152
+ words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
153
+ :key_normalize => true)
154
+
155
+ words.add('無敵')
156
+ words.add('BOUKEN')
157
+
158
+ text = 'muTEki リンクの冒険'
159
+ actual = words.tag_keys(text) do |record, word|
160
+ "<#{word}(#{record.key})>"
161
+ end
162
+ assert_equal(text, actual)
163
+ end
164
+
165
+ def test_prefix_search
166
+ paths = Groonga::PatriciaTrie.create(:name => "Paths",
167
+ :key_type => 'ShortText')
168
+ root_path = paths.add('/')
169
+ tmp_path = paths.add('/tmp')
170
+ usr_bin_path = paths.add('/usr/bin')
171
+ usr_local_bin_path = paths.add('/usr/local/bin')
172
+
173
+ records = paths.prefix_search('/')
174
+ assert_equal(["/usr/local/bin", "/usr/bin", "/tmp", "/"],
175
+ records.records.collect {|record| record["._key"]})
176
+
177
+ records = paths.prefix_search('/usr')
178
+ assert_equal(["/usr/local/bin", "/usr/bin"],
179
+ records.records.collect {|record| record["._key"]})
180
+
181
+ records = paths.prefix_search('/usr/local')
182
+ assert_equal(["/usr/local/bin"],
183
+ records.records.collect {|record| record["._key"]})
184
+
185
+ records = paths.prefix_search('nonexistent')
186
+ assert_equal([],
187
+ records.records.collect {|record| record["._key"]})
188
+ end
130
189
  end
@@ -23,12 +23,14 @@ class ProcedureTest < Test::Unit::TestCase
23
23
  assert_equal_procedure("TokenUnigram", Groonga::Procedure::UNIGRAM)
24
24
  assert_equal_procedure("TokenBigram", Groonga::Procedure::BIGRAM)
25
25
  assert_equal_procedure("TokenTrigram", Groonga::Procedure::TRIGRAM)
26
- assert_equal_procedure("TokenMecab", Groonga::Procedure::MECAB)
26
+ assert_equal_procedure("TokenMecab", Groonga::Procedure::MECAB,
27
+ :accept_nil => true)
27
28
  end
28
29
 
29
30
  private
30
- def assert_equal_procedure(expected_name, id)
31
+ def assert_equal_procedure(expected_name, id, options={})
31
32
  procedure = Groonga::Context.default[id]
33
+ expected_name = nil if procedure.nil? and options[:accept_nil]
32
34
  assert_equal(expected_name,
33
35
  procedure ? procedure.name : procedure)
34
36
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -27,23 +27,23 @@ class RecordTest < Test::Unit::TestCase
27
27
 
28
28
  def setup_addresses_table
29
29
  @addresses_path = @tables_dir + "addresses"
30
- @addresses = Groonga::Array.create(:name => "addresses",
30
+ @addresses = Groonga::Array.create(:name => "Addresses",
31
31
  :path => @addresses_path.to_s)
32
32
 
33
33
  @addresses_mail_column_path = @columns_dir + "mail"
34
34
  @addresses_mail_column =
35
- @addresses.define_column("mail", "<shorttext>",
35
+ @addresses.define_column("mail", "ShortText",
36
36
  :path => @addresses_mail_column_path.to_s)
37
37
  end
38
38
 
39
39
  def setup_users_table
40
40
  @users_path = @tables_dir + "users"
41
- @users = Groonga::Array.create(:name => "users",
41
+ @users = Groonga::Array.create(:name => "Users",
42
42
  :path => @users_path.to_s)
43
43
 
44
44
  @users_name_column_path = @columns_dir + "name"
45
45
  @users_name_column =
46
- @users.define_column("name", "<shorttext>",
46
+ @users.define_column("name", "ShortText",
47
47
  :path => @users_name_column_path.to_s)
48
48
 
49
49
  @users_addresses_column_path = @columns_dir + "addresses"
@@ -55,26 +55,25 @@ class RecordTest < Test::Unit::TestCase
55
55
 
56
56
  def setup_bookmarks_table
57
57
  @bookmarks_path = @tables_dir + "bookmarks"
58
- value_type = Groonga::Type.new("Text512", :size => 512)
59
- @bookmarks = Groonga::Array.create(:name => "bookmarks",
60
- :value_type => value_type,
58
+ @bookmarks = Groonga::Array.create(:name => "Bookmarks",
59
+ :value_type => "Int32",
61
60
  :path => @bookmarks_path.to_s)
62
61
 
63
62
  @uri_column_path = @columns_dir + "uri"
64
- @bookmarks_uri = @bookmarks.define_column("uri", "<shorttext>",
63
+ @bookmarks_uri = @bookmarks.define_column("uri", "ShortText",
65
64
  :path => @uri_column_path.to_s)
66
65
 
67
66
  @rate_column_path = @columns_dir + "rate"
68
- @bookmarks_rate = @bookmarks.define_column("rate", "<int>",
67
+ @bookmarks_rate = @bookmarks.define_column("rate", "Int32",
69
68
  :path => @rate_column_path.to_s)
70
69
 
71
70
  @comment_column_path = @columns_dir + "comment"
72
71
  @bookmarks_comment =
73
- @bookmarks.define_column("comment", "<text>",
72
+ @bookmarks.define_column("comment", "Text",
74
73
  :path => @comment_column_path.to_s)
75
74
 
76
75
  @content_column_path = @columns_dir + "content"
77
- @bookmarks_content = @bookmarks.define_column("content", "<longtext>")
76
+ @bookmarks_content = @bookmarks.define_column("content", "LongText")
78
77
 
79
78
  @user_column_path = @columns_dir + "user"
80
79
  @bookmarks_user = @bookmarks.define_column("user", @users)
@@ -83,7 +82,7 @@ class RecordTest < Test::Unit::TestCase
83
82
  def setup_indexes
84
83
  @bookmarks_index_path = @tables_dir + "bookmarks-index"
85
84
  @bookmarks_index =
86
- Groonga::PatriciaTrie.create(:name => "bookmarks-index",
85
+ Groonga::PatriciaTrie.create(:name => "BookmarksIndex",
87
86
  :path => @bookmarks_index_path.to_s)
88
87
  @bookmarks_index.default_tokenizer = "TokenBigram"
89
88
 
@@ -122,14 +121,14 @@ class RecordTest < Test::Unit::TestCase
122
121
 
123
122
  def test_get_nonexistent_column
124
123
  groonga = @bookmarks.add
125
- assert_raise(Groonga::InvalidArgument) do
124
+ assert_raise(Groonga::NoSuchColumn) do
126
125
  groonga["nonexistent"]
127
126
  end
128
127
  end
129
128
 
130
129
  def test_set_nonexistent_column
131
130
  groonga = @bookmarks.add
132
- assert_raise(Groonga::InvalidArgument) do
131
+ assert_raise(Groonga::NoSuchColumn) do
133
132
  groonga["nonexistent"] = "value"
134
133
  end
135
134
  end
@@ -160,17 +159,17 @@ class RecordTest < Test::Unit::TestCase
160
159
  end
161
160
 
162
161
  def test_key
163
- documents = Groonga::PatriciaTrie.create(:name => "<documents>",
164
- :key_type => "<shorttext>")
162
+ documents = Groonga::PatriciaTrie.create(:name => "Documents",
163
+ :key_type => "ShortText")
165
164
  reference = documents.add("reference")
166
165
  assert_equal("reference", reference.key)
167
166
  end
168
167
 
169
168
  def test_value
170
169
  bookmark = @bookmarks.add
171
- assert_equal("", bookmark.value.split(/\0/, 2)[0])
172
- bookmark.value = "http://groonga.org/\0"
173
- assert_equal("http://groonga.org/", bookmark.value.split(/\0/, 2)[0])
170
+ assert_equal(0, bookmark.value)
171
+ bookmark.value = 100
172
+ assert_equal(100, bookmark.value)
174
173
  end
175
174
 
176
175
  def test_reference_column?
@@ -253,4 +252,17 @@ class RecordTest < Test::Unit::TestCase
253
252
  groonga.clear_lock
254
253
  assert_not_predicate(groonga, :locked?)
255
254
  end
255
+
256
+ def test_attributes
257
+ values = {
258
+ "uri" => "http://groonga.org/",
259
+ "rate" => 5,
260
+ "comment" => "Grate!"
261
+ }
262
+ groonga = @bookmarks.add(values)
263
+ assert_equal(values.merge("id" => groonga.id,
264
+ "content" => nil,
265
+ "user" => nil),
266
+ groonga.attributes)
267
+ end
256
268
  end
@@ -46,7 +46,8 @@ class RemoteTest < Test::Unit::TestCase
46
46
  assert_equal(0, _context.send("status"))
47
47
  id, result = _context.receive
48
48
  assert_equal(0, id)
49
- assert_equal(["alloc_count", "starttime", "uptime"],
50
- JSON.load(result).keys.sort)
49
+ return_code, values = JSON.load(result)
50
+ assert_equal([[0], ["alloc_count", "starttime", "uptime"]],
51
+ [return_code, values.keys.sort])
51
52
  end
52
53
  end
@@ -19,54 +19,57 @@ class SchemaTest < Test::Unit::TestCase
19
19
  setup :setup_database
20
20
 
21
21
  def test_create_table
22
- assert_nil(context["<posts>"])
23
- Groonga::Schema.create_table("<posts>") do |table|
22
+ assert_nil(context["Posts"])
23
+ Groonga::Schema.create_table("Posts") do |table|
24
24
  end
25
- assert_not_nil(context["<posts>"])
25
+ assert_not_nil(context["Posts"])
26
26
  end
27
27
 
28
28
  def test_create_table_force
29
- Groonga::Schema.create_table("posts") do |table|
29
+ Groonga::Schema.create_table("Posts") do |table|
30
+ table.string("name")
30
31
  end
31
- assert_raise(Groonga::InvalidArgument) do
32
- Groonga::Schema.create_table("posts") do |table|
33
- end
32
+ assert_not_nil(context["Posts.name"])
33
+
34
+ Groonga::Schema.create_table("Posts") do |table|
34
35
  end
35
- Groonga::Schema.create_table("posts", :force => true) do |table|
36
+ assert_not_nil(context["Posts.name"])
37
+
38
+ Groonga::Schema.create_table("Posts", :force => true) do |table|
36
39
  end
40
+ assert_nil(context["Posts.name"])
37
41
  end
38
42
 
39
43
  def test_remove_table
40
- Groonga::Array.create(:name => "posts")
41
- assert_not_nil(context["posts"])
42
- Groonga::Schema.remove_table("posts")
43
- assert_nil(context["posts"])
44
+ Groonga::Array.create(:name => "Posts")
45
+ assert_not_nil(context["Posts"])
46
+ Groonga::Schema.remove_table("Posts")
47
+ assert_nil(context["Posts"])
44
48
  end
45
49
 
46
50
  def test_define_hash
47
- Groonga::Schema.create_table("<posts>", :type => :hash) do |table|
51
+ Groonga::Schema.create_table("Posts", :type => :hash) do |table|
48
52
  end
49
- assert_kind_of(Groonga::Hash, context["<posts>"])
53
+ assert_kind_of(Groonga::Hash, context["Posts"])
50
54
  end
51
55
 
52
56
  def test_define_hash_with_full_option
53
57
  path = @tmp_dir + "hash.groonga"
54
- tokenizer = context["<token:trigram>"]
55
- type = Groonga::Type.new("Niku", :size => 29)
56
- Groonga::Schema.create_table("<posts>",
58
+ tokenizer = context["TokenTrigram"]
59
+ Groonga::Schema.create_table("Posts",
57
60
  :type => :hash,
58
61
  :key_type => "integer",
59
62
  :path => path.to_s,
60
- :value_type => type,
63
+ :value_type => "UInt32",
61
64
  :default_tokenizer => tokenizer) do |table|
62
65
  end
63
- table = context["<posts>"]
66
+ table = context["Posts"]
64
67
  assert_equal("#<Groonga::Hash " +
65
68
  "id: <#{table.id}>, " +
66
- "name: <<posts>>, " +
69
+ "name: <Posts>, " +
67
70
  "path: <#{path}>, " +
68
- "domain: <#{context['<int>'].inspect}>, " +
69
- "range: <#{type.inspect}>, " +
71
+ "domain: <Int32>, " +
72
+ "range: <UInt32>, " +
70
73
  "flags: <>, " +
71
74
  "encoding: <#{Groonga::Encoding.default.inspect}>, " +
72
75
  "size: <0>>",
@@ -75,167 +78,278 @@ class SchemaTest < Test::Unit::TestCase
75
78
  end
76
79
 
77
80
  def test_define_patricia_trie
78
- Groonga::Schema.create_table("<posts>", :type => :patricia_trie) do |table|
81
+ Groonga::Schema.create_table("Posts", :type => :patricia_trie) do |table|
79
82
  end
80
- assert_kind_of(Groonga::PatriciaTrie, context["<posts>"])
83
+ assert_kind_of(Groonga::PatriciaTrie, context["Posts"])
81
84
  end
82
85
 
83
86
  def test_define_patricia_trie_with_full_option
84
87
  path = @tmp_dir + "patricia-trie.groonga"
85
- type = Groonga::Type.new("Niku", :size => 29)
86
- Groonga::Schema.create_table("<posts>",
88
+ Groonga::Schema.create_table("Posts",
87
89
  :type => :patricia_trie,
88
90
  :key_type => "integer",
89
91
  :path => path.to_s,
90
- :value_type => type,
91
- :default_tokenizer => "<token:bigram>",
92
+ :value_type => "Float",
93
+ :default_tokenizer => "TokenBigram",
92
94
  :key_normalize => true,
93
95
  :key_with_sis => true) do |table|
94
96
  end
95
- table = context["<posts>"]
97
+ table = context["Posts"]
96
98
  assert_equal("#<Groonga::PatriciaTrie " +
97
99
  "id: <#{table.id}>, " +
98
- "name: <<posts>>, " +
100
+ "name: <Posts>, " +
99
101
  "path: <#{path}>, " +
100
- "domain: <#{context['<int>'].inspect}>, " +
101
- "range: <#{type.inspect}>, " +
102
+ "domain: <Int32>, " +
103
+ "range: <Float>, " +
102
104
  "flags: <KEY_WITH_SIS|KEY_NORMALIZE|WITH_SECTION>, " +
103
105
  "encoding: <#{Groonga::Encoding.default.inspect}>, " +
104
106
  "size: <0>>",
105
107
  table.inspect)
106
- assert_equal(context["<token:bigram>"], table.default_tokenizer)
108
+ assert_equal(context["TokenBigram"], table.default_tokenizer)
107
109
  end
108
110
 
109
111
  def test_define_array
110
- Groonga::Schema.create_table("<posts>", :type => :array) do |table|
112
+ Groonga::Schema.create_table("Posts", :type => :array) do |table|
111
113
  end
112
- assert_kind_of(Groonga::Array, context["<posts>"])
114
+ assert_kind_of(Groonga::Array, context["Posts"])
113
115
  end
114
116
 
115
117
  def test_define_array_with_full_option
116
118
  path = @tmp_dir + "array.groonga"
117
- type = Groonga::Type.new("Niku", :size => 29)
118
- Groonga::Schema.create_table("<posts>",
119
+ Groonga::Schema.create_table("Posts",
119
120
  :type => :array,
120
121
  :path => path.to_s,
121
- :value_type => type) do |table|
122
+ :value_type => "Int32") do |table|
122
123
  end
123
- table = context["<posts>"]
124
+ table = context["Posts"]
124
125
  assert_equal("#<Groonga::Array " +
125
126
  "id: <#{table.id}>, " +
126
- "name: <<posts>>, " +
127
+ "name: <Posts>, " +
127
128
  "path: <#{path}>, " +
128
- "domain: <#{type.inspect}>, " +
129
- "range: <#{type.inspect}>, " +
129
+ "domain: <Int32>, " +
130
+ "range: <Int32>, " +
130
131
  "flags: <>, " +
131
132
  "size: <0>>",
132
133
  table.inspect)
133
134
  end
134
135
 
136
+ def test_column_with_full_option
137
+ path = @tmp_dir + "column.groonga"
138
+ type = Groonga::Type.new("Niku", :size => 29)
139
+ Groonga::Schema.create_table("Posts") do |table|
140
+ table.column("rate",
141
+ type,
142
+ :path => path.to_s,
143
+ :persistent => true,
144
+ :type => :vector,
145
+ :compress => :lzo)
146
+ end
147
+
148
+ column_name = "Posts.rate"
149
+ column = context[column_name]
150
+ assert_equal("#<Groonga::VariableSizeColumn " +
151
+ "id: <#{column.id}>, " +
152
+ "name: <#{column_name}>, " +
153
+ "path: <#{path}>, " +
154
+ "domain: <Posts>, " +
155
+ "range: <Niku>, " +
156
+ "flags: <COMPRESS_LZO>>",
157
+ column.inspect)
158
+ end
159
+
135
160
  def test_integer32_column
136
- assert_nil(context["<posts>.rate"])
137
- Groonga::Schema.create_table("<posts>") do |table|
161
+ assert_nil(context["Posts.rate"])
162
+ Groonga::Schema.create_table("Posts") do |table|
138
163
  table.integer32 :rate
139
164
  end
140
- assert_equal(context["<int>"], context["<posts>.rate"].range)
165
+ assert_equal(context["Int32"], context["Posts.rate"].range)
141
166
  end
142
167
 
143
168
  def test_integer64_column
144
- assert_nil(context["<posts>.rate"])
145
- Groonga::Schema.create_table("<posts>") do |table|
169
+ assert_nil(context["Posts.rate"])
170
+ Groonga::Schema.create_table("Posts") do |table|
146
171
  table.integer64 :rate
147
172
  end
148
- assert_equal(context["<int64>"], context["<posts>.rate"].range)
173
+ assert_equal(context["Int64"], context["Posts.rate"].range)
149
174
  end
150
175
 
151
176
  def test_unsigned_integer32_column
152
- assert_nil(context["<posts>.n_viewed"])
153
- Groonga::Schema.create_table("<posts>") do |table|
177
+ assert_nil(context["Posts.n_viewed"])
178
+ Groonga::Schema.create_table("Posts") do |table|
154
179
  table.unsigned_integer32 :n_viewed
155
180
  end
156
- assert_equal(context["<uint>"], context["<posts>.n_viewed"].range)
181
+ assert_equal(context["UInt32"], context["Posts.n_viewed"].range)
157
182
  end
158
183
 
159
184
  def test_unsigned_integer64_column
160
- assert_nil(context["<posts>.n_viewed"])
161
- Groonga::Schema.create_table("<posts>") do |table|
185
+ assert_nil(context["Posts.n_viewed"])
186
+ Groonga::Schema.create_table("Posts") do |table|
162
187
  table.unsigned_integer64 :n_viewed
163
188
  end
164
- assert_equal(context["<uint64>"], context["<posts>.n_viewed"].range)
189
+ assert_equal(context["UInt64"], context["Posts.n_viewed"].range)
165
190
  end
166
191
 
167
192
  def test_float_column
168
- assert_nil(context["<posts>.rate"])
169
- Groonga::Schema.create_table("<posts>") do |table|
193
+ assert_nil(context["Posts.rate"])
194
+ Groonga::Schema.create_table("Posts") do |table|
170
195
  table.float :rate
171
196
  end
172
- assert_equal(context["<float>"], context["<posts>.rate"].range)
197
+ assert_equal(context["Float"], context["Posts.rate"].range)
173
198
  end
174
199
 
175
200
  def test_time_column
176
- assert_nil(context["<posts>.last_modified"])
177
- Groonga::Schema.create_table("<posts>") do |table|
201
+ assert_nil(context["Posts.last_modified"])
202
+ Groonga::Schema.create_table("Posts") do |table|
178
203
  table.time :last_modified
179
204
  end
180
- assert_equal(context["<time>"], context["<posts>.last_modified"].range)
205
+ assert_equal(context["Time"], context["Posts.last_modified"].range)
181
206
  end
182
207
 
183
208
  def test_short_text_column
184
- assert_nil(context["<posts>.title"])
185
- Groonga::Schema.create_table("<posts>") do |table|
209
+ assert_nil(context["Posts.title"])
210
+ Groonga::Schema.create_table("Posts") do |table|
186
211
  table.short_text :title
187
212
  end
188
- assert_equal(context["<shorttext>"], context["<posts>.title"].range)
213
+ assert_equal(context["ShortText"], context["Posts.title"].range)
189
214
  end
190
215
 
191
216
  def test_text_column
192
- assert_nil(context["<posts>.comment"])
193
- Groonga::Schema.create_table("<posts>") do |table|
217
+ assert_nil(context["Posts.comment"])
218
+ Groonga::Schema.create_table("Posts") do |table|
194
219
  table.text :comment
195
220
  end
196
- assert_equal(context["<text>"], context["<posts>.comment"].range)
221
+ assert_equal(context["Text"], context["Posts.comment"].range)
197
222
  end
198
223
 
199
224
  def test_long_text_column
200
- assert_nil(context["<posts>.content"])
201
- Groonga::Schema.create_table("<posts>") do |table|
225
+ assert_nil(context["Posts.content"])
226
+ Groonga::Schema.create_table("Posts") do |table|
202
227
  table.long_text :content
203
228
  end
204
- assert_equal(context["<longtext>"], context["<posts>.content"].range)
229
+ assert_equal(context["LongText"], context["Posts.content"].range)
205
230
  end
206
231
 
207
232
  def test_remove_column
208
- Groonga::Schema.create_table("posts") do |table|
233
+ Groonga::Schema.create_table("Posts") do |table|
209
234
  table.long_text :content
210
235
  end
211
- assert_not_nil(context["posts.content"])
236
+ assert_not_nil(context["Posts.content"])
212
237
 
213
- Groonga::Schema.change_table("posts") do |table|
238
+ Groonga::Schema.change_table("Posts") do |table|
214
239
  table.remove_column("content")
215
240
  end
216
- assert_nil(context["posts.content"])
241
+ assert_nil(context["Posts.content"])
242
+ end
243
+
244
+ def test_column_again
245
+ Groonga::Schema.create_table("Posts") do |table|
246
+ table.text :content
247
+ end
248
+
249
+ assert_nothing_raised do
250
+ Groonga::Schema.create_table("Posts") do |table|
251
+ table.text :content
252
+ end
253
+ end
254
+ end
255
+
256
+ def test_column_again_with_difference_type
257
+ Groonga::Schema.create_table("Posts") do |table|
258
+ table.text :content
259
+ end
260
+
261
+ assert_raise(ArgumentError) do
262
+ Groonga::Schema.create_table("Posts") do |table|
263
+ table.integer :content
264
+ end
265
+ end
217
266
  end
218
267
 
219
268
  def test_index
220
- assert_nil(context["<terms>.content"])
221
- Groonga::Schema.create_table("<posts>") do |table|
269
+ assert_nil(context["Terms.content"])
270
+ Groonga::Schema.create_table("Posts") do |table|
222
271
  table.long_text :content
223
272
  end
224
- Groonga::Schema.create_table("<terms>") do |table|
225
- table.index "<posts>.content"
273
+ Groonga::Schema.create_table("Terms") do |table|
274
+ table.index "Posts.content"
275
+ end
276
+ assert_equal([context["Posts.content"]],
277
+ context["Terms.Posts_content"].sources)
278
+ end
279
+
280
+ def test_index_with_full_option
281
+ path = @tmp_dir + "index-column.groonga"
282
+ assert_nil(context["Terms.content"])
283
+ index_column_name = "Posts-index"
284
+
285
+ Groonga::Schema.create_table("Posts") do |table|
286
+ table.long_text :content
287
+ end
288
+ Groonga::Schema.create_table("Terms") do |table|
289
+ table.index("Posts.content",
290
+ :name => index_column_name,
291
+ :path => path.to_s,
292
+ :persistent => true,
293
+ :with_section => true,
294
+ :with_weight => true,
295
+ :with_position => true)
296
+ end
297
+
298
+ posts = context["Posts"]
299
+ terms = context["Terms"]
300
+ full_index_column_name = "Terms.#{index_column_name}"
301
+ index_column = context[full_index_column_name]
302
+ assert_equal("#<Groonga::IndexColumn " +
303
+ "id: <#{index_column.id}>, " +
304
+ "name: <#{full_index_column_name}>, " +
305
+ "path: <#{path}>, " +
306
+ "domain: <Terms>, " +
307
+ "range: <Posts>, " +
308
+ "flags: <WITH_SECTION|WITH_WEIGHT|WITH_POSITION|" +
309
+ "UNIT_DOCUMENT_SECTION|UNIT_DOCUMENT_POSITION|" +
310
+ "UNIT_USERDEF_DOCUMENT|UNIT_USERDEF_SECTION>>",
311
+ index_column.inspect)
312
+ end
313
+
314
+ def test_index_again
315
+ Groonga::Schema.create_table("Posts") do |table|
316
+ table.long_text :content
317
+ end
318
+ Groonga::Schema.create_table("Terms") do |table|
319
+ table.index "Posts.content"
320
+ end
321
+
322
+ assert_nothing_raised do
323
+ Groonga::Schema.create_table("Terms") do |table|
324
+ table.index "Posts.content"
325
+ end
326
+ end
327
+ end
328
+
329
+ def test_index_again_with_difference_source
330
+ Groonga::Schema.create_table("Posts") do |table|
331
+ table.long_text :content
332
+ table.short_text :name
333
+ end
334
+ Groonga::Schema.create_table("Terms") do |table|
335
+ table.index "Posts.content"
336
+ end
337
+
338
+ assert_raise(ArgumentError) do
339
+ Groonga::Schema.create_table("Terms") do |table|
340
+ table.index "Posts.name", :name => "Posts_content"
341
+ end
226
342
  end
227
- assert_equal([context["<posts>.content"]],
228
- context["<terms>.<posts>_content"].sources)
229
343
  end
230
344
 
231
345
  def test_dump
232
346
  Groonga::Schema.define do |schema|
233
- schema.create_table("posts") do |table|
347
+ schema.create_table("Posts") do |table|
234
348
  table.short_text :title
235
349
  end
236
350
  end
237
351
  assert_equal(<<-EOS, Groonga::Schema.dump)
238
- create_table("posts") do |table|
352
+ create_table("Posts") do |table|
239
353
  table.short_text("title")
240
354
  end
241
355
  EOS
@@ -243,40 +357,60 @@ EOS
243
357
 
244
358
  def test_reference_dump
245
359
  Groonga::Schema.define do |schema|
246
- schema.create_table("items") do |table|
360
+ schema.create_table("Items") do |table|
247
361
  table.short_text("title")
248
362
  end
249
363
 
250
- schema.create_table("users") do |table|
364
+ schema.create_table("Users") do |table|
251
365
  table.short_text("name")
252
366
  end
253
367
 
254
- schema.create_table("comments") do |table|
255
- table.reference("item", "items")
256
- table.reference("author", "users")
368
+ schema.create_table("Comments") do |table|
369
+ table.reference("item", "Items")
370
+ table.reference("author", "Users")
257
371
  table.text("content")
258
372
  table.time("issued")
259
373
  end
260
374
  end
261
375
 
262
376
  assert_equal(<<-EOS, Groonga::Schema.dump)
263
- create_table("comments") do |table|
377
+ create_table("Comments") do |table|
264
378
  table.text("content")
265
379
  table.time("issued")
266
380
  end
267
381
 
268
- create_table("items") do |table|
382
+ create_table("Items") do |table|
269
383
  table.short_text("title")
270
384
  end
271
385
 
272
- create_table("users") do |table|
386
+ create_table("Users") do |table|
273
387
  table.short_text("name")
274
388
  end
275
389
 
276
- change_table("comments") do |table|
277
- table.reference("author", "users")
278
- table.reference("item", "items")
390
+ change_table("Comments") do |table|
391
+ table.reference("author", "Users")
392
+ table.reference("item", "Items")
279
393
  end
280
394
  EOS
281
395
  end
396
+
397
+ def test_explicit_context_create_table
398
+ context = Groonga::Context.default
399
+ Groonga::Context.default = nil
400
+
401
+ Groonga::Schema.define(:context => context) do |schema|
402
+ schema.create_table('Items', :type => :hash) do |table|
403
+ table.text("text")
404
+ end
405
+ schema.create_table("TermsText",
406
+ :type => :patricia_trie,
407
+ :key_normalize => true,
408
+ :default_tokenizer => "TokenBigram") do |table|
409
+ table.index('Items.text')
410
+ end
411
+ end
412
+
413
+ assert_not_nil(context["Items.text"])
414
+ assert_not_nil(context["TermsText.Items_text"])
415
+ end
282
416
  end