rroonga 1.2.9 → 1.3.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 (76) hide show
  1. data/Gemfile +1 -0
  2. data/Rakefile +1 -0
  3. data/bin/grntest-log-analyze +123 -0
  4. data/bin/groonga-query-log-extract +117 -0
  5. data/ext/groonga/rb-grn-accessor.c +7 -5
  6. data/ext/groonga/rb-grn-array-cursor.c +1 -1
  7. data/ext/groonga/rb-grn-array.c +34 -44
  8. data/ext/groonga/rb-grn-column.c +74 -38
  9. data/ext/groonga/rb-grn-context.c +19 -15
  10. data/ext/groonga/rb-grn-database.c +47 -42
  11. data/ext/groonga/rb-grn-double-array-trie-cursor.c +40 -0
  12. data/ext/groonga/rb-grn-double-array-trie.c +530 -0
  13. data/ext/groonga/rb-grn-encoding-support.c +1 -1
  14. data/ext/groonga/rb-grn-encoding.c +1 -1
  15. data/ext/groonga/rb-grn-exception.c +1 -1
  16. data/ext/groonga/rb-grn-expression-builder.c +1 -1
  17. data/ext/groonga/rb-grn-expression.c +63 -51
  18. data/ext/groonga/rb-grn-fix-size-column.c +7 -7
  19. data/ext/groonga/rb-grn-hash-cursor.c +1 -1
  20. data/ext/groonga/rb-grn-hash.c +42 -39
  21. data/ext/groonga/rb-grn-index-column.c +35 -31
  22. data/ext/groonga/rb-grn-index-cursor.c +1 -1
  23. data/ext/groonga/rb-grn-logger.c +23 -18
  24. data/ext/groonga/rb-grn-object.c +40 -27
  25. data/ext/groonga/rb-grn-operator.c +1 -1
  26. data/ext/groonga/rb-grn-patricia-trie-cursor.c +1 -1
  27. data/ext/groonga/rb-grn-patricia-trie.c +122 -90
  28. data/ext/groonga/rb-grn-plugin.c +8 -7
  29. data/ext/groonga/rb-grn-posting.c +1 -1
  30. data/ext/groonga/rb-grn-procedure.c +1 -1
  31. data/ext/groonga/rb-grn-query.c +12 -12
  32. data/ext/groonga/rb-grn-record.c +1 -1
  33. data/ext/groonga/rb-grn-snippet.c +26 -19
  34. data/ext/groonga/rb-grn-table-cursor-key-support.c +1 -1
  35. data/ext/groonga/rb-grn-table-cursor.c +4 -3
  36. data/ext/groonga/rb-grn-table-key-support.c +23 -23
  37. data/ext/groonga/rb-grn-table.c +268 -153
  38. data/ext/groonga/rb-grn-type.c +11 -7
  39. data/ext/groonga/rb-grn-utils.c +4 -1
  40. data/ext/groonga/rb-grn-variable-size-column.c +1 -1
  41. data/ext/groonga/rb-grn-variable.c +2 -2
  42. data/ext/groonga/rb-grn-view-accessor.c +1 -1
  43. data/ext/groonga/rb-grn-view-cursor.c +1 -1
  44. data/ext/groonga/rb-grn-view-record.c +1 -1
  45. data/ext/groonga/rb-grn-view.c +43 -34
  46. data/ext/groonga/rb-grn.h +6 -2
  47. data/ext/groonga/rb-groonga.c +1 -1
  48. data/lib/groonga.rb +4 -2
  49. data/lib/groonga/context.rb +16 -41
  50. data/lib/groonga/dumper.rb +6 -4
  51. data/lib/groonga/expression-builder.rb +52 -26
  52. data/lib/groonga/grntest-log.rb +206 -0
  53. data/lib/groonga/pagination.rb +21 -19
  54. data/lib/groonga/patricia-trie.rb +7 -10
  55. data/lib/groonga/posting.rb +1 -1
  56. data/lib/groonga/query-log.rb +348 -0
  57. data/lib/groonga/record.rb +47 -143
  58. data/lib/groonga/schema.rb +679 -406
  59. data/lib/groonga/view-record.rb +4 -10
  60. data/rroonga-build.rb +1 -1
  61. data/test/test-array.rb +25 -4
  62. data/test/test-column.rb +8 -8
  63. data/test/test-database.rb +2 -3
  64. data/test/test-double-array-trie.rb +164 -0
  65. data/test/test-expression-builder.rb +2 -2
  66. data/test/test-expression.rb +10 -9
  67. data/test/test-gqtp.rb +2 -2
  68. data/test/test-hash.rb +32 -8
  69. data/test/test-patricia-trie.rb +34 -10
  70. data/test/test-query-log.rb +258 -0
  71. data/test/test-record.rb +6 -5
  72. data/test/test-schema-create-table.rb +8 -0
  73. data/test/test-schema.rb +491 -234
  74. data/test/test-table.rb +17 -24
  75. metadata +123 -100
  76. data/ext/groonga/Makefile +0 -233
