rroonga 2.0.8 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/README.textile +2 -2
  2. data/bin/groonga-index-dump +47 -0
  3. data/doc/text/news.textile +733 -0
  4. data/doc/text/tutorial.textile +535 -0
  5. data/example/bookmark.rb +1 -1
  6. data/ext/groonga/rb-grn-database.c +21 -24
  7. data/ext/groonga/rb-grn-double-array-trie.c +50 -58
  8. data/ext/groonga/rb-grn-exception.c +18 -1
  9. data/ext/groonga/rb-grn-hash.c +18 -3
  10. data/ext/groonga/rb-grn-index-column.c +50 -2
  11. data/ext/groonga/rb-grn-normalizer.c +83 -0
  12. data/ext/groonga/rb-grn-object.c +18 -14
  13. data/ext/groonga/rb-grn-patricia-trie.c +17 -2
  14. data/ext/groonga/rb-grn-query-logger.c +263 -0
  15. data/ext/groonga/rb-grn-snippet.c +6 -0
  16. data/ext/groonga/rb-grn-table-key-support.c +204 -13
  17. data/ext/groonga/rb-grn-table.c +124 -46
  18. data/ext/groonga/rb-grn.h +14 -3
  19. data/ext/groonga/rb-groonga.c +2 -0
  20. data/lib/groonga/database.rb +7 -0
  21. data/lib/groonga/dumper.rb +21 -2
  22. data/lib/groonga/index-column.rb +170 -0
  23. data/lib/groonga/query-logger.rb +129 -0
  24. data/lib/groonga/record.rb +32 -8
  25. data/lib/groonga/schema.rb +231 -288
  26. data/lib/groonga.rb +2 -1
  27. data/rroonga-build.rb +2 -2
  28. data/rroonga.gemspec +11 -7
  29. data/test/groonga-test-utils.rb +18 -6
  30. data/test/test-hash.rb +49 -20
  31. data/test/test-index-cursor.rb +4 -4
  32. data/{Gemfile → test/test-normalizer.rb} +9 -5
  33. data/test/test-pagination.rb +1 -1
  34. data/test/test-patricia-trie.rb +8 -0
  35. data/test/test-schema.rb +16 -13
  36. data/test/test-snippet.rb +5 -0
  37. data/test/test-table.rb +24 -12
  38. data/test/test-view.rb +0 -1
  39. metadata +154 -136
  40. data/AUTHORS +0 -5
  41. data/Rakefile +0 -203
  42. data/bin/groonga-query-log-extract +0 -117
data/rroonga-build.rb CHANGED
@@ -18,8 +18,8 @@
18
18
  module RroongaBuild
19
19
  module RequiredGroongaVersion
20
20
  MAJOR = 2
21
- MINOR = 0
22
- MICRO = 9
21
+ MINOR = 1
22
+ MICRO = 0
23
23
  VERSION = [MAJOR, MINOR, MICRO]
24
24
  end
25
25
 
data/rroonga.gemspec CHANGED
@@ -15,6 +15,8 @@
15
15
  # License along with this library; if not, write to the Free Software
16
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
 
18
+ require "English"
19
+
18
20
  base_dir = File.dirname(__FILE__)
19
21
  ext_dir = File.join(base_dir, "ext", "groonga")
20
22
 
@@ -40,13 +42,15 @@ Gem::Specification.new do |s|
40
42
  s.version = guess_version.call(ext_dir)
41
43
 
42
44
  authors_path = File.join(base_dir, "AUTHORS")
43
- authors, emails = File.readlines(authors_path).collect do |line|
45
+ authors = []
46
+ emails = []
47
+ File.readlines(authors_path).each do |line|
44
48
  if /\s*<([^<>]*)>$/ =~ line
45
- [$PREMATCH, $1]
46
- else
47
- nil
49
+ authors << $PREMATCH
50
+ emails << $1
48
51
  end
49
- end.compact
52
+ end
53
+
50
54
  s.authors = authors
51
55
  s.email = emails
52
56
 
@@ -56,6 +60,7 @@ Gem::Specification.new do |s|
56
60
  s.summary, s.description, = description.split(/\n\n+/, 3)
57
61
 
58
62
  s.files = ["README.textile", "AUTHORS", "Rakefile", "Gemfile"]
63
+ s.files = Dir.glob("doc/text/*.textile")
59
64
  s.files += ["#{s.name}.gemspec"]
