rroonga 9.0.3 → 9.0.7

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.
@@ -2,6 +2,7 @@
2
2
  /*
3
3
  Copyright (C) 2009-2017 Kouhei Sutou <kou@clear-code.com>
4
4
  Copyright (C) 2014-2016 Masafumi Yokoyama <yokoyama@clear-code.com>
5
+ Copyright (C) 2019 Horimoto Yasuhiro <horimoto@clear-code.com>
5
6
 
6
7
  This library is free software; you can redistribute it and/or
7
8
  modify it under the terms of the GNU Lesser General Public
@@ -29,9 +30,9 @@ static ID id_array_set;
29
30
  /*
30
31
  * Document-class: Groonga::Table < Groonga::Object
31
32
  *
32
- * Rroongaが提供するテーブルのベースとなるクラス。このクラス
33
- * から {Groonga::Array} , {Groonga::Hash} , {Groonga::PatriciaTrie}
34
- * が継承されている。
33
+ * This class is base class which represents Rroonga's table.
34
+ * {Groonga::Array} , {Groonga::Hash} , {Groonga::PatriciaTrie}
35
+ * are extended from this class.
35
36
  */
36
37
 
37
38
  grn_obj *
@@ -183,7 +184,8 @@ rb_grn_table_inspect_content (VALUE self, VALUE inspected)
183
184
  }
184
185
 
185
186
  /*
186
- * テーブルの中身を人に見やすい文字列で返す。
187
+ * This function return contents of a table as a string.
188
+ * It's easy to understand for human.
187
189
  *
188
190
  * @overload inspect
189
191
  * @return [String]
@@ -203,31 +205,33 @@ rb_grn_table_inspect (VALUE self)
203
205
  }
204
206
 
205
207
  /*
206
- * テーブルに名前が _name_ で型が _value_type_ のカラムを定義
207
- * し、新しく定義されたカラムを返す。
208
+ * Defines a column that name is `name` and type is `value_type`. It
209
+ * returns the newly defined column.
208
210
  *
209
211
  * @overload define_column(name, value_type, options={})
210
212
  * @param options [::Hash] The name and value
211
213
  * pairs. Omitted names are initialized as the default value.
212
- * @option options :path
213
- * カラムを保存するパス。
214
- * @option options :persistent (永続カラム)
215
- * +true+ を指定すると永続カラムとなる。省略した場合は永
216
- * 続カラムとなる。 +:path+ を省略した場合は自動的にパスが
217
- * 付加される。
214
+ * @option options :path [String, nil] (nil)
215
+ * The path to store the content of the column.
216
+ * If this is omitted, path is generated automatically.
217
+ * @option options :persistent [Boolean] (true)
218
+ * Whether the column is a persistent column or not.
219
+ * If this is `true` and `:path` is omitted, path is generated
220
+ * automatically.
218
221
  * @option options :type (:scalar)
219
- * カラムの値の格納方法について指定する。省略した場合は、
220
- * +:scalar+ になる。
222
+ * This option specifies how to store a value of a column.
223
+ * If this option is omitted, +:scalar+ is used.
221
224
  *
222
- * - +:scalar+ := スカラ値(単独の値)を格納する。
223
- * - +:vector+ := 値の配列を格納する。
225
+ * - +:scalar+ := Store scalar value.
226
+ * - +:vector+ := Store array value.
224
227
  * @option options [Boolean] :with_weight (false)
225
228
  * It specifies whether making the column weight vector column or not.
226
229
  * Weight vector column can store weight for each element.
227
230
  *
228
231
  * You can't use this option for scalar column.
229
232
  * @option options :compress
230
- * 値の圧縮方法を指定する。省略した場合は、圧縮しない。
233
+ * This option specifies how to compress values.
234
+ * If we omit this option, values are not compressed.
231
235
  *
232
236
  * * `:zlib`: Compressed by zlib.
233
237
  * * `:lz4`: Compressed by LZ4.
@@ -345,32 +349,37 @@ rb_grn_table_define_column (int argc, VALUE *argv, VALUE self)
345
349
  }
346
350
 
347
351
  /*
348
- * テーブルに名前が _name_ で型が _value_type_ のインデックスカ
349
- * ラムを定義し、新しく定義されたカラムを返す。
352
+ * Defines an index column that name is `name` and type is
353
+ * `value_type`. It returns the newly defined index column.
350
354
  *
351
355
  * @overload define_index_column(name, value_type, options={})
352
356
  * @param options [::Hash] The name and value
353
357
  * pairs. Omitted names are initialized as the default value.
354
- * @option options :path
355
- * カラムを保存するパス。
356
- * @option options :persistent (永続カラム)
357
- * +true+ を指定すると永続カラムとなる。省略した場合は永
358
- * 続カラムとなる。 +:path+ を省略した場合は自動的にパスが
359
- * 付加される。
360
- * @option options :with_section
361
- * 転置索引にsection(段落情報)を合わせて格納する。
362
- * @option options :with_weight
363
- * 転置索引にweight情報を合わせて格納する。
364
- * @option options :with_position
365
- * 転置索引に出現位置情報を合わせて格納する。
366
- * @option options :size (nil)
367
- * The size of index column. It must be `nil`, `:small` or
368
- * `:medium`. `nil` means full size. `:small` means small
369
- * size. `:medium` means medium size.
370
- * @option options :source
371
- * インデックス対象となるカラムを指定する。 +:sources+ との併用はできない。
372
- * @option options :sources
373
- * インデックス対象となる複数のカラムを指定する。 +:source+ との併用はできない。
358
+ * @option options :path [String, nil] (nil)
359
+ * The path to store the content of the index column.
360
+ * If this is omitted, path is generated automatically.
361
+ * @option options :persistent [Boolean] (true)
362
+ * Whether the index column is a persistent indent column or not.
363
+ * If this is `true` and `:path` is omitted, path is generated
364
+ * automatically.
365
+ * @option options :with_section [Boolean] (false)
366
+ * Whether section information is stored to the index column or not.
367
+ * @option options :with_weight [Boolean] (false)
368
+ * Whether weight information is stored to the index column or not.
369
+ * @option options :with_position [Boolean] (false)
370
+ * Whether position information is stored to the index column or not.
371
+ * @option options :size [Symbol, nil] (nil)
372
+ * The size of index column. It must be `nil`, `:small`,
373
+ * `:medium` or `:large`. `nil` means the default size.
374
+ * `:small` means small size. `:medium` means medium size. Medium size
375
+ * is smaller than the default size. `:large` means large size.
376
+ * Large size is larger than the default size.
377
+ * @option options :source [Groonga::Column, nil] (nil)
378
+ * Specifies the source column of the index column.
379
+ * This option can't be used with `:sources`.
380
+ * @option options :sources [::Array<Groonga::Column>, nil] (nil)
381
+ * Specifies the source columns of the index column.
382
+ * This option can't be used with `:source`.
374
383
  *
375
384
  * @return [Groonga::IndexColumn]
376
385
  */
