rroonga 4.0.5 → 4.0.6

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/benchmark/common.rb +4 -4
  4. data/benchmark/create-wikipedia-database.rb +5 -5
  5. data/benchmark/read-write-many-small-items.rb +8 -8
  6. data/benchmark/repeat-load.rb +4 -4
  7. data/benchmark/select.rb +9 -9
  8. data/benchmark/write-many-small-items.rb +8 -8
  9. data/doc/images/sample-schema.png +0 -0
  10. data/doc/text/install.textile +2 -2
  11. data/doc/text/news.textile +41 -0
  12. data/doc/text/tutorial.textile +4 -4
  13. data/example/bookmark.rb +6 -7
  14. data/example/index-html.rb +6 -6
  15. data/ext/groonga/extconf.rb +23 -1
  16. data/ext/groonga/rb-grn-column.c +3 -2
  17. data/ext/groonga/rb-grn-context.c +20 -3
  18. data/ext/groonga/rb-grn-double-array-trie.c +11 -2
  19. data/ext/groonga/rb-grn-exception.c +28 -10
  20. data/ext/groonga/rb-grn-expression.c +78 -0
  21. data/ext/groonga/rb-grn-hash.c +10 -0
  22. data/ext/groonga/rb-grn-logger.c +7 -3
  23. data/ext/groonga/rb-grn-object.c +3 -2
  24. data/ext/groonga/rb-grn-patricia-trie.c +23 -20
  25. data/ext/groonga/rb-grn-table-key-support.c +92 -1
  26. data/ext/groonga/rb-grn-table.c +60 -17
  27. data/ext/groonga/rb-grn-utils.c +51 -2
  28. data/ext/groonga/rb-grn-variable-size-column.c +11 -7
  29. data/ext/groonga/rb-grn.h +11 -1
  30. data/lib/groonga/dumper.rb +23 -1
  31. data/lib/groonga/patricia-trie.rb +1 -1
  32. data/lib/groonga/schema.rb +190 -205
  33. data/misc/grnop2ruby.rb +1 -1
  34. data/rroonga-build.rb +3 -3
  35. data/rroonga.gemspec +1 -0
  36. data/test/groonga-test-utils.rb +2 -2
  37. data/test/test-column.rb +19 -0
  38. data/test/test-context.rb +5 -1
  39. data/test/test-double-array-trie.rb +19 -0
  40. data/test/test-exception.rb +7 -2
  41. data/test/test-expression.rb +19 -0
  42. data/test/test-fix-size-column.rb +49 -36
  43. data/test/test-hash.rb +22 -0
  44. data/test/test-patricia-trie.rb +26 -7
  45. data/test/test-schema-dumper.rb +65 -1
  46. data/test/test-schema.rb +13 -2
  47. data/test/test-variable-size-column.rb +6 -5
  48. metadata +47 -46
@@ -40,7 +40,7 @@ ARGF.each_line do |line|
40
40
  case line
41
41
  when /\A\s+(GRN_OP_\w+)/
42
42
  operator = $1
43
- rb_operator = operator.gsub(/\AGRN_OP_/, "").split("_").map{ |word|
43
+ rb_operator = operator.gsub(/\AGRN_OP_/, "").split("_").map {|word|
44
44
  replace_dictionary[word] || word
45
45
  }.join("_")
46
46
  puts " rb_define_const(rb_mGrnOperation, \"%s\",
@@ -19,15 +19,15 @@ module RroongaBuild
19
19
  module RequiredGroongaVersion
20
20
  MAJOR = 4
21
21
  MINOR = 0
22
- MICRO = 4
22
+ MICRO = 7
23
23
  VERSION = [MAJOR, MINOR, MICRO]
24
- RELEASED_DATE = Time.utc(2014, 7, 29)
24
+ RELEASED_DATE = Time.utc(2014, 10, 29)
25
25
  end
26
26
 
27
27
  module LatestGroongaVersion
28
28
  MAJOR = 4
29
29
  MINOR = 0
30
- MICRO = 6
30
+ MICRO = 7
31
31
  VERSION = [MAJOR, MINOR, MICRO]
32
32
  end
33
33
 
@@ -61,6 +61,7 @@ Gem::Specification.new do |s|
61
61
 
62
62
  s.files = ["README.md", "AUTHORS", "Rakefile", "Gemfile", ".yardopts"]
63
63
  s.files += Dir.glob("doc/text/*.textile")
64
+ s.files += Dir.glob("doc/images/*")
64
65
  s.files += ["#{s.name}.gemspec"]
65
66
  s.files += ["rroonga-build.rb", "extconf.rb"]
66
67
  Dir.chdir(base_dir) do
@@ -103,8 +103,8 @@ module GroongaTestUtils
103
103
  end
104
104
 
105
105
  def setup_logger
106
- Groonga::Logger.register(:level => :dump) do |level, time, title, message, location|
107
- p [level, time, title, message, location]
106
+ Groonga::Logger.register(:max_level => :dump) do |*args|
107
+ p args
108
108
  end
109
109
  end
110
110
 
@@ -461,4 +461,23 @@ class ColumnTest < Test::Unit::TestCase
461
461
  @users_age_column.disk_usage)