60
65
  s.files += ["rroonga-build.rb", "extconf.rb"]
61
66
  Dir.chdir(base_dir) do
@@ -83,8 +88,7 @@ Gem::Specification.new do |s|
83
88
  s.add_development_dependency("rake-compiler")
84
89
  s.add_development_dependency("bundler")
85
90
  s.add_development_dependency("yard")
86
- # Use packnga 0.9.4 to release 2.0.5 only.
87
- s.add_development_dependency("packnga", ["= 0.9.4"])
91
+ s.add_development_dependency("packnga")
88
92
  s.add_development_dependency("RedCloth")
89
93
  end
90
94
 
@@ -40,6 +40,8 @@ module GroongaTestUtils
40
40
 
41
41
  setup_encoding
42
42
  setup_context
43
+
44
+ @database = nil
43
45
  end
44
46
 
45
47
  def setup_tmp_directory
@@ -60,8 +62,12 @@ module GroongaTestUtils
60
62
 
61
63
  def setup_log_path
62
64
  @dump_log = false
65
+
63
66
  Groonga::Logger.log_path = (@tmp_dir + "groonga.log").to_s
64
- Groonga::Logger.query_log_path = (@tmp_dir + "groonga-query.log").to_s
67
+
68
+ @query_log_path = @tmp_dir + "groonga-query.log"
69
+ query_logger = Groonga::FileQueryLogger.new(@query_log_path.to_s)
70
+ Groonga::QueryLogger.register(query_logger, :all => true)
65
71
  end
66
72
 
67
73
  def setup_tables_directory
@@ -102,8 +108,15 @@ module GroongaTestUtils
102
108
  @database = Groonga::Database.create(:path => @database_path.to_s)
103
109
  end
104
110
 
105
- def teardown_sandbox
111
+ def teardown_database
112
+ return if @database.nil?
113
+
114
+ @database.close
106
115
  @database = nil
116
+ end
117
+
118
+ def teardown_sandbox
119
+ teardown_database
107
120
  Groonga::Context.default.close
108
121
  Groonga::Context.default = nil
109
122
  GC.start
@@ -114,17 +127,16 @@ module GroongaTestUtils
114
127
  def teardown_log_path
115
128
  return unless @dump_log
116
129
  log_path = Groonga::Logger.log_path
117
- query_log_path = Groonga::Logger.query_log_path
118
130
  if File.exist?(log_path)
119
131
  header = "--- log: #{log_path} ---"
120
132
  puts(header)
121
133
  puts(File.read(log_path))
122
134
  puts("-" * header.length)
123
135
  end
124
- if File.exist?(query_log_path)
125
- header = "--- query log: #{query_log_path} ---"
136
+ if @query_log_path.exist?
137
+ header = "--- query log: #{@query_log_path} ---"
126
138
  puts(header)
127
- puts(File.read(query_log_path))
139
+ puts(@query_log_path.read)
128
140
  puts("-" * header.length)
129
141
  end
130
142
  end
data/test/test-hash.rb CHANGED
@@ -26,25 +26,38 @@ class HashTest < Test::Unit::TestCase
26
26
  :support_key?)
27
27
  end
28
28
 
29
- def test_delete
30
- bookmarks_path = @tables_dir + "bookmarks"
31
- bookmarks = Groonga::Hash.create(:name => "Bookmarks",
32
- :path => bookmarks_path.to_s)
33
-
34
- bookmarks.add("groonga")
35
- google = bookmarks.add("Google")
36
- cutter = bookmarks.add("Cutter")
29
+ class DeleteTest < self
30
+ setup
31
+ def setup_data
32
+ bookmarks_path = @tables_dir + "bookmarks"
33
+ @bookmarks = Groonga::Hash.create(:name => "Bookmarks",
34
+ :key_type => "ShortText",
35
+ :path => bookmarks_path.to_s)
36
+
37
+ @groonga = @bookmarks.add("groonga")
38
+ @google = @bookmarks.add("Google")
39
+ @cutter = @bookmarks.add("Cutter")
40
+ end
37
41
 
38
- assert_equal(["groonga", "Google", "Cutter"],
39
- bookmarks.collect {|bookmark| bookmark.key})
42
+ def test_id
43
+ @bookmarks.delete(@google.id)
44
+ assert_equal(["groonga", "Cutter"],
45
+ @bookmarks.collect {|bookmark| bookmark.key})
46
+ end
40
47
 
