groonga 0.0.7 → 0.9.0

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 (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
@@ -19,9 +19,24 @@ class ExpressionTest < Test::Unit::TestCase
19
19
 
20
20
  setup :setup_database
21
21
 
22
+ def test_array_reference
23
+ expression = Groonga::Expression.new
24
+ ryoqun = expression.define_variable({:name => "user"})
25
+ ryoqun.value = "ryoqun"
26
+ mori = expression.define_variable
27
+ mori.value = "mori"
28
+
29
+ expression.append_object(ryoqun)
30
+ expression.append_object(mori)
31
+
32
+ assert_equal("ryoqun", expression["user"])
33
+ assert_equal("ryoqun", expression[0])
34
+ assert_equal("mori", expression[1])
35
+ end
36
+
22
37
  def test_get_value
23
- users = Groonga::Hash.create(:name => "<users>")
24
- name = users.define_column("name", "<shorttext>")
38
+ users = Groonga::Hash.create(:name => "Users")
39
+ name = users.define_column("name", "ShortText")
25
40
 
26
41
  morita = users.add("morita", :name => "mori daijiro")
27
42
 
@@ -35,8 +50,8 @@ class ExpressionTest < Test::Unit::TestCase
35
50
  end
36
51
 
37
52
  def test_get_value_with_variable
38
- users = Groonga::Hash.create(:name => "<users>")
39
- name = users.define_column("name", "<shorttext>")
53
+ users = Groonga::Hash.create(:name => "Users")
54
+ name = users.define_column("name", "ShortText")
40
55
 
41
56
  morita = users.add("morita", :name => "mori daijiro")
42
57
  gunyara_kun = users.add("gunyara-kun", :name => "Tasuku SUENAGA")
@@ -63,17 +78,17 @@ class ExpressionTest < Test::Unit::TestCase
63
78
  expression.append_operation(Groonga::Operation::PLUS, 2)
64
79
  expression.compile
65
80
 
66
- assert_equal("#<Groonga::Expression noname(){1 1}>", expression.inspect)
81
+ assert_equal("#<Groonga::Expression noname(){1 1 PLUS}>", expression.inspect)
67
82
  end
68
83
 
69
84
  def test_snippet
70
- users = Groonga::Array.create(:name => "users")
85
+ users = Groonga::Array.create(:name => "Users")
71
86
  name = users.define_column("name", "ShortText")
72
- terms = Groonga::Hash.create(:name => "terms",
87
+ terms = Groonga::Hash.create(:name => "Terms",
73
88
  :key_type => "ShortText",
74
89
  :default_tokenizer => "TokenBigram")
75
90
  users.define_index_column("user_name", users,
76
- :source => "users.name",
91
+ :source => "Users.name",
77
92
  :with_position => true)
78
93
 
79
94
  expression = Groonga::Expression.new
@@ -94,4 +109,25 @@ class ExpressionTest < Test::Unit::TestCase
94
109
  "Rubyらしい読み書きしやすい構文で利用できる" +
95
110
  "ことが利点です。"))
96
111
  end
112
+
113
+ def test_snippet_without_tags
114
+ users = Groonga::Array.create(:name => "Users")
115
+ name = users.define_column("name", "ShortText")
116
+ terms = Groonga::Hash.create(:name => "Terms",
117
+ :key_type => "ShortText",
118
+ :default_tokenizer => "TokenBigram")
119
+ users.define_index_column("user_name", users,
120
+ :source => "Users.name",
121
+ :with_position => true)
122
+
123
+ expression = Groonga::Expression.new
124
+ variable = expression.define_variable(:domain => users)
125
+ expression.append_object(variable)
126
+ expression.parse("ラングバ", :default_column => name)
127
+ expression.compile
128
+
129
+ snippet = expression.snippet([], :width => 30)
130
+ assert_equal(["ラングバプロジェクト"],
131
+ snippet.execute("ラングバプロジェクトはカラムストア機能も"))
132
+ end
97
133
  end
@@ -24,21 +24,21 @@ class FixSizeColumnTest < Test::Unit::TestCase
24
24
 
25
25
  def setup_bookmarks_table
26
26
  @bookmarks_path = @tables_dir + "bookmarks"