@@ -461,9 +470,11 @@ rb_grn_table_define_index_column (int argc, VALUE *argv, VALUE self)
461
470
  flags |= GRN_OBJ_INDEX_SMALL;
462
471
  } else if (rb_grn_equal_option(rb_size, "medium")) {
463
472
  flags |= GRN_OBJ_INDEX_MEDIUM;
473
+ } else if (rb_grn_equal_option(rb_size, "large")) {
474
+ flags |= GRN_OBJ_INDEX_LARGE;
464
475
  } else {
465
476
  rb_raise(rb_eArgError,
466
- ":size must be nil, :small or :medium: <%" PRIsVALUE ">",
477
+ ":size must be nil, :small, :medium or :large: <%" PRIsVALUE ">",
467
478
  rb_size);
468
479
  }
469
480
 
@@ -2482,8 +2493,8 @@ rb_grn_table_support_key_p (VALUE self)
2482
2493
  /*
2483
2494
  * @overload support_value?
2484
2495
  *
2485
- * @return @true@ if the table is created with value type, @false@
2486
- * otherwise.
2496
+ * @return [Boolean] `true` if the table is created with value type,
2497
+ * `false` otherwise.
2487
2498
  */
2488
2499
  static VALUE
2489
2500
  rb_grn_table_support_value_p (VALUE self)
@@ -2517,6 +2528,19 @@ rb_grn_table_support_sub_records_p (VALUE self)
2517
2528
  return CBOOL2RVAL(grn_table_is_grouped(context, table));
2518
2529
  }
2519
2530
 