@@ -22,26 +22,20 @@ module Groonga
22
22
  # レコードのID
23
23
  attr_reader :id
24
24
 
25
- # _table_の_id_に対応するレコードを作成する。
25
+ # _table_ _id_ に対応するレコードを作成する。
26
26
  def initialize(view, id)
27
27
  @view = view
28
28
  @id = id
29
29
  end
30
30
 
31
- # call-seq:
32
- # record == other -> true/false
33
- #
34
- # _record_と_other_が同じgroongaのレコードなら+true+を返し、
35
- # そうでなければ+false+を返す。
31
+ # _record_ と _other_ が同じgroongaのレコードなら +true+ を返し、
32
+ # そうでなければ +false+ を返す。
36
33
  def ==(other)
37
34
  self.class == other.class and
38
35
  [view, id] == [other.view, other.id]
39
36
  end
40
37
 
41
- # call-seq:
42
- # record[column_name] -> 値
43
- #
44
- # このレコードの_column_name_で指定されたカラムの値を返す。
38
+ # このレコードの _column_name_ で指定されたカラムの値を返す。
45
39
  def [](column_name)
46
40
  @view.column_value(@id, column_name)
47
41
  end
data/rroonga-build.rb CHANGED
@@ -19,7 +19,7 @@ module RroongaBuild
19
19
  module RequiredGroongaVersion
20
20
  MAJOR = 1
21
21
  MINOR = 2
22
- MICRO = 5
22
+ MICRO = 8
23
23
  VERSION = [MAJOR, MINOR, MICRO]
24
24
  end
25
25
 
data/test/test-array.rb CHANGED
@@ -62,9 +62,9 @@ class ArrayTest < Test::Unit::TestCase
62
62
  :source => "Bookmarks.user")
63
63
  morita = users.add(:name => "morita")
64
64
  gunyara_kun = users.add(:name => "gunyara-kun")
65
- groonga = bookmarks.add(:title => "groonga", :user => morita)
66
- google = bookmarks.add(:title => "google", :user => morita)
67
- python = bookmarks.add(:title => "Python", :user => gunyara_kun)
65
+ bookmarks.add(:title => "groonga", :user => morita)
66
+ bookmarks.add(:title => "google", :user => morita)
67
+ bookmarks.add(:title => "Python", :user => gunyara_kun)
68
68
 
69
69
  assert_equal(["groonga", "google"],
70
70
  index.search(morita.id).collect {|record| record.key["title"]})
@@ -86,7 +86,7 @@ class ArrayTest < Test::Unit::TestCase
86
86
 
87
87
  def test_column_value
88
88
  users = Groonga::Array.create(:name => "Users")
89
- name = users.define_column("name", "ShortText")
89
+ users.define_column("name", "ShortText")
90
90
  morita_id = users.add.id
91
91
  users.set_column_value(morita_id, "name", "morita")
92
92
  assert_equal("morita", users.column_value(morita_id, "name"))
@@ -99,4 +99,25 @@ class ArrayTest < Test::Unit::TestCase
99
99
  second_user = users.add