41
- bookmarks.delete(google.id)
42
- assert_equal(["groonga", "Cutter"],
43
- bookmarks.collect {|bookmark| bookmark.key})
48
+ def test_key
49
+ @bookmarks.delete(@cutter.key)
50
+ assert_equal(["groonga", "Google"],
51
+ @bookmarks.collect {|bookmark| bookmark.key})
52
+ end
44
53
 
45
- bookmarks.delete(cutter.key)
46
- assert_equal(["groonga"],
47
- bookmarks.collect {|bookmark| bookmark.key})
54
+ def test_expression
55
+ @bookmarks.delete do |record|
56
+ record.key == @groonga.key
57
+ end
58
+ assert_equal(["Google", "Cutter"],
59
+ @bookmarks.collect {|bookmark| bookmark.key})
60
+ end
48
61
  end
49
62
 
50
63
  def test_value
@@ -86,8 +99,10 @@ class HashTest < Test::Unit::TestCase
86
99
  "domain: <ShortText>, " +
87
100
  "range: (nil), " +
88
101
  "flags: <>, " +
102
+ "size: <0>, " +
89
103
  "encoding: <#{encoding.inspect}>, " +
90
- "size: <0>>",
104
+ "default_tokenizer: (nil), " +
105
+ "normalizer: (nil)>",
91
106
  anonymous_table.inspect)
92
107
  end
93
108
 
@@ -100,8 +115,10 @@ class HashTest < Test::Unit::TestCase
100
115
  "domain: <ShortText>, " +
101
116
  "range: (nil), " +
102
117
  "flags: <>, " +
118
+ "size: <0>, " +
103
119
  "encoding: <#{encoding.inspect}>, " +
104
- "size: <0>>",
120
+ "default_tokenizer: (nil), " +
121
+ "normalizer: (nil)>",
105
122
  anonymous_table.inspect)
106
123
  end
107
124
 
@@ -115,8 +132,10 @@ class HashTest < Test::Unit::TestCase
115
132
  "domain: <ShortText>, " +
116
133
  "range: (nil), " +
117
134
  "flags: <>, " +
135
+ "size: <0>, " +
118
136
  "encoding: <#{encoding.inspect}>, " +
119
- "size: <0>>",
137
+ "default_tokenizer: (nil), " +
138
+ "normalizer: (nil)>",
120
139
  named_table.inspect)
121
140
  end
122
141
 
@@ -129,8 +148,10 @@ class HashTest < Test::Unit::TestCase
129
148
  "domain: <ShortText>, " +
130
149
  "range: (nil), " +
131
150
  "flags: <>, " +
151
+ "size: <0>, " +
132
152
  "encoding: <#{encoding.inspect}>, " +
133
- "size: <0>>",
153
+ "default_tokenizer: (nil), " +
154
+ "normalizer: (nil)>",
134
155
  named_table.inspect)
135
156
  end
136
157
 
@@ -147,6 +168,14 @@ class HashTest < Test::Unit::TestCase
147
168
  hash.default_tokenizer)
148
169
  end
149
170
 
171
+ def test_normalizer
172
+ hash = Groonga::Hash.create
173
+ assert_nil(hash.normalizer)
174
+ hash.normalizer = "NormalizerAuto"
175
+ assert_equal(Groonga["NormalizerAuto"],
176
+ hash.normalizer)
177
+ end
178
+
150
179
  def test_search
151
180
  users = Groonga::Array.create(:name => "Users")
152
181
  users.define_column("name", "ShortText")
@@ -134,10 +134,10 @@ class IndexCursorTest < Test::Unit::TestCase
134
134
  :term_frequency, :weight, :n_rest_postings]
135
135
 