462
462
  end
463
463
  end
464
+
465
+ class RenameTest < self
466
+ def setup
467
+ setup_database
468
+
469
+ Groonga::Schema.define do |schema|
470
+ schema.create_table("Users") do |table|
471
+ table.short_text("name")
472
+ end
473
+ end
474
+
475
+ @users = context["Users"]
476
+ end
477
+
478
+ def test_old_name_reference
479
+ @users.column("name").rename("nick")
480
+ assert_nil(@users.column("name"))
481
+ end
482
+ end
464
483
  end
@@ -115,7 +115,11 @@ class ContextTest < Test::Unit::TestCase
115
115
  end
116
116
 
117
117
  def test_support_lzo?
118
- assert_boolean(Groonga::Context.default.support_lzo?)
118
+ assert_false(Groonga::Context.default.support_lzo?)
119
+ end
120
+
121
+ def test_support_lz4?
122
+ assert_boolean(Groonga::Context.default.support_lz4?)
119
123
  end
120
124
 
121
125
  def test_match_escalation_threshold
@@ -55,6 +55,25 @@ class DoubleArrayTrieTest < Test::Unit::TestCase
55
55
  trie.default_tokenizer)
56
56
  end
57
57
 
58
+ class TokenFiltersTest < self
59
+ def test_accessor
60
+ context.register_plugin("token_filters/stop_word")
61
+ trie = Groonga::DoubleArrayTrie.create
62
+ assert_equal([], trie.token_filters)
63
+ trie.token_filters = ["TokenFilterStopWord"]
64
+ assert_equal([context["TokenFilterStopWord"]],
65
+ trie.token_filters)
66
+ end
67
+
68
+ def test_create
69
+ context.register_plugin("token_filters/stop_word")
70
+ token_filters = ["TokenFilterStopWord"]
71
+ trie = Groonga::DoubleArrayTrie.create(:token_filters => token_filters)
72
+ assert_equal([context["TokenFilterStopWord"]],
73
+ trie.token_filters)
74
+ end
75
+ end
76
+
58
77
  def test_search
59
78
  users = Groonga::Array.create(:name => "Users")
60
79
  users.define_column("name", "ShortText")
@@ -1,4 +1,5 @@
1
- # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
2
3
  #
3
4
  # This library is free software; you can redistribute it and/or
4
5
  # modify it under the terms of the GNU Lesser General Public
@@ -83,7 +84,7 @@ class ExceptionTest < Test::Unit::TestCase
83
84
  assert_const_defined(Groonga, :OperationNotSupported)
84
85
  assert_const_defined(Groonga, :AddressIsInUse)
85
86
  assert_const_defined(Groonga, :ZLibError)
86
- assert_const_defined(Groonga, :LZOError)
87
+ assert_const_defined(Groonga, :LZ4Error)
87
88
  assert_const_defined(Groonga, :StackOverFlow)
88
89
  assert_const_defined(Groonga, :SyntaxError)
89
90
  assert_const_defined(Groonga, :RetryMax)
@@ -92,6 +93,10 @@ class ExceptionTest < Test::Unit::TestCase
92
93
  assert_const_defined(Groonga, :TooSmallOffset)
93
94
  assert_const_defined(Groonga, :TooLargeOffset)
94
95
  assert_const_defined(Groonga, :TooSmallLimit)
96
+ assert_const_defined(Groonga, :CASError)
97
+ assert_const_defined(Groonga, :UnsupportedCommandVersion)
98
+ assert_const_defined(Groonga, :NormalizerError)
99
+ assert_const_defined(Groonga, :TokenFilterError)
95
100
  end
96
101
  end
97
102
 
@@ -1,6 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  # Copyright (C) 2009-2013 Kouhei Sutou <kou@clear-code.com>
4
+ # Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
4
5
  #
5
6
  # This library is free software; you can redistribute it and/or
6
7
  # modify it under the terms of the GNU Lesser General Public