100
100
  assert_predicate(second_user, :added?)
101
101
  end
102
+
103
+ def test_defrag
104
+ users = Groonga::Array.create(:name => "Users")
105
+ users.define_column("name", "ShortText")
106
+ users.define_column("address", "ShortText")
107
+ 1000.times do |i|
108
+ users.add(:name => "user #{i}" * 1000,
109
+ :address => "address #{i}" * 1000)
110
+ end
111
+ assert_equal(7, users.defrag)
112
+ end
113
+
114
+ def test_rename
115
+ users = Groonga::Array.create(:name => "Users")
116
+ name = users.define_column("name", "ShortText")
117
+ address = users.define_column("address", "ShortText")
118
+
119
+ users.rename("People")
120
+ assert_equal(["People", "People.name", "People.address"],
121
+ [users.name, name.name, address.name])
122
+ end
102
123
  end
data/test/test-column.rb CHANGED
@@ -254,7 +254,7 @@ class ColumnTest < Test::Unit::TestCase
254
254
 
255
255
  def test_set_time
256
256
  posts = Groonga::Hash.create(:name => "Posts", :key_type => "ShortText")
257
- body = posts.define_column("issued", "Time")
257
+ posts.define_column("issued", "Time")
258
258
 
259
259
  post = posts.add("hello", :issued => 123456)
260
260
  assert_equal(Time.at(123456), post[".issued"])
@@ -266,7 +266,7 @@ class ColumnTest < Test::Unit::TestCase
266
266
 
267
267
  def test_set_nil_to_time
268
268
  posts = Groonga::Hash.create(:name => "Posts", :key_type => "ShortText")
269
- body = posts.define_column("issued", "Time")
269
+ posts.define_column("issued", "Time")
270
270
 
271
271
  post = posts.add("hello", :issued => nil)
272
272
  assert_equal(Time.at(0), post["issued"])
@@ -274,7 +274,7 @@ class ColumnTest < Test::Unit::TestCase
274
274
 
275
275
  def test_bool
276
276
  posts = Groonga::Hash.create(:name => "Posts", :key_type => "ShortText")
277
- hidden = posts.define_column("hidden", "Bool")
277
+ posts.define_column("hidden", "Bool")
278
278
 
279
279
  post = posts.add("hello")
280
280
  assert_false(post["hidden"])
@@ -340,11 +340,11 @@ class ColumnTest < Test::Unit::TestCase
340
340
  :key_type => "ShortText",
341
341
  :key_normalize => true)
342
342
  index.default_tokenizer = "TokenBigram"
343
- body_index = index.define_index_column("body_index", @posts,
344
- :with_position => true,
345
- :source => @body)
343
+ index.define_index_column("body_index", @posts,
344
+ :with_position => true,
345
+ :source => @body)
346
346
 
347
- first_post = @posts.add("Hello!", :body => "World")
348
- hobby = @posts.add("My Hobby", :body => "Drive and Eat")
347
+ @posts.add("Hello!", :body => "World")
348
+ @posts.add("My Hobby", :body => "Drive and Eat")
349
349
  end
350
350
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2011 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
@@ -68,8 +68,7 @@ class DatabaseTest < Test::Unit::TestCase
68
68
  Groonga::Database.new(db_path.to_s)
69
69
  end
70
70
 
71
- database = Groonga::Database.create(:path => db_path.to_s)
72
-
71
+ Groonga::Database.create(:path => db_path.to_s)
73
72
  assert_not_predicate(Groonga::Database.new(db_path.to_s), :closed?)
74
73
  end
75
74
 