27
- @bookmarks = Groonga::Array.create(:name => "bookmarks",
27
+ @bookmarks = Groonga::Array.create(:name => "Bookmarks",
28
28
  :path => @bookmarks_path.to_s)
29
29
 
30
30
  @viewed_column_path = @columns_dir + "viewed"
31
- @viewed = @bookmarks.define_column("viewed", "<int>",
31
+ @viewed = @bookmarks.define_column("viewed", "Int32",
32
32
  :path => @viewed_column_path.to_s)
33
33
  end
34
34
 
35
35
  def test_inspect
36
36
  assert_equal("#<Groonga::FixSizeColumn " +
37
37
  "id: <#{@viewed.id}>, " +
38
- "name: <bookmarks.viewed>, " +
38
+ "name: <Bookmarks.viewed>, " +
39
39
  "path: <#{@viewed_column_path}>, " +
40
- "domain: <#{@bookmarks.inspect}>, " +
41
- "range: <#{context['<int>'].inspect}>, " +
40
+ "domain: <Bookmarks>, " +
41
+ "range: <Int32>, " +
42
42
  "flags: <KEY_INT>" +
43
43
  ">",
44
44
  @viewed.inspect)
@@ -51,4 +51,15 @@ class FixSizeColumnTest < Test::Unit::TestCase
51
51
  def test_table
52
52
  assert_equal(@bookmarks, @viewed.table)
53
53
  end
54
+
55
+ def test_assign_time
56
+ comments = Groonga::Array.create(:name => "Comments")
57
+ comments.define_column("title", "ShortText")
58
+ comments.define_column("issued", "Time")
59
+ title = "Good"
60
+ issued = 1187430026
61
+ record = comments.add(:title => title, :issued => issued)
62
+ assert_equal([title, Time.at(issued)],
63
+ [record["title"], record["issued"]])
64
+ end
54
65
  end
@@ -0,0 +1,70 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2010 Kouhei Sutou <kou@clear-code.com>
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License version 2.1 as published by the Free Software Foundation.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+
18
+ class GQTPTest < Test::Unit::TestCase
19
+ include GroongaTestUtils
20
+
21
+ setup :setup_database
22
+
23
+ setup
24
+ def setup_comments
25
+ @users = Groonga::Hash.create(:name => "Users", :key_type => "ShortText")
26
+
27
+ @comments = Groonga::Array.create(:name => "Comments")
28
+ @comments.define_column("content", "Text")
29
+ @comments.define_column("created_at", "Time")
30
+ @comments.define_column("user", "Users")
31
+
32
+ terms = Groonga::PatriciaTrie.create(:name => "Terms",
33
+ :default_tokenizer => "TokenBigram")
34
+ terms.define_index_column("comment_content", @comments,
35
+ :with_section => true,
36
+ :source => "content")
37
+ @comment1 = @comments.add(:content => "Hello Good-bye!",
38
+ :created_at => Time.parse("2009-08-09"),
39
+ :user => "morita")
40
+ @comment2 = @comments.add(:content => "Hello World",
41
+ :created_at => Time.parse("2009-07-09"),
42
+ :user => "")
43
+ @comment3 = @comments.add(:content => "test",
44
+ :created_at => Time.parse("2009-06-09"),
45
+ :user => "gunyara-kun")
46
+ @japanese_comment =
47
+ @comments.add(:content => "うちのボロTVはまだ現役です",
48
+ :created_at => Time.parse("2009-06-09"),
49
+ :user => "darashi")
50
+ end
51
+
52
+ def test_select_filter_by_existent_user
53
+ assert_equal([[0], [[1], ["user"], ["darashi"]]],
54
+ process("select Comments --output_columns user " +
55
+ "--filter 'user == \"darashi\"'"))
56
+ end
57
+
58
+ def test_select_filter_by_nonexistent_user
59
+ assert_equal([[0], [[0], ["user"]]],
60
+ process("select Comments --output_columns user " +
61
+ "--filter 'user == \"yu\"'"))
62
+ end
63
+
64
+ private
65
+ def process(gqtp)
66
+ context.send(gqtp)
67
+ id, result = context.receive
68
+ JSON.parse(result)
69
+ end
70
+ end
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
3
  #
4
4
  # This library is free software; you can redistribute it and/or
5
5
  # modify it under the terms of the GNU Lesser General Public
@@ -21,7 +21,7 @@ class HashTest < Test::Unit::TestCase
21
21
 
22
22
  def test_delete
23
23
  bookmarks_path = @tables_dir + "bookmarks"
24
- bookmarks = Groonga::Hash.create(:name => "bookmarks",
24
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
25
25
  :path => bookmarks_path.to_s)
26
26
 
27
27
  groonga = bookmarks.add("groonga")
@@ -40,25 +40,33 @@ class HashTest < Test::Unit::TestCase
40
40
  bookmarks.collect {|bookmark| bookmark.key})
41
41
  end
42
42
 
43
- def test_array_reference
44
- value = "groonga"
45
- value_type = Groonga::Type.new("Text#{value.size}", :size => value.size)
43
+ def test_value
46
44
  bookmarks_path = @tables_dir + "bookmarks"
47
- bookmarks = Groonga::Hash.create(:name => "bookmarks",
45
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
48
46
  :path => bookmarks_path.to_s,
49
- :key_type => "<shorttext>",
50
- :value_type => value_type)
51
- bookmarks["http://google.com/"] = value
52
- assert_equal(value, bookmarks["http://google.com/"])
47
+ :key_type => "ShortText",
48
+ :value_type => "UInt32")
49
+ bookmarks.set_value("http://google.com/", 29)
50
+ assert_equal(29, bookmarks.value("http://google.com/"))
53
51
  end