136
136
  expected = [
137
- [1, 1, 1, 0, 1, 0, 1],
138
- [2, 1, 1, 0, 1, 0, 1],
139
- [2, 1, 2, 0, 1, 0, 1],
140
- [3, 1, 2, 0, 1, 0, 1],
137
+ [1, 1, 1, 0, 1, 0, 0],
138
+ [2, 1, 1, 1, 1, 0, 0],
139
+ [2, 1, 2, 0, 1, 0, 0],
140
+ [3, 1, 2, 2, 1, 0, 0],
141
141
  [3, 1, 3, 0, 1, 0, 0],
142
142
  [3, 1, 4, 1, 1, 0, 0],
143
143
  [3, 1, 5, 3, 1, 0, 0],
@@ -1,6 +1,4 @@
1
- # -*- mode: ruby; coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
4
2
  #
5
3
  # This library is free software; you can redistribute it and/or
6
4
  # modify it under the terms of the GNU Lesser General Public
@@ -15,6 +13,12 @@
15
13
  # License along with this library; if not, write to the Free Software
16
14
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
15
 
18
- source "http://rubygems.org/"
16
+ class NormalizerTest < Test::Unit::TestCase
17
+ include GroongaTestUtils
18
+
19
+ setup :setup_database
19
20
 
20
- gemspec
21
+ def test_normalize
22
+ assert_equal("abc", Groonga::Normalizer.normalize("AbC"))
23
+ end
24
+ end
@@ -244,6 +244,6 @@ class PaginationTest < Test::Unit::TestCase
244
244
  :first_page? => users.first_page?,
245
245
  :last_page? => users.last_page?,
246
246
  :have_pages? => users.have_pages?,
247
- :keys => users.collect(&:key))
247
+ :keys => users.collect {|record| record.value.key})
248
248
  end
249
249
  end
@@ -40,6 +40,14 @@ class PatriciaTrieTest < Test::Unit::TestCase
40
40
  trie.default_tokenizer)
41
41
  end
42
42
 
43
+ def test_normalizer
44
+ trie = Groonga::PatriciaTrie.create
45
+ assert_nil(trie.normalizer)
46
+ trie.normalizer = "NormalizerAuto"
47
+ assert_equal(Groonga["NormalizerAuto"],
48
+ trie.normalizer)
49
+ end
50
+
43
51
  def test_search
44
52
  users = Groonga::Array.create(:name => "Users")
45
53
  users.define_column("name", "ShortText")
data/test/test-schema.rb CHANGED
@@ -108,10 +108,11 @@ class SchemaTest < Test::Unit::TestCase
108
108
  "domain: <Int32>, " +
109
109
  "range: <UInt32>, " +
110
110
  "flags: <>, " +
111
+ "size: <0>, " +
111
112
  "encoding: <#{Groonga::Encoding.default.inspect}>, " +
112
- "size: <0>>",
113
+ "default_tokenizer: <#{tokenizer.name}>, " +
114
+ "normalizer: (nil)>",
113
115
  table.inspect)
114
- assert_equal(tokenizer, table.default_tokenizer)
115
116
  end
116
117
 
117
118
  def test_rename
@@ -154,9 +155,9 @@ class SchemaTest < Test::Unit::TestCase
154
155
  :path => path.to_s,
155
156
  :value_type => "Float",
156
157
  :default_tokenizer => "TokenBigram",
157
- :key_normalize => true,
158
158
  :key_with_sis => true,
159
- :named_path => true) do |table|
159
+ :named_path => true,
160
+ :normalizer => "NormalizerAuto") do |table|
160
161
  end
161
162
  table = context["Posts"]
162
163
  assert_equal("#<Groonga::PatriciaTrie " +
@@ -165,11 +166,12 @@ class SchemaTest < Test::Unit::TestCase
165
166
  "path: <#{path}>, " +
166
167
  "domain: <Int32>, " +
167
168
  "range: <Float>, " +
168
- "flags: <KEY_WITH_SIS|KEY_NORMALIZE|WITH_SECTION>, " +
169
+ "flags: <KEY_WITH_SIS>, " +
170
+ "size: <0>, " +
169
171
  "encoding: <#{Groonga::Encoding.default.inspect}>, " +
170
- "size: <0>>",
172
+ "default_tokenizer: <TokenBigram>, " +
173
+ "normalizer: <NormalizerAuto>>",
171
174
  table.inspect)
172
- assert_equal(context["TokenBigram"], table.default_tokenizer)
173
175
  end
174
176
 
175
177
  def test_rename
@@ -206,15 +208,15 @@ class SchemaTest < Test::Unit::TestCase
206
208
  end
207
209
 
208
210
  def test_full_option
