rroonga 4.0.5 → 4.0.6

Sign up to get free protection for your applications and to get access to all the features.
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)