@@ -132,6 +133,24 @@ class ExpressionTest < Test::Unit::TestCase
132
133
  snippet.close
133
134
  end
134
135
 
136
+ def test_keywords
137
+ users = Groonga::Array.create(:name => "Users")
138
+ users.define_column("name", "ShortText")
139
+
140
+ expression = Groonga::Expression.new
141
+ variable = expression.define_variable(:domain => users)
142
+ expression.append_object(variable)
143
+ expression.parse("ラングバ OR Ruby OR groonga", :default_column => name)
144
+ expression.compile
145
+
146
+ assert_equal([
147
+ "Ruby",
148
+ "groonga",
149
+ "ラングバ",
150
+ ],
151
+ expression.keywords.sort)
152
+ end
153
+
135
154
  class AppendObjectTest < self
136
155
  setup
137
156
  def setup_expression
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2014 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
@@ -18,50 +18,63 @@ class FixSizeColumnTest < Test::Unit::TestCase
18
18
 
19
19
  def setup
20
20
  setup_database
21
-
22
- setup_bookmarks_table
23
21
  end
24
22
 
25
- def setup_bookmarks_table
26
- @bookmarks_path = @tables_dir + "bookmarks"
27
- @bookmarks = Groonga::Array.create(:name => "Bookmarks",
28
- :path => @bookmarks_path.to_s)
23
+ class OperationTest < self
24
+ def setup
25
+ super
26
+ setup_bookmarks_table
27
+ end
29
28
 
30
- @viewed_column_path = @columns_dir + "viewed"
31
- @viewed = @bookmarks.define_column("viewed", "Int32",
32
- :path => @viewed_column_path.to_s)
33
- end
29
+ def setup_bookmarks_table
30
+ @bookmarks_path = @tables_dir + "bookmarks"
31
+ @bookmarks = Groonga::Array.create(:name => "Bookmarks",
32
+ :path => @bookmarks_path.to_s)
34
33
 
35
- def test_index?
36
- assert_not_predicate(@viewed, :index?)
37
- end
34
+ @n_viewed_column_path = @columns_dir + "n_viewed"
35
+ @n_viewed = @bookmarks.define_column("n_viewed", "Int32",
36
+ :path => @n_viewed_column_path.to_s)
37
+ end
38
38
 
39
- def test_vector?
40
- assert_not_predicate(@viewed, :vector?)
41
- end
39
+ def test_index?
40
+ assert_not_predicate(@n_viewed, :index?)
41
+ end
42
42
 
43
- def test_scalar?
44
- assert_predicate(@viewed, :scalar?)
45
- end
43
+ def test_vector?
44
+ assert_not_predicate(@n_viewed, :vector?)
45
+ end
46
46
 
47
- def test_inspect
48
- assert_equal("#<Groonga::FixSizeColumn " +
49
- "id: <#{@viewed.id}>, " +
50
- "name: <Bookmarks.viewed>, " +
51
- "path: <#{@viewed_column_path}>, " +
52
- "domain: <Bookmarks>, " +
53
- "range: <Int32>, " +
54
- "flags: <KEY_INT>" +
55
- ">",
56
- @viewed.inspect)
57
- end
47
+ def test_scalar?
48
+ assert_predicate(@n_viewed, :scalar?)
49
+ end
58
50
 
59
- def test_domain
60
- assert_equal(@bookmarks, @viewed.domain)
61
- end
51
+ def test_inspect
52
+ assert_equal("#<Groonga::FixSizeColumn " +
53
+ "id: <#{@n_viewed.id}>, " +
54
+ "name: <Bookmarks.n_viewed>, " +
55
+ "path: <#{@n_viewed_column_path}>, " +
56
+ "domain: <Bookmarks>, " +
57
+ "range: <Int32>, " +
58
+ "flags: <KEY_INT>" +
59
+ ">",
60
+ @n_viewed.inspect)
61
+ end
62
+
63
+ def test_domain
64
+ assert_equal(@bookmarks, @n_viewed.domain)
65
+ end
62
66
 
63
- def test_table
64
- assert_equal(@bookmarks, @viewed.table)
67
+ def test_table
68
+ assert_equal(@bookmarks, @n_viewed.table)
69
+ end
70
+
71
+ class AssignTest < self
72
+ def test_different_types
73
+ @bookmarks.add(:n_viewed => "100")
74
+ record = @bookmarks.add(:n_viewed => 101)
75
+ assert_equal(101, record.n_viewed)
76
+ end
77
+ end
65
78
  end
66
79
 