209
- path = @tmp_dir + "patricia-trie.groonga"
211
+ path = @tmp_dir + "double-array-trie.groonga"
210
212
  Groonga::Schema.create_table("Posts",
211
213
  :type => :double_array_trie,
212
214
  :key_type => "integer",
213
215
  :path => path.to_s,
214
216
  :value_type => "Float",
215
217
  :default_tokenizer => "TokenBigram",
216
- :key_normalize => true,
217
- :named_path => true) do |table|
218
+ :named_path => true,
219
+ :normalizer => "NormalizerAuto") do |table|
218
220
  end
219
221
  table = context["Posts"]
220
222
  assert_equal("#<Groonga::DoubleArrayTrie " +
@@ -223,11 +225,12 @@ class SchemaTest < Test::Unit::TestCase
223
225
  "path: <#{path}>, " +
224
226
  "domain: <Int32>, " +
225
227
  "range: <Float>, " +
226
- "flags: <KEY_NORMALIZE|WITH_SECTION>, " +
228
+ "flags: <>, " +
229
+ "size: <0>, " +
227
230
  "encoding: <#{Groonga::Encoding.default.inspect}>, " +
228
- "size: <0>>",
231
+ "default_tokenizer: <TokenBigram>, " +
232
+ "normalizer: <NormalizerAuto>>",
229
233
  table.inspect)
230
- assert_equal(context["TokenBigram"], table.default_tokenizer)
231
234
  end
232
235
 
233
236
  def test_rename
data/test/test-snippet.rb CHANGED
@@ -18,6 +18,11 @@
18
18
  class SnippetTest < Test::Unit::TestCase
19
19
  include GroongaTestUtils
20
20
 
21
+ setup
22
+ def setup_database
23
+ @database = Groonga::Database.create
24
+ end
25
+
21
26
  def setup_encoding
22
27
  Groonga::Encoding.default = :utf8
23
28
  end
data/test/test-table.rb CHANGED
@@ -277,19 +277,30 @@ class TableTest < Test::Unit::TestCase
277
277
  bookmark["created_at"].to_a)
278
278
  end
279
279
 
280
- def test_delete
281
- bookmarks_path = @tables_dir + "bookmarks"
282
- bookmarks = Groonga::Array.create(:name => "Bookmarks",
283
- :path => bookmarks_path.to_s)
280
+ class DeleteTest < self
281
+ setup
282
+ def setup_data
283
+ bookmarks_path = @tables_dir + "bookmarks"
284
+ @bookmarks = Groonga::Array.create(:name => "Bookmarks",
285
+ :path => bookmarks_path.to_s)
286
+
287
+ @bookmark_records = []
288
+ @bookmark_records << @bookmarks.add
289
+ @bookmark_records << @bookmarks.add
290
+ @bookmark_records << @bookmarks.add
291
+ end
284
292
 
285
- bookmark_records = []
286
- bookmark_records << bookmarks.add
287
- bookmark_records << bookmarks.add
288
- bookmark_records << bookmarks.add
293
+ def test_id
294
+ @bookmarks.delete(@bookmark_records.last.id)
295
+ assert_equal([1, 2], @bookmarks.collect(&:id))
296
+ end
289
297
 
290
- assert_equal(3, bookmarks.size)
291
- bookmarks.delete(bookmark_records[1].id)
292
- assert_equal(2, bookmarks.size)
298
+ def test_expression
299
+ @bookmarks.delete do |record|
300
+ record.id < 3
301
+ end
302
+ assert_equal([3], @bookmarks.collect(&:id))
303
+ end
293
304
  end
294
305
 
295
306
  def test_remove
@@ -407,8 +418,9 @@ class TableTest < Test::Unit::TestCase
407
418
  empty1 = bookmarks.add
408
419
  groonga = bookmarks.add(:uri => "http://groonga.org/")
409
420
  empty2 = bookmarks.add
421
+ sorted_bookmarks = bookmarks.sort([{:key => "uri", :order => :descending}])
410
422
  assert_equal([groonga, empty1, empty2],
411
- bookmarks.sort([{:key => "uri", :order => :descending}]))
423
+ sorted_bookmarks.collect(&:value))
412
424
  end
413
425
 
414
426
  def test_group
data/test/test-view.rb CHANGED
@@ -28,7 +28,6 @@ class ViewTest < Test::Unit::TestCase
28
28
  "domain: (nil), " +
29
29
  "range: (nil), " +
30
30
  "flags: <>, " +
31
- "encoding: <:default>, " +
32
31
  "size: <0>>",
33
32
  view.inspect)
34
33
  end