54
52
 
55
- def test_find
53
+ def test_column_value
54
+ bookmarks_path = @tables_dir + "bookmarks"
55
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
56
+ :path => bookmarks_path.to_s,
57
+ :key_type => "ShortText")
58
+ uri = bookmarks.define_column("uri", "ShortText")
59
+ bookmarks.set_column_value("google", "uri", "http://google.com/")
60
+ assert_equal("http://google.com/", bookmarks.column_value("google", "uri"))
61
+ end
62
+
63
+ def test_array_reference
56
64
  bookmarks_path = @tables_dir + "bookmarks"
57
65
  bookmarks = Groonga::Hash.create(:name => "bookmarks",
58
66
  :path => bookmarks_path.to_s,
59
- :key_type => "<shorttext>")
67
+ :key_type => "ShortText")
60
68
  bookmark = bookmarks.add("http://google.com/")
61
- assert_equal(bookmark, bookmarks.find("http://google.com/"))
69
+ assert_equal(bookmark, bookmarks["http://google.com/"])
62
70
  end
63
71
 
64
72
 
@@ -69,8 +77,8 @@ class HashTest < Test::Unit::TestCase
69
77
  "id: <#{anonymous_table.id}>, " +
70
78
  "name: (anonymous), " +
71
79
  "path: <#{path}>, " +
72
- "domain: <nil>, " +
73
- "range: <nil>, " +
80
+ "domain: (nil), " +
81
+ "range: (nil), " +
74
82
  "flags: <>, " +
75
83
  "encoding: <#{encoding.inspect}>, " +
76
84
  "size: <0>>",
@@ -83,8 +91,8 @@ class HashTest < Test::Unit::TestCase
83
91
  "id: <#{anonymous_table.id}>, " +
84
92
  "name: (anonymous), " +
85
93
  "path: (temporary), " +
86
- "domain: <nil>, " +
87
- "range: <nil>, " +
94
+ "domain: (nil), " +
95
+ "range: (nil), " +
88
96
  "flags: <>, " +
89
97
  "encoding: <#{encoding.inspect}>, " +
90
98
  "size: <0>>",
@@ -93,13 +101,13 @@ class HashTest < Test::Unit::TestCase
93
101
 
94
102
  def test_inspect_named
95
103
  path = @tables_dir + "named.groonga"