67
80
  class TimeTest < self
@@ -129,6 +129,7 @@ class HashTest < Test::Unit::TestCase
129
129
  "size: <0>, " +
130
130
  "encoding: <#{encoding.inspect}>, " +
131
131
  "default_tokenizer: (nil), " +
132
+ "token_filters: [], " +
132
133
  "normalizer: (nil)>",
133
134
  anonymous_table.inspect)
134
135
  end
@@ -145,6 +146,7 @@ class HashTest < Test::Unit::TestCase
145
146
  "size: <0>, " +
146
147
  "encoding: <#{encoding.inspect}>, " +
147
148
  "default_tokenizer: (nil), " +
149
+ "token_filters: [], " +
148
150
  "normalizer: (nil)>",
149
151
  anonymous_table.inspect)
150
152
  end
@@ -162,6 +164,7 @@ class HashTest < Test::Unit::TestCase
162
164
  "size: <0>, " +
163
165
  "encoding: <#{encoding.inspect}>, " +
164
166
  "default_tokenizer: (nil), " +
167
+ "token_filters: [], " +
165
168
  "normalizer: (nil)>",
166
169
  named_table.inspect)
167
170
  end
@@ -178,6 +181,7 @@ class HashTest < Test::Unit::TestCase
178
181
  "size: <0>, " +
179
182
  "encoding: <#{encoding.inspect}>, " +
180
183
  "default_tokenizer: (nil), " +
184
+ "token_filters: [], " +
181
185
  "normalizer: (nil)>",
182
186
  named_table.inspect)
183
187
  end
@@ -195,6 +199,24 @@ class HashTest < Test::Unit::TestCase
195
199
  hash.default_tokenizer)
196
200
  end
197
201
 
202
+ class TokenFiltersTest < self
203
+ def test_accessor
204
+ context.register_plugin("token_filters/stop_word")
205
+ hash = Groonga::Hash.create
206
+ assert_equal([], hash.token_filters)
207
+ hash.token_filters = ["TokenFilterStopWord"]
208
+ assert_equal([context["TokenFilterStopWord"]],
209
+ hash.token_filters)
210
+ end
211
+
212
+ def test_create
213
+ context.register_plugin("token_filters/stop_word")
214
+ hash = Groonga::Hash.create(:token_filters => ["TokenFilterStopWord"])
215
+ assert_equal([context["TokenFilterStopWord"]],
216
+ hash.token_filters)
217
+ end
218
+ end
219
+
198
220
  def test_normalizer
199
221
  hash = Groonga::Hash.create
200
222
  assert_nil(hash.normalizer)
@@ -55,6 +55,25 @@ class PatriciaTrieTest < Test::Unit::TestCase
55
55
  trie.default_tokenizer)
56
56
  end
57
57
 
58
+ class TokenFiltersTest < self
59
+ def test_accessor
60
+ context.register_plugin("token_filters/stop_word")
61
+ trie = Groonga::PatriciaTrie.create
62
+ assert_equal([], trie.token_filters)
63
+ trie.token_filters = ["TokenFilterStopWord"]
64
+ assert_equal([context["TokenFilterStopWord"]],
65
+ trie.token_filters)
66
+ end
67
+
68
+ def test_create
69
+ context.register_plugin("token_filters/stop_word")
70
+ token_filters = ["TokenFilterStopWord"]
71
+ trie = Groonga::PatriciaTrie.create(:token_filters => token_filters)
72
+ assert_equal([context["TokenFilterStopWord"]],
73
+ trie.token_filters)
74
+ end
75
+ end
76
+
58
77
  def test_normalizer
59
78
  trie = Groonga::PatriciaTrie.create
60
79
  assert_nil(trie.normalizer)
@@ -368,16 +387,16 @@ class PatriciaTrieTest < Test::Unit::TestCase
368
387
  points.add(point)
369
388
  end
370
389
 