2531
+ /*
2532
+ * @overload support_score?
2533
+ *
2534
+ * @return [Boolean] `true` if the table has `_score` column,
2535
+ * `false` otherwise.
2536
+ */
2537
+ static VALUE
2538
+ rb_grn_table_support_score_p (VALUE self)
2539
+ {
2540
+ return CBOOL2RVAL(rb_grn_table_have_column(self,
2541
+ rb_str_new_literal("_score")));
2542
+ }
2543
+
2520
2544
  /*
2521
2545
  * {Groonga::Table#group} returns a table that contains grouped
2522
2546
  * records. If grouped table has a space to store the number of
@@ -2890,6 +2914,8 @@ rb_grn_init_table (VALUE mGrn)
2890
2914
  rb_grn_table_support_value_p, 0);
2891
2915
  rb_define_method(rb_cGrnTable, "support_sub_records?",
2892
2916
  rb_grn_table_support_sub_records_p, 0);
2917
+ rb_define_method(rb_cGrnTable, "support_score?",
2918
+ rb_grn_table_support_score_p, 0);
2893
2919
  rb_define_method(rb_cGrnTable, "have_n_sub_records_space?",
2894
2920
  rb_grn_table_have_n_sub_records_space_p, 0);
2895
2921
 
@@ -99,7 +99,7 @@ RB_GRN_BEGIN_DECLS
99
99
 
100
100
  #define RB_GRN_MAJOR_VERSION 9
101
101
  #define RB_GRN_MINOR_VERSION 0
102
- #define RB_GRN_MICRO_VERSION 3
102
+ #define RB_GRN_MICRO_VERSION 7
103
103
 
104
104
  #define RB_GRN_OBJECT(object) ((RbGrnObject *)(object))
105
105
  #define RB_GRN_NAMED_OBJECT(object) ((RbGrnNamedObject *)(object))
@@ -491,6 +491,8 @@ module Groonga
491
491
  options[:size] = :small
492
492
  elsif column.medium?
493
493
  options[:size] = :medium
494
+ elsif column.large?
495
+ options[:size] = :large
494
496
  end
495
497
  arguments = [
496
498
  dump_object(target_table_name),
@@ -652,6 +654,7 @@ module Groonga
652
654
  flags << "WITH_POSITION" if column.with_position?
653
655
  flags << "INDEX_SMALL" if column.small?
654
656
  flags << "INDEX_MEDIUM" if column.medium?
657
+ flags << "INDEX_LARGE" if column.large?
655
658
  parameters << "#{flags.join('|')}"
656
659
  parameters << "#{column.range.name}"
657
660
  source_names = column.sources.collect do |source|
@@ -205,10 +205,10 @@ module Groonga
205
205
  self["_score"] = new_score
206
206
  end
207
207
 
208
- # {Groonga::Record#score} が利用できる場合は +true+
208
+ # {Groonga::Record#score} が利用できる場合は `true`
209
209
  # 返す。
210
210
  def support_score?
211
- @table.have_column?("_score") # TODO delegate to Table
211
+ @table.support_score?
212
212
  end
213
213
 
214
214
  # 主キーの値が同一であったレコードの件数を返す。検索結果とし
@@ -1,5 +1,5 @@
1
1
  # Copyright (C) 2015 Masafumi Yokoyama <yokoyama@clear-code.com>
2
- # Copyright (C) 2009-2015 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2009-2019 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
@@ -14,13 +14,16 @@
14
14
  # License along with this library; if not, write to the Free Software
15
15
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
+ require "erb"
17
18
  require "fileutils"
19
+ require "json"
18
20
  require "pathname"
21
+ require "stringio"
19
22
  require "tempfile"
20
23
  require "time"
21
- require "erb"
22
- require "stringio"
23
- require "json"
24
+ require "timeout"
25
+
26
+ require "groonga/client"
24
27
  require "pkg-config"
25
28
 
26
29
  require "groonga"
@@ -44,7 +47,7 @@ module GroongaTestUtils
44
47
  setup_context
45
48
 
46
49
  @database = nil
47
- name_for_path = name.gsub(/[\(\)\[\] ]/, "-")
50
+ name_for_path = escape_path(name)
48
51
  @database_path = @tmp_dir + "#{name_for_path}.db"
49
52
  end
50
53
 
@@ -69,9 +72,11 @@ module GroongaTestUtils
69
72
 
70
73
  @log_path = @tmp_dir + "groonga.log"
71
74
  Groonga::Logger.path = @log_path.to_s
75
+ Groonga::Logger.reopen
72
76
 
73
77
  @query_log_path = @tmp_dir + "groonga-query.log"
74
78
  Groonga::QueryLogger.path = @query_log_path.to_s
79
+ Groonga::QueryLogger.reopen
75
80
  end
76
81
 
77
82
  def setup_tables_directory
@@ -107,6 +112,14 @@ module GroongaTestUtils
107
112
  end
108
113
  end
109
114
 
115
+ def collect_query_log
116
+ @query_log_path.open do |file|
117
+ file.seek(0, IO::SEEK_END)
118
+ yield
119
+ file.read
120
+ end
121
+ end
122
+
110
123
  def setup_database
111
124
  @database = Groonga::Database.create(:path => @database_path.to_s)
112
125
  end
@@ -155,6 +168,12 @@ module GroongaTestUtils
155
168
  actual.expression.inspect)
156
169
  end
157
170
 
171
+ def escape_path(path)
172
+ path.gsub(/[: ?!\(\)\[\]]/) do
173
+ "_"
174
+ end
175
+ end
176
+
158
177
  def linux?
159
178
  /linux/ =~ RUBY_PLATFORM
160
179
  end
@@ -167,6 +186,10 @@ module GroongaTestUtils
167
186
  /cygwin|mingw|mswin/ === RUBY_PLATFORM
168
187
  end
169
188
 
189
+ def only_not_windows
190
+ omit("This test is only for non Windows system.") if windows?
191
+ end
192
+
170
193
  def support_self_recursive_equal?
171
194
  self_recursive_hash1 = {}
172
195
  self_recursive_hash1["next"] = self_recursive_hash1
@@ -17,8 +17,6 @@
17
17
 
18
18
  $VERBOSE = true
19
19
 
20
- $KCODE = "u" if RUBY_VERSION < "1.9"
21
-
22
20
  base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
23
21
  ext_dir = File.join(base_dir, "ext", "groonga")
24
22
  lib_dir = File.join(base_dir, "lib")
@@ -19,12 +19,13 @@ class AccessorTest < Test::Unit::TestCase
19
19
 
20
20
  def setup
21
21
  setup_database
22
- @posts = Groonga::Hash.create(:name => "Posts", :key_type => "ShortText")
22
+ @posts = Groonga::Hash.create(:name => "Posts",
23
+ :key_type => "ShortText",
24
+ :value_type => "UInt32")
25
+ @grouped_posts = @posts.group("_key")
23
26
  @id = @posts.column("_id")
24
- end
25
-
26
- def teardown
27
- @id = nil
27
+ @key = @posts.column("_key")
28
+ @value = @posts.column("_value")
28
29
  end
29
30
 
30
31
  def test_name
@@ -51,9 +52,8 @@ class AccessorTest < Test::Unit::TestCase
51
52
 
52
53
  sub_test_case "#key_accessor?" do
53
54
  test "true" do
54
- key = @posts.column("_key")
55
55
  assert do
56
- key.key_accessor?
56
+ @key.key_accessor?
57
57
  end
58
58
  end
59
59
 
@@ -63,4 +63,60 @@ class AccessorTest < Test::Unit::TestCase
63
63
  end
64
64
  end
65
65
  end
66
+
67
+ sub_test_case "#id_accessor?" do
68
+ test "true" do
69
+ assert do
70
+ @id.id_accessor?
71
+ end
72
+ end
73
+
74
+ test "false" do
75
+ assert do
76
+ not @key.id_accessor?
77
+ end
78
+ end
79
+ end
80
+
81
+ sub_test_case "#value_accessor?" do
82
+ test "true" do
83
+ assert do
84
+ @value.value_accessor?
85
+ end
86
+ end
87
+
88
+ test "false" do
89
+ assert do
90
+ not @key.value_accessor?
91
+ end
92
+ end
93
+ end
94
+
95
+ sub_test_case "#score_accessor?" do
96
+ test "true" do
97
+ assert do
98
+ @posts.select.column("_score").score_accessor?
99
+ end
100
+ end
101
+
102
+ test "false" do
103
+ assert do
104
+ not @key.score_accessor?
105
+ end
106
+ end
107
+ end
108
+
109
+ sub_test_case "#n_sub_records_accessor?" do
110
+ test "true" do
111
+ assert do
112
+ @grouped_posts.column("_nsubrecs").n_sub_records_accessor?
113
+ end
114
+ end
115
+
116
+ test "false" do
117
+ assert do
118
+ not @key.n_sub_records_accessor?
119
+ end
120
+ end
121
+ end
66
122
  end
@@ -132,6 +132,31 @@ class ContextTest < Test::Unit::TestCase
132
132
  assert_equal(-1, context.match_escalation_threshold)
133
133
  end
134
134
 
135
+ sub_test_case("#force_match_escalation?") do
136
+ def setup
137
+ default_force_match_escalation = context.force_match_escalation?
138
+ begin
139
+ yield
140
+ ensure
141
+ context.force_match_escalation = default_force_match_escalation
142
+ end
143
+ end
144
+
145
+ def test_true
146
+ context.force_match_escalation = true
147
+ assert do
148
+ context.force_match_escalation?
149
+ end
150
+ end
151
+
152
+ def test_false
153
+ context.force_match_escalation = false
154
+ assert do
155
+ not context.force_match_escalation?
156
+ end
157
+ end
158
+ end
159
+
135
160
  def test_close
136
161
  context = Groonga::Context.new
137
162
  assert_false(context.closed?)
@@ -108,11 +108,16 @@ class TooManyOpenFilesTest < Test::Unit::TestCase
108
108
  include GroongaTestUtils
109
109
 
110
110
  def setup
111
+ @sub_context = nil
112
+ unless Process.const_defined?(:RLIMIT_NOFILE)
113
+ omit("No Process::RLIMIT_NOFILE")
114
+ end
111
115
  setup_database
112
116
  @sub_context = create_sub_context
113
117
  end
114
118
 
115
119
  def teardown
120
+ return if @sub_context.nil?
116
121
  @sub_context.database.close
117
122
  @sub_context.close
118
123
  end