96
- named_table = Groonga::Hash.create(:name => "name", :path => path.to_s)
104
+ named_table = Groonga::Hash.create(:name => "Users", :path => path.to_s)
97
105
  assert_equal("#<Groonga::Hash " +
98
106
  "id: <#{named_table.id}>, " +
99
- "name: <name>, " +
107
+ "name: <Users>, " +
100
108
  "path: <#{path}>, " +
101
- "domain: <nil>, " +
102
- "range: <nil>, " +
109
+ "domain: (nil), " +
110
+ "range: (nil), " +
103
111
  "flags: <>, " +
104
112
  "encoding: <#{encoding.inspect}>, " +
105
113
  "size: <0>>",
@@ -112,8 +120,8 @@ class HashTest < Test::Unit::TestCase
112
120
  "id: <#{named_table.id}>, " +
113
121
  "name: (anonymous), " +
114
122
  "path: (temporary), " +
115
- "domain: <nil>, " +
116
- "range: <nil>, " +
123
+ "domain: (nil), " +
124
+ "range: (nil), " +
117
125
  "flags: <>, " +
118
126
  "encoding: <#{encoding.inspect}>, " +
119
127
  "size: <0>>",
@@ -128,17 +136,17 @@ class HashTest < Test::Unit::TestCase
128
136
  def test_tokenizer
129
137
  hash = Groonga::Hash.create
130
138
  assert_nil(hash.default_tokenizer)
131
- hash.default_tokenizer = "<token:bigram>"
132
- assert_equal(Groonga::Context.default["<token:bigram>"],
139
+ hash.default_tokenizer = "TokenBigram"
140
+ assert_equal(Groonga::Context.default["TokenBigram"],
133
141
  hash.default_tokenizer)
134
142
  end
135
143
 
136
144
  def test_search
137
- users = Groonga::Array.create(:name => "<users>")
138
- user_name = users.define_column("name", "<shorttext>")
145
+ users = Groonga::Array.create(:name => "Users")
146
+ user_name = users.define_column("name", "ShortText")
139
147
 
140
- bookmarks = Groonga::Hash.create(:name => "<bookmarks>",
141
- :key_type => "<shorttext>")
148
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
149
+ :key_type => "ShortText")
142
150
  bookmark_user_id = bookmarks.define_column("user_id", users)
143
151
 
144
152
  daijiro = users.add
@@ -155,33 +163,33 @@ class HashTest < Test::Unit::TestCase
155
163
  end
156
164
 
157
165
  def test_add
158
- users = Groonga::Hash.create(:name => "<users>")
159
- users.define_column("address", "<text>")
166
+ users = Groonga::Hash.create(:name => "Users")
167
+ users.define_column("address", "Text")
160
168
  me = users.add("me", :address => "me@example.com")
161
169
  assert_equal("me@example.com", me[:address])
162
170
  end
163
171
 
164
172
  def test_default_tokenizer_on_create
165
- terms = Groonga::Hash.create(:name => "<terms>",
166
- :default_tokenizer => "<token:trigram>")
173
+ terms = Groonga::Hash.create(:name => "Terms",
174
+ :default_tokenizer => "TokenTrigram")
167
175
  assert_equal(context[Groonga::Type::TRIGRAM],
168
176
  terms.default_tokenizer)
169
177
  end
170
178
 
171
179
  def test_duplicated_name
172
- Groonga::Hash.create(:name => "<users>")
180
+ Groonga::Hash.create(:name => "Users")
173
181
  assert_raise(Groonga::InvalidArgument) do
174
- Groonga::Hash.create(:name => "<users>")
182
+ Groonga::Hash.create(:name => "Users")
175
183
  end
176
184
  end
177
185
 
178
186
  def test_define_index_column_implicit_with_position
179
- bookmarks = Groonga::Hash.create(:name => "<bookmarks>")
180
- bookmarks.define_column("comment", "<text>")
181
- terms = Groonga::Hash.create(:name => "<terms>",
182
- :default_tokenizer => "<token:bigram>")
187
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
188
+ bookmarks.define_column("comment", "Text")
189
+ terms = Groonga::Hash.create(:name => "Terms",
190
+ :default_tokenizer => "TokenBigram")
183
191
  index = terms.define_index_column("comment", bookmarks,
184
- :source => "<bookmarks>.comment")
192
+ :source => "Bookmarks.comment")
185
193
  groonga = bookmarks.add("groonga", :comment => "search engine by Brazil")
186
194
  google = bookmarks.add("google", :comment => "search engine by Google")
187
195
  ruby = bookmarks.add("ruby", :comment => "programing language")