@@ -0,0 +1,164 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2011 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 DoubleArrayTrieTest < Test::Unit::TestCase
19
+ include GroongaTestUtils
20
+ include ERB::Util
21
+
22
+ setup :setup_database
23
+
24
+ def test_support_key?
25
+ assert_predicate(Groonga::DoubleArrayTrie.create(:name => "Users",
26
+ :key_type => "ShortText"),
27
+ :support_key?)
28
+ end
29
+
30
+ def test_encoding
31
+ assert_equal(Groonga::Encoding.default,
32
+ Groonga::DoubleArrayTrie.create.encoding)
33
+ end
34
+
35
+ def test_tokenizer
36
+ trie = Groonga::DoubleArrayTrie.create
37
+ assert_nil(trie.default_tokenizer)
38
+ trie.default_tokenizer = "TokenTrigram"
39
+ assert_equal(Groonga::Context.default["TokenTrigram"],
40
+ trie.default_tokenizer)
41
+ end
42
+
43
+ def test_search
44
+ users = Groonga::Array.create(:name => "Users")
45
+ users.define_column("name", "ShortText")
46
+
47
+ bookmarks = Groonga::DoubleArrayTrie.create(:name => "Bookmarks",
48
+ :key_type => "ShortText")
49
+ bookmarks.define_column("user_id", users)
50
+
51
+ daijiro = users.add
52
+ daijiro["name"] = "daijiro"
53
+ gunyarakun = users.add
54
+ gunyarakun["name"] = "gunyarakun"
55
+
56
+ groonga = bookmarks.add("http://groonga.org/")
57
+ groonga["user_id"] = daijiro
58
+
59
+ records = bookmarks.search("http://groonga.org/")
60
+ assert_equal(["daijiro"],
61
+ records.records.collect {|record| record[".user_id.name"]})
62
+ end
63
+
64
+ def test_add
65
+ users = Groonga::DoubleArrayTrie.create(:name => "Users")
66
+ users.define_column("address", "Text")
67
+ me = users.add("me", :address => "me@example.com")
68
+ assert_equal("me@example.com", me[:address])
69
+ end
70
+
71
+ def test_default_tokenizer_on_create
72
+ terms = Groonga::DoubleArrayTrie.create(:name => "Terms",
73
+ :default_tokenizer => "TokenUnigram")
74
+ assert_equal(context[Groonga::Type::UNIGRAM],
75
+ terms.default_tokenizer)
76
+ end
77
+
78
+ def test_duplicated_name
79
+ Groonga::DoubleArrayTrie.create(:name => "Users")
80
+ assert_raise(Groonga::InvalidArgument) do
81
+ Groonga::DoubleArrayTrie.create(:name => "Users")
82
+ end
83
+ end
84
+
85
+ def test_has_key?
86
+ users = Groonga::DoubleArrayTrie.create(:name => "Users")
87
+ assert_false(users.has_key?("morita"))
88
+ users.add("morita")
89
+ assert_true(users.has_key?("morita"))
90
+ end
91
+
92
+ def test_prefix_cursor
93
+ paths = Groonga::DoubleArrayTrie.create(:name => "Paths",
94
+ :key_type => 'ShortText')
95
+ paths.add('/')
96
+ paths.add('/tmp')
97
+ paths.add('/usr/bin')
98
+ paths.add('/usr/local/bin')
99
+
100
+ assert_prefix_cursor(["/usr/local/bin", "/usr/bin", "/tmp", "/"],
101
+ paths, "/", {:order => :desc})
102
+ assert_prefix_cursor(["/", "/tmp", "/usr/bin", "/usr/local/bin"],
103
+ paths, "/")
104
+ assert_prefix_cursor(["/usr/local/bin", "/usr/bin"],
105
+ paths, "/usr/local",
106
+ {:key_bytes => "/usr".size, :order => :desc})
107
+ assert_prefix_cursor(["/tmp", "/usr/bin"],
108
+ paths, "/",
109
+ {:offset => 1, :limit => 2})
110
+ end
111
+
112
+ def assert_prefix_cursor(expected, tables, prefix, options={})
113
+ actual = []
114
+ tables.open_prefix_cursor(prefix, options) do |cursor|
115
+ cursor.each do |record|
116
+ actual << record.key
117
+ end
118
+ end
119
+ assert_equal(expected, actual)
120
+ end
121
+
122
+ def test_add_uint_key
123
+ numbers = Groonga::DoubleArrayTrie.create(:name => "Numbers",
124
+ :key_type => "UInt32")
125
+ numbers.add(1)
126
+ numbers.add(2)
127
+ numbers.add(5)
128
+ numbers.add(7)
129
+ assert_equal([1, 2, 5, 7], numbers.collect {|number| number.key})
130
+ end
131
+
132
+ def test_added?
133
+ users = Groonga::DoubleArrayTrie.create(:name => "Users",
134
+ :key_type => "ShortText")
135
+ bob = users.add("bob")
136
+ assert_predicate(bob, :added?)
137
+ bob_again = users.add("bob")
138
+ assert_not_predicate(bob_again, :added?)
139
+ end
140
+
141
+ def test_defrag
142
+ users = Groonga::DoubleArrayTrie.create(:name => "Users",
143
+ :key_type => "ShortText")
144
+ users.define_column("name", "ShortText")
145
+ users.define_column("address", "ShortText")
146
+ 1000.times do |i|
147
+ users.add("user #{i}",
148
+ :name => "user #{i}" * 1000,
149
+ :address => "address #{i}" * 1000)
150
+ end
151
+ assert_equal(7, users.defrag)
152
+ end
153
+
154
+ def test_rename
155
+ users = Groonga::DoubleArrayTrie.create(:name => "Users",
156
+ :key_type => "ShortText")
157
+ name = users.define_column("name", "ShortText")
158
+ address = users.define_column("address", "ShortText")
159
+
160
+ users.rename("People")
161
+ assert_equal(["People", "People.name", "People.address"],
162
+ [users.name, name.name, address.name])
163
+ end
164
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2011 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
@@ -75,7 +75,7 @@ class ExpressionBuilderTest < Test::Unit::TestCase
75
75
  end