371
- assert_near_cursor(["129885039x503653023",
372
- "129866001x504328017",
373
- "130015001x504266057",
390
+ assert_near_cursor(["129786048x504792049",
391
+ "129845056x504853081",
392
+ "129903045x504648034",
393
+ "129917001x504675017",
394
+ "129855010x504452003",
395
+ "129809022x504597055",
374
396
  "129690039x504418033",
375
397
  "129680021x504441006",
376
398
  "129721099x504685024",
377
- "129855010x504452003",
378
- "129809022x504597055",
379
- "129786048x504792049",
380
- "129845056x504853081"],
399
+ "130019020x505027021"],
381
400
  points,
382
401
  "129786048x504792049",
383
402
  {:limit => 10})
@@ -1,4 +1,5 @@
1
1
  # Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
2
3
  #
3
4
  # This library is free software; you can redistribute it and/or
4
5
  # modify it under the terms of the GNU Lesser General Public
@@ -86,6 +87,7 @@ class SchemaDumperTest < Test::Unit::TestCase
86
87
  end
87
88
 
88
89
  def define_index_schema
90
+ context.register_plugin("token_filters/stop_word")
89
91
  Groonga::Schema.define do |schema|
90
92
  schema.create_table("Items",
91
93
  :type => :hash,
@@ -97,6 +99,7 @@ class SchemaDumperTest < Test::Unit::TestCase
97
99
  :type => :patricia_trie,
98
100
  :key_type => "ShortText",
99
101
  :default_tokenizer => "TokenBigram",
102
+ :token_filters => ["TokenFilterStopWord"],
100
103
  :normalizer => "NormalizerAuto") do |table|
101
104
  table.index("Items", "_key")
102
105
  table.index("Items", "title")
@@ -221,6 +224,7 @@ create_table("Terms",
221
224
  :type => :patricia_trie,
222
225
  :key_type => "ShortText",
223
226
  :default_tokenizer => "TokenBigram",
227
+ :token_filters => ["TokenFilterStopWord"],
224
228
  :normalizer => "NormalizerAuto",
225
229
  :force => true) do |table|
226
230
  end
@@ -306,7 +310,7 @@ column_create Comments item COLUMN_SCALAR Items
306
310
  table_create Items TABLE_HASH_KEY ShortText
307
311
  column_create Items title COLUMN_SCALAR ShortText
308
312
 
309
- table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
313
+ table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --token_filters TokenFilterStopWord --normalizer NormalizerAuto
310
314
 
311
315
  column_create Terms Items__key COLUMN_INDEX|WITH_POSITION Items _key
312
316
  column_create Terms Items_title COLUMN_INDEX|WITH_POSITION Items title
@@ -329,6 +333,66 @@ column_create Accounts name COLUMN_SCALAR ShortText
329
333
  SCHEMA
330
334
  end
331
335
 
336
+ class ColumnCompressionTest < self
337
+ def test_zlib
338
+ define_column_compression_zlib_schema
339
+ flags = "COLUMN_SCALAR"
340
+ flags << "|COMPRESS_ZLIB" if context.support_zlib?
341
+ assert_equal(<<-SCHEMA, dump)
342
+ table_create Posts TABLE_NO_KEY
343
+ column_create Posts title #{flags} ShortText
344
+ SCHEMA
345
+ end
346
+
347
+ def test_lz4
348
+ define_column_compression_lz4_schema
349
+ flags = "COLUMN_SCALAR"
350
+ flags << "|COMPRESS_LZ4" if context.support_lz4?
351
+ assert_equal(<<-SCHEMA, dump)
352
+ table_create Posts TABLE_NO_KEY
353
+ column_create Posts title #{flags} ShortText
354
+ SCHEMA
355
+ end
356
+
357
+ def test_with_weight_vector
358
+ define_column_compression_with_weight_vector_schema
359
+ flags = "COLUMN_VECTOR|WITH_WEIGHT"
360
+ flags << "|COMPRESS_ZLIB" if context.support_zlib?
361
+ assert_equal(<<-SCHEMA, dump)
362
+ table_create Posts TABLE_NO_KEY
363
+ column_create Posts comments #{flags} ShortText
364
+ SCHEMA
365
+ end
366
+
367
+ private
368
+ def define_column_compression_zlib_schema
369
+ Groonga::Schema.define do |schema|
370
+ schema.create_table("Posts") do |table|
371
+ table.short_text("title", :compress => :zlib)
372
+ end
373
+ end
374
+ end
375
+
376
+ def define_column_compression_lz4_schema
377
+ Groonga::Schema.define do |schema|
378
+ schema.create_table("Posts") do |table|
379
+ table.short_text("title", :compress => :lz4)
380
+ end
381
+ end
382
+ end
383
+
384
+ def define_column_compression_with_weight_vector_schema
385
+ Groonga::Schema.define do |schema|
386
+ schema.create_table("Posts") do |table|
387
+ table.short_text("comments",
388
+ :type => :vector,
389
+ :with_weight => true,
390
+ :compress => :zlib)
391
+ end
392
+ end
393
+ end
394
+ end
395
+
332
396
  private
333
397
  def dump
334
398
  Groonga::Schema.dump(:syntax => :command)