@@ -191,14 +199,14 @@ class HashTest < Test::Unit::TestCase
191
199
  end
192
200
 
193
201
  def test_open_same_name
194
- users_created = Groonga::Hash.create(:name => "<users>")
195
- users_opened = Groonga::Hash.open(:name => "<users>")
202
+ users_created = Groonga::Hash.create(:name => "Users")
203
+ users_opened = Groonga::Hash.open(:name => "Users")
196
204
  users_opened.add("morita")
197
205
  assert_equal(1, users_created.size)
198
206
  end
199
207
 
200
208
  def test_has_key?
201
- users = Groonga::Hash.create(:name => "<users>")
209
+ users = Groonga::Hash.create(:name => "Users")
202
210
  assert_false(users.has_key?("morita"))
203
211
  users.add("morita")
204
212
  assert_true(users.has_key?("morita"))
@@ -210,4 +218,95 @@ class HashTest < Test::Unit::TestCase
210
218
  hash.add(1 << 63)
211
219
  end
212
220
  end
221
+
222
+ def test_value_by_key
223
+ users = Groonga::Hash.create(:key_type => "ShortText",
224
+ :value_type => "Int32")
225
+ key = "niku"
226
+ users.add(key)
227
+ users.set_value(key, 29)
228
+ assert_equal(29, users.value(key))
229
+ end
230
+
231
+ def test_value_by_id
232
+ users = Groonga::Hash.create(:key_type => "ShortText",
233
+ :value_type => "Int32")
234
+ user_id = users.add("niku").id
235
+ users.set_value(user_id, 29, :id => true)
236
+ assert_equal(29, users.value(user_id, :id => true))
237
+ end
238
+
239
+ def test_id
240
+ users = Groonga::Hash.create(:key_type => "ShortText")
241
+
242
+ key = "niku"
243
+ assert_nil(users.id(key))
244
+ user_id = users.add(key).id
245
+ assert_equal(user_id, users.id(key))
246
+ end
247
+
248
+ def test_set_multi_values
249
+ users = Groonga::Hash.create(:name => "Users",
250
+ :key_type => "ShortText")
251
+ users.define_column("self_introduction", "ShortText")
252
+ users.define_column("age", "UInt32")
253
+
254
+ key = "niku"
255
+ niku = users.add(key)
256
+ assert_equal({
257
+ "id" => niku.id,
258
+ "key" => key,
259
+ "self_introduction" => nil,
260
+ "age" => 0,
261
+ },
262
+ niku.attributes)
263
+ users[key] = {
264
+ "self_introduction" => "I'm a meet lover.",
265
+ "age" => 29
266
+ }
267
+ assert_equal({
268
+ "id" => niku.id,
269
+ "key" => key,
270
+ "self_introduction" => "I'm a meet lover.",
271
+ "age" => 29,
272
+ },
273
+ niku.attributes)
274
+ end
275
+
276
+ def test_set_multi_values_for_nonexistent_record
277
+ users = Groonga::Hash.create(:name => "Users",
278
+ :key_type => "ShortText")
279
+ users.define_column("self_introduction", "ShortText")
280
+ users.define_column("age", "UInt32")
281
+
282
+ key = "niku"
283
+ users[key] = {
284
+ "self_introduction" => "I'm a meet lover.",
285
+ "age" => 29
286
+ }
287
+
288
+ assert_equal({
289
+ "id" => users[key].id,
290
+ "key" => key,
291
+ "self_introduction" => "I'm a meet lover.",
292
+ "age" => 29,
293
+ },
294
+ users[key].attributes)
295
+ end
296
+
297
+ def test_set_multi_values_with_nonexistent_column
298
+ users = Groonga::Hash.create(:name => "Users",
299
+ :key_type => "ShortText")
300
+ users.define_column("self_introduction", "ShortText")
301
+ users.define_column("age", "UInt32")
302
+
303
+ key = "niku"
304
+ inspected_users = users.inspect.sub(/size: <0>/, "size: <1>")
305
+ message = "no such column: <\"nonexistent\">: <#{inspected_users}>"
306
+ assert_raise(Groonga::NoSuchColumn.new(message)) do
307
+ users[key] = {
308
+ "nonexistent" => "No!",
309
+ }
310
+ end
311
+ end
213
312
  end