76
76
 
77
77
  def test_not_equal
78
- omit("not supported yet!!!")
78
+ only_ruby19
79
79
  result = @users.select do |record|
80
80
  record["name"] != "mori daijiro"
81
81
  end
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
3
4
  #
4
5
  # This library is free software; you can redistribute it and/or
5
6
  # modify it under the terms of the GNU Lesser General Public
@@ -81,10 +82,10 @@ class ExpressionTest < Test::Unit::TestCase
81
82
 
82
83
  def test_snippet
83
84
  users = Groonga::Array.create(:name => "Users")
84
- name = users.define_column("name", "ShortText")
85
- terms = Groonga::Hash.create(:name => "Terms",
86
- :key_type => "ShortText",
87
- :default_tokenizer => "TokenBigram")
85
+ users.define_column("name", "ShortText")
86
+ Groonga::Hash.create(:name => "Terms",
87
+ :key_type => "ShortText",
88
+ :default_tokenizer => "TokenBigram")
88
89
  users.define_index_column("user_name", users,
89
90
  :source => "Users.name",
90
91
  :with_position => true)
@@ -111,10 +112,10 @@ class ExpressionTest < Test::Unit::TestCase
111
112
 
112
113
  def test_snippet_without_tags
113
114
  users = Groonga::Array.create(:name => "Users")
114
- name = users.define_column("name", "ShortText")
115
- terms = Groonga::Hash.create(:name => "Terms",
116
- :key_type => "ShortText",
117
- :default_tokenizer => "TokenBigram")
115
+ users.define_column("name", "ShortText")
116
+ Groonga::Hash.create(:name => "Terms",
117
+ :key_type => "ShortText",
118
+ :default_tokenizer => "TokenBigram")
118
119
  users.define_index_column("user_name", users,
119
120
  :source => "Users.name",
120
121
  :with_position => true)
data/test/test-gqtp.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2010 Kouhei Sutou <kou@clear-code.com>
3
+ # Copyright (C) 2010-2011 Kouhei Sutou <kou@clear-code.com>
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -64,7 +64,7 @@ class GQTPTest < Test::Unit::TestCase
64
64
  private
65
65
  def process(gqtp)
66
66
  context.send(gqtp)
67
- id, result = context.receive
67
+ _, result = context.receive
68
68
  JSON.parse(result)
69
69
  end
70
70
  end
data/test/test-hash.rb CHANGED
@@ -31,7 +31,7 @@ class HashTest < Test::Unit::TestCase
31
31
  bookmarks = Groonga::Hash.create(:name => "Bookmarks",
32
32
  :path => bookmarks_path.to_s)
33
33
 
34
- groonga = bookmarks.add("groonga")
34
+ bookmarks.add("groonga")
35
35
  google = bookmarks.add("Google")
36
36
  cutter = bookmarks.add("Cutter")
37
37
 
@@ -62,7 +62,7 @@ class HashTest < Test::Unit::TestCase
62
62
  bookmarks = Groonga::Hash.create(:name => "Bookmarks",
63
63
  :path => bookmarks_path.to_s,
64
64
  :key_type => "ShortText")
65
- uri = bookmarks.define_column("uri", "ShortText")
65
+ bookmarks.define_column("uri", "ShortText")
66
66
  bookmarks.set_column_value("google", "uri", "http://google.com/")
67
67
  assert_equal("http://google.com/", bookmarks.column_value("google", "uri"))
68
68
  end
@@ -149,11 +149,11 @@ class HashTest < Test::Unit::TestCase
149
149
 
150
150
  def test_search
151
151
  users = Groonga::Array.create(:name => "Users")
152
- user_name = users.define_column("name", "ShortText")
152
+ users.define_column("name", "ShortText")
153
153
 
154
154
  bookmarks = Groonga::Hash.create(:name => "Bookmarks",
155
155
  :key_type => "ShortText")
156
- bookmark_user_id = bookmarks.define_column("user_id", users)
156
+ bookmarks.define_column("user_id", users)
157
157
 
158
158
  daijiro = users.add
159
159
  daijiro["name"] = "daijiro"
@@ -165,7 +165,7 @@ class HashTest < Test::Unit::TestCase
165
165
 
166
166
  records = bookmarks.search("http://groonga.org/")
167
167
  assert_equal(["daijiro"],
168
- records.records.collect {|record| record[".user_id.name"]})
168
+ records.records.collect {|record| record["user_id.name"]})
169
169
  end
170
170
 
171
171
  def test_add
@@ -196,9 +196,9 @@ class HashTest < Test::Unit::TestCase
196
196
  :default_tokenizer => "TokenBigram")
197
197
  index = terms.define_index_column("comment", bookmarks,
198
198
  :source => "Bookmarks.comment")
199
- groonga = bookmarks.add("groonga", :comment => "search engine by Brazil")
200
- google = bookmarks.add("google", :comment => "search engine by Google")
201
- ruby = bookmarks.add("ruby", :comment => "programing language")
199
+ bookmarks.add("groonga", :comment => "search engine by Brazil")
200
+ bookmarks.add("google", :comment => "search engine by Google")
201
+ bookmarks.add("ruby", :comment => "programing language")
202
202
 
203
203
  assert_equal(["groonga", "google"],
204
204
  index.search("engine").collect {|record| record.key.key})
@@ -317,4 +317,28 @@ class HashTest < Test::Unit::TestCase
317
317
  bob_again = users.add("bob")
318
318
  assert_not_predicate(bob_again, :added?)
319
319
  end
320
+
321
+ def test_defrag
322
+ users = Groonga::Hash.create(:name => "Users",
323
+ :key_type => "ShortText")
324
+ users.define_column("name", "ShortText")
325
+ users.define_column("address", "ShortText")
326
+ 1000.times do |i|
327
+ users.add("user #{i}",
328
+ :name => "user #{i}" * 1000,
329
+ :address => "address #{i}" * 1000)
330
+ end
331
+ assert_equal(7, users.defrag)
332
+ end
333
+
334
+ def test_rename
335
+ users = Groonga::Hash.create(:name => "Users",
336
+ :key_type => "ShortText")
337
+ name = users.define_column("name", "ShortText")
338
+ address = users.define_column("address", "ShortText")
339
+
340
+ users.rename("People")
341
+ assert_equal(["People", "People.name", "People.address"],
342
+ [users.name, name.name, address.name])
343
+ end
320
344
  end