groonga 0.0.5 → 0.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 (51) hide show
  1. data/NEWS.ja.rdoc +13 -0
  2. data/NEWS.rdoc +13 -0
  3. data/README.ja.rdoc +2 -1
  4. data/README.rdoc +2 -1
  5. data/Rakefile +0 -1
  6. data/TUTORIAL.ja.rdoc +49 -4
  7. data/benchmark/read-write-many-small-items.rb +5 -4
  8. data/benchmark/write-many-small-items.rb +5 -4
  9. data/example/bookmark.rb +30 -1
  10. data/example/index-html.rb +79 -0
  11. data/example/search/config.ru +182 -0
  12. data/example/search/public/css/groonga.css +122 -0
  13. data/ext/rb-grn-array.c +12 -9
  14. data/ext/rb-grn-column.c +13 -8
  15. data/ext/rb-grn-context.c +34 -16
  16. data/ext/rb-grn-database.c +3 -2
  17. data/ext/rb-grn-expression-builder.c +8 -2
  18. data/ext/rb-grn-expression.c +3 -3
  19. data/ext/rb-grn-hash.c +13 -10
  20. data/ext/rb-grn-object.c +127 -19
  21. data/ext/rb-grn-patricia-trie.c +8 -7
  22. data/ext/rb-grn-table-cursor.c +2 -40
  23. data/ext/rb-grn-table.c +154 -42
  24. data/ext/rb-grn-type.c +18 -10
  25. data/ext/rb-grn-utils.c +22 -20
  26. data/ext/rb-grn.h +9 -12
  27. data/extconf.rb +1 -1
  28. data/html/developer.html +1 -1
  29. data/html/index.html +2 -2
  30. data/lib/groonga/expression-builder.rb +133 -63
  31. data/lib/groonga/schema.rb +229 -37
  32. data/test/groonga-test-utils.rb +1 -1
  33. data/test/test-array.rb +1 -0
  34. data/test/test-context.rb +7 -1
  35. data/test/test-database.rb +11 -3
  36. data/test/test-expression-builder.rb +26 -2
  37. data/test/test-fix-size-column.rb +2 -1
  38. data/test/test-hash.rb +6 -1
  39. data/test/test-record.rb +2 -1
  40. data/test/test-schema.rb +85 -10
  41. data/test/test-table.rb +99 -3
  42. data/test/test-type.rb +3 -2
  43. data/test/test-variable-size-column.rb +2 -1
  44. data/test-unit/Rakefile +6 -1
  45. data/test-unit/lib/test/unit/autorunner.rb +26 -3
  46. data/test-unit/lib/test/unit/priority.rb +21 -1
  47. data/test-unit/lib/test/unit/testcase.rb +101 -36
  48. data/test-unit/lib/test/unit/ui/console/testrunner.rb +7 -4
  49. data/test-unit/test/{test_testcase.rb → test-testcase.rb} +30 -1
  50. data/test-unit/test/test_assertions.rb +1 -1
  51. metadata +9 -6
@@ -17,11 +17,8 @@
17
17
 
18
18
  module Groonga
19
19
  module ExpressionBuildable
20
- attr_accessor :builder, :expression, :variable
20
+ attr_reader :table
21
21
  def initialize(*args)
22
- @builder = self
23
- @expression = nil
24
- @variable = nil
25
22
  @table = nil
26
23
  @name = nil
27
24
  @query = nil
@@ -29,17 +26,119 @@ module Groonga
29
26
  end
30
27
 
31
28
  def build
32
- @expression = Expression.new(:table => @table,
33
- :name => @name,
34
- :query => @query,
35
- :default_column => @default_column)
36
- if block_given?
37
- @variable = @expression.define_variable(:domain => @table)
38
- @expression.append_object(@variable)
39
- yield(self)
40
- @expression.compile
41
- end
42
- @expression
29
+ expression = Expression.new(:table => @table,
30
+ :name => @name,
31
+ :query => @query,
32
+ :default_column => @default_column)
33
+ variable = expression.define_variable(:domain => @table)
34
+
35
+ builder = nil
36
+ builder = yield(self) if block_given?
37
+ if builder.nil? or builder == self
38
+ expression.append_constant(1)
39
+ expression.append_constant(1)
40
+ expression.append_operation(Groonga::Operation::OR, 2)
41
+ else
42
+ builder.build(expression, variable)
43
+ end
44
+
45
+ expression.compile
46
+ expression
47
+ end
48
+
49
+ class ExpressionBuilder
50
+ def initialize
51
+ super()
52
+ end
53
+
54
+ def &(other)
55
+ AndExpressionBuilder.new(self, other)
56
+ end
57
+
58
+ def |(other)
59
+ OrExpressionBuilder.new(self, other)
60
+ end
61
+ end
62
+
63
+ class SetExpressionBuilder < ExpressionBuilder
64
+ def initialize(operation, *expression_builders)
65
+ super()
66
+ @operation = operation
67
+ @expression_builders = expression_builders
68
+ end
69
+
70
+ def build(expression, variable)
71
+ return if @expression_builders.empty?
72
+ @expression_builders.each do |builder|
73
+ builder.build(expression, variable)
74
+ end
75
+ expression.append_operation(@operation, @expression_builders.size)
76
+ end
77
+ end
78
+
79
+ class AndExpressionBuilder < SetExpressionBuilder
80
+ def initialize(*expression_builders)
81
+ super(Groonga::Operation::AND, *expression_builders)
82
+ end
83
+ end
84
+
85
+ class OrExpressionBuilder < SetExpressionBuilder
86
+ def initialize(*expression_builders)
87
+ super(Groonga::Operation::OR, *expression_builders)
88
+ end
89
+ end
90
+
91
+ class BinaryExpressionBuilder < ExpressionBuilder
92
+ def initialize(operation, column_name, value)
93
+ super()
94
+ @operation = operation
95
+ @column_name = column_name
96
+ @value = value
97
+ end
98
+
99
+ def build(expression, variable)
100
+ expression.append_object(variable)
101
+ expression.append_constant(@column_name)
102
+ expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
103
+ expression.append_constant(@value)
104
+ expression.append_operation(@operation, 2)
105
+ end
106
+ end
107
+
108
+ class EqualExpressionBuilder < BinaryExpressionBuilder
109
+ def initialize(column_name, value)
110
+ super(Groonga::Operation::EQUAL, column_name, value)
111
+ end
112
+ end
113
+
114
+ class MatchExpressionBuilder < BinaryExpressionBuilder
115
+ def initialize(column_name, value)
116
+ super(Groonga::Operation::MATCH, column_name, value)
117
+ end
118
+ end
119
+
120
+ class LessExpressionBuilder < BinaryExpressionBuilder
121
+ def initialize(column_name, value)
122
+ super(Groonga::Operation::LESS, column_name, value)
123
+ end
124
+ end
125
+
126
+ class LessEqualExpressionBuilder < BinaryExpressionBuilder
127
+ def initialize(column_name, value)
128
+ super(Groonga::Operation::LESS_EQUAL, column_name, value)
129
+ end
130
+ end
131
+
132
+ class GreaterExpressionBuilder < BinaryExpressionBuilder
133
+ def initialize(column_name, value)
134
+ super(Groonga::Operation::GREATER, column_name, value)
135
+ end
136
+ end
137
+
138
+ class GreaterEqualExpressionBuilder < BinaryExpressionBuilder
139
+ def initialize(column_name, value)
140
+ super(Groonga::Operation::GREATER_EQUAL, column_name, value)
141
+ end
43
142
  end
44
143
  end
45
144
 
@@ -47,7 +146,7 @@ module Groonga
47
146
  include ExpressionBuildable
48
147
 
49
148
  def initialize(table, name)
50
- super
149
+ super()
51
150
  @table = table
52
151
  @name = name
53
152
  end
@@ -59,16 +158,7 @@ module Groonga
59
158
  "for table <#{@table.inspect}>"
60
159
  raise ArgumentError, message
61
160
  end
62
- builder = ColumnExpressionBuilder.new(column, nil, nil)
63
- builder.builder = @builder
64
- builder.expression = @expression
65
- builder.variable = @variable
66
- builder
67
- end
68
-
69
- def &(other)
70
- @expression.append_operation(Groonga::Operation::AND, 2)
71
- @builder
161
+ ColumnExpressionBuilder.new(column, nil, nil)
72
162
  end
73
163
  end
74
164
 
@@ -76,8 +166,9 @@ module Groonga
76
166
  include ExpressionBuildable
77
167
 
78
168
  def initialize(column, name, query)
79
- super
169
+ super()
80
170
  @table = column.table
171
+ @range = column.range
81
172
  @column = column
82
173
  @default_column = column.local_name
83
174
  @name = name
@@ -85,57 +176,36 @@ module Groonga
85
176
  end
86
177
 
87
178
  def ==(other)
88
- @expression.append_object(@variable)
89
- @expression.append_constant(@column.local_name)
90
- @expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
91
- @expression.append_constant(other)
92
- @expression.append_operation(Groonga::Operation::EQUAL, 2)
93
- @builder
179
+ EqualExpressionBuilder.new(@column.local_name, normalize(other))
94
180
  end
95
181
 
96
182
  def =~(other)
97
- @expression.append_object(@variable)
98
- @expression.append_constant(@column.local_name)
99
- @expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
100
- @expression.append_constant(other)
101
- @expression.append_operation(Groonga::Operation::MATCH, 2)
102
- @builder
183
+ MatchExpressionBuilder.new(@column.local_name, normalize(other))
103
184
  end
104
185
 
105
186
  def <(other)
106
- @expression.append_object(@variable)
107
- @expression.append_constant(@column.local_name)
108
- @expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
109
- @expression.append_constant(other)
110
- @expression.append_operation(Groonga::Operation::LESS, 2)
111
- @builder
187
+ LessExpressionBuilder.new(@column.local_name, normalize(other))
112
188
  end
113
189
 
114
190
  def <=(other)
115
- @expression.append_object(@variable)
116
- @expression.append_constant(@column.local_name)
117
- @expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
118
- @expression.append_constant(other)
119
- @expression.append_operation(Groonga::Operation::LESS_EQUAL, 2)
120
- @builder
191
+ LessEqualExpressionBuilder.new(@column.local_name, normalize(other))
121
192
  end
122
193
 
123
194
  def >(other)
124
- @expression.append_object(@variable)
125
- @expression.append_constant(@column.local_name)
126
- @expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
127
- @expression.append_constant(other)
128
- @expression.append_operation(Groonga::Operation::GREATER, 2)
129
- @builder
195
+ GreaterExpressionBuilder.new(@column.local_name, normalize(other))
130
196
  end
131
197
 
132
198
  def >=(other)
133
- @expression.append_object(@variable)
134
- @expression.append_constant(@column.local_name)
135
- @expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
136
- @expression.append_constant(other)
137
- @expression.append_operation(Groonga::Operation::GREATER_EQUAL, 2)
138
- @builder
199
+ GreaterEqualExpressionBuilder.new(@column.local_name, normalize(other))
200
+ end
201
+
202
+ private
203
+ def normalize(other)
204
+ if @range.is_a?(Groonga::Table) and other.is_a?(Integer)
205
+ Groonga::Record.new(@range, other)
206
+ else
207
+ other
208
+ end
139
209
  end
140
210
  end
141
211
  end
@@ -19,6 +19,29 @@
19
19
  module Groonga
20
20
 
21
21
  # groongaのスキーマ(データ構造)を管理するクラス。
22
+ #
23
+ # Groonga::Schemaを使うことにより簡単にテーブルやカラムを
24
+ # 追加・削除することができる。
25
+ #
26
+ # http://qwik.jp/senna/senna2.files/rect4605.png
27
+ # のようなスキーマを定義する場合は以下のようになる。
28
+ #
29
+ # Groonga::Schema.define do |schema|
30
+ # schema.create_table("items") do |table|
31
+ # table.short_text("title")
32
+ # end
33
+ #
34
+ # schema.create_table("users") do |table|
35
+ # table.short_text("name")
36
+ # end
37
+ #
38
+ # schema.create_table("comments") do |table|
39
+ # table.reference("item", "items")
40
+ # table.reference("author", "users")
41
+ # table.text("content")
42
+ # table.time("issued")
43
+ # end
44
+ # end
22
45
  class Schema
23
46
  class << self
24
47
 
@@ -70,16 +93,35 @@ module Groonga
70
93
  # 合はパス名は自動的に作成される。デフォルトでは永続
71
94
  # テーブルとなる。
72
95
  #
73
- # [+:value_size+]
74
- # 値のサイズを指定する。デフォルトは0。
96
+ # [+:value_type+]
97
+ # 値の型を指定する。省略すると値のための領域を確保しない。
98
+ # 値を保存したい場合は必ず指定すること。
75
99
  def create_table(name, options={}, &block)
76
100
  define do |schema|
77
101
  schema.create_table(name, options, &block)
78
102
  end
79
103
  end
80
104
 
105
+ # 名前が_name_のテーブルを削除する。
106
+ # _options_に指定可能な値は以下の通り。
107
+ #
108
+ # [+:context+]
109
+ # スキーマ定義時に使用するGroonga::Contextを指定する。
110
+ # 省略した場合はGroonga::Context.defaultを使用する。
111
+ def remove_table(name, options={})
112
+ define do |schema|
113
+ schema.remove_table(name, options)
114
+ end
115
+ end
116
+
117
+ def change_table(name, options={}, &block)
118
+ define do |schema|
119
+ schema.change_table(name, options, &block)
120
+ end
121
+ end
122
+
81
123
  # スキーマの内容を文字列で返す。返された値は
82
- # Groonga::Schema#restoreすることによりスキーマ内に組
124
+ # Groonga::Schema.restoreすることによりスキーマ内に組
83
125
  # み込むことができる。
84
126
  #
85
127
  # dump.rb:
@@ -90,9 +132,7 @@ module Groonga
90
132
  # restore.rb:
91
133
  # dumped_text = Groonga::Schema.dump
92
134
  # Groonga::Database.create(:path => "/tmp/new-db.grn")
93
- # Groonga::Schema.define do |schema|
94
- # schema.restore(dumped_text)
95
- # end
135
+ # Groonga::Schema.restore(dumped_text)
96
136
  #
97
137
  # _options_に指定可能な値は以下の通り。
98
138
  #
@@ -103,6 +143,13 @@ module Groonga
103
143
  Dumper.new(options).dump
104
144
  end
105
145
 
146
+ # Groonga::Schema.dumpで文字列化したスキーマを組み込む。
147
+ def restore(dumped_text, options={})
148
+ define(options) do |schema|
149
+ schema.load(dumped_text)
150
+ end
151
+ end
152
+
106
153
  def normalize_type(type) # :nodoc:
107
154
  return type if type.nil?
108
155
  return type if type.is_a?(Groonga::Object)
@@ -152,7 +199,7 @@ module Groonga
152
199
  #
153
200
  # 読み込まれた内容は#defineを呼び出すまでは実行されない
154
201
  # ことに注意すること。
155
- def restore(dumped_text)
202
+ def load(dumped_text)
156
203
  instance_eval(dumped_text)
157
204
  end
158
205
 
@@ -178,36 +225,97 @@ module Groonga
178
225
  # 合はパス名は自動的に作成される。デフォルトでは永続
179
226
  # テーブルとなる。
180
227
  #
181
- # [+:value_size+]
182
- # 値のサイズを指定する。デフォルトは0。
228
+ # [+:value_type+]
229
+ # 値の型を指定する。省略すると値のための領域を確保しな
230
+ # い。値を保存したい場合は必ず指定すること。
231
+ #
232
+ # 参考: Groonga::Type.new
183
233
  def create_table(name, options={})
184
234
  definition = TableDefinition.new(name, @options.merge(options || {}))
185
235
  yield(definition)
186
236
  @definitions << definition
187
237
  end
188
238
 
239
+ def remove_table(name, options={})
240
+ definition = TableRemoveDefinition.new(name, @options.merge(options || {}))
241
+ @definitions << definition
242
+ end
243
+
244
+ def change_table(name, options={})
245
+ options = @options.merge(options || {}).merge(:change => true)
246
+ definition = TableDefinition.new(name, options)
247
+ yield(definition)
248
+ @definitions << definition
249
+ end
250
+
189
251
  class TableDefinition
252
+ attr_reader :name
253
+
190
254
  def initialize(name, options)
191
255
  @name = name
192
256
  @name = @name.to_s if @name.is_a?(Symbol)
193
- @columns = []
257
+ @definitions = []
258
+ validate_options(options)
194
259
  @options = options
195
260
  @table_type = table_type
196
261
  end
197
262
 
198
263
  def define
199
- table = @table_type.create(create_options)
200
- @columns.each do |column|
201
- column.define(table)
264
+ if @options[:change]
265
+ table = context[@name]
266
+ else
267
+ table = context[@name]
268
+ if table and @options[:force]
269
+ table.remove
270
+ end
271
+ table = @table_type.create(create_options)
272
+ end
273
+ @definitions.each do |definition|
274
+ definition.define(table)
202
275
  end
203
276
  table
204
277
  end
205
278
 
206
279
  def column(name, type, options={})
207
- column = self[name] || ColumnDefinition.new(name, options)
208
- column.type = type
209
- column.options.merge!(options)
210
- @columns << column unless @columns.include?(column)
280
+ definition = self[name, ColumnDefinition]
281
+ if definition.nil?
282
+ definition = ColumnDefinition.new(name, options)
283
+ update_definition(name, ColumnDefinition, definition)
284
+ end
285
+ definition.type = type
286
+ definition.options.merge!(column_options.merge(options))
287
+ self
288
+ end
289
+
290
+ def remove_column(name, options={})
291
+ definition = self[name, ColumnRemoveDefinition]
292
+ if definition.nil?
293
+ definition = ColumnRemoveDefinition.new(name, options)
294
+ update_definition(name, ColumnRemoveDefinition, definition)
295
+ end
296
+ definition.options.merge!(options)
297
+ self
298
+ end
299
+
300
+ def index(target_column, options={})
301
+ name = options.delete(:name)
302
+ if name.nil?
303
+ target_column_name = nil
304
+ if target_column.is_a?(Groonga::Column)
305
+ target_column_name = target_column.name
306
+ else
307
+ target_column_name = target_column
308
+ end
309
+ name = target_column_name.gsub(/\./, "_")
310
+ end
311
+
312
+ definition = self[name, IndexColumnDefinition]
313
+ if definition.nil?
314
+ definition = IndexColumnDefinition.new(name, options)
315
+ update_definition(name, IndexColumnDefinition, definition)
316
+ end
317
+ definition.target = target_column
318
+ definition.options.merge!(column_options.merge(options))
211
319
  self
212
320
  end
213
321
 
@@ -254,19 +362,47 @@ module Groonga
254
362
  column(name, "LongText", options)
255
363
  end
256
364
 
257
- def index(name, target_column, options={})
258
- column = self[name] || IndexColumnDefinition.new(name, options)
259
- column.target = target_column
260
- column.options.merge!(options)
261
- @columns << column unless @columns.include?(column)
262
- self
365
+ def reference(name, table, options={})
366
+ column(name, table, options)
367
+ end
368
+
369
+ def [](name, definition_class=nil)
370
+ @definitions.find do |definition|
371
+ definition.name.to_s == name.to_s and
372
+ (definition_class.nil? or definition.is_a?(definition_class))
373
+ end
263
374
  end
264
375
 
265
- def [](name)
266
- @columns.find {|column| column.name == name}
376
+ def context
377
+ @options[:context] || Groonga::Context.default
267
378
  end
268
379
 
269
380
  private
381
+ def update_definition(name, definition_class, definition)
382
+ old_definition = self[name, definition_class]
383
+ if old_definition
384
+ index = @definitions.index(old_definition)
385
+ @definitions[index] = definition
386
+ else
387
+ @definitions << definition
388
+ end
389
+ end
390
+
391
+ AVAILABLE_OPTION_KEYS = [:context, :change, :force,
392
+ :type, :path, :persistent,
393
+ :key_type, :value_type, :sub_records,
394
+ :default_tokenizer,
395
+ :key_normalize, :key_with_sis]
396
+ def validate_options(options)
397
+ return if options.nil?
398
+ unknown_keys = options.keys - AVAILABLE_OPTION_KEYS
399
+ unless unknown_keys.empty?
400
+ message = "unknown keys are specified: #{unknown_keys.inspect}"
401
+ message << ": available keys: #{AVAILABLE_OPTION_KEYS.inspect}"
402
+ raise ArgumentError, message
403
+ end
404
+ end
405
+
270
406
  def table_type
271
407
  type = @options[:type]
272
408
  case type
@@ -286,8 +422,9 @@ module Groonga
286
422
  :name => @name,
287
423
  :path => @options[:path],
288
424
  :persistent => persistent?,
289
- :value_size => @options[:value_size],
425
+ :value_type => @options[:value_type],
290
426
  :context => context,
427
+ :sub_records => @options[:sub_records],
291
428
  }
292
429
  key_support_table_common = {
293
430
  :key_type => Schema.normalize_type(@options[:key_type]),
@@ -309,12 +446,24 @@ module Groonga
309
446
  end
310
447
  end
311
448
 
449
+ def column_options
450
+ {:persistent => persistent?}
451
+ end
452
+
312
453
  def persistent?
313
454
  @options[:persistent].nil? ? true : @options[:persistent]
314
455
  end
456
+ end
315
457
 
316
- def context
317
- @options[:context] || Groonga::Context.default
458
+ class TableRemoveDefinition
459
+ def initialize(name, options={})
460
+ @name = name
461
+ @options = options
462
+ end
463
+
464
+ def define
465
+ context = @options[:context] || Groonga::Context.default
466
+ context[@name].remove
318
467
  end
319
468
  end
320
469
 
@@ -336,6 +485,21 @@ module Groonga
336
485
  end
337
486
  end
338
487
 
488
+ class ColumnRemoveDefinition
489
+ attr_accessor :name
490
+ attr_reader :options
491
+
492
+ def initialize(name, options={})
493
+ @name = name
494
+ @name = @name.to_s if @name.is_a?(Symbol)
495
+ @options = (options || {}).dup
496
+ end
497
+
498
+ def define(table)
499
+ table.column(@name).remove
500
+ end
501
+ end
502
+
339
503
  class IndexColumnDefinition
340
504
  attr_accessor :name, :target
341
505
  attr_reader :options
@@ -350,6 +514,9 @@ module Groonga
350
514
  def define(table)
351
515
  target = @target
352
516
  target = context[target] unless target.is_a?(Groonga::Object)
517
+ if target.nil?
518
+ raise ArgumentError, "Unknown index target: #{@target.inspect}"
519
+ end
353
520
  index = table.define_index_column(@name,
354
521
  target.table,
355
522
  @options)
@@ -373,24 +540,49 @@ module Groonga
373
540
  database = context.database
374
541
  return nil if database.nil?
375
542
 
376
- schema = ""
543
+ reference_columns = []
544
+ definitions = []
377
545
  database.each do |object|
378
546
  next unless object.is_a?(Groonga::Table)
379
- next if object.name == "<ranguba:objects>"
380
- schema << "create_table(#{object.name.inspect}) do |table|\n"
381
- object.columns.each do |column|
382
- type = column_method(column)
547
+ schema = "create_table(#{object.name.inspect}) do |table|\n"
548
+ object.columns.sort_by {|column| column.local_name}.each do |column|
549
+ if column.range.is_a?(Groonga::Table)
550
+ reference_columns << column
551
+ else
552
+ type = column_method(column)
553
+ name = column.local_name
554
+ schema << " table.#{type}(#{name.inspect})\n"
555
+ end
556
+ end
557
+ schema << "end"
558
+ definitions << schema
559
+ end
560
+
561
+ reference_columns.group_by do |column|
562
+ column.table
563
+ end.each do |table, columns|
564
+ schema = "change_table(#{table.name.inspect}) do |table|\n"
565
+ columns.each do |column|
383
566
  name = column.local_name
384
- schema << " table.#{type}(#{name.inspect})\n"
567
+ reference = column.range
568
+ schema << " table.reference(#{name.inspect}, " +
569
+ "#{reference.name.inspect})\n"
385
570
  end
386
- schema << "end\n"
571
+ schema << "end"
572
+ definitions << schema
573
+ end
574
+
575
+ if definitions.empty?
576
+ ""
577
+ else
578
+ definitions.join("\n\n") + "\n"
387
579
  end
388
- schema
389
580
  end
390
581
 
391
582
  private
392
583
  def column_method(column)
393
- case column.range.name
584
+ range = column.range
585
+ case range.name
394
586
  when "Int32"
395
587
  "integer32"
396
588
  when "Int64"
@@ -81,8 +81,8 @@ module GroongaTestUtils
81
81
 
82
82
  def teardown_sandbox
83
83
  @database = nil
84
- teardown_tmp_directory
85
84
  GC.start
85
+ teardown_tmp_directory
86
86
  end
87
87
 
88
88
  def teardown_tmp_directory
data/test/test-array.rb CHANGED
@@ -30,6 +30,7 @@ class ArrayTest < Test::Unit::TestCase
30
30
  "path: <#{path}>, " +
31
31
  "domain: <nil>, " +
32
32
  "range: <nil>, " +
33
+ "flags: <>, " +
33
34
  "size: <3>>",
34
35
  contain_table.inspect)
35
36
  end
data/test/test-context.rb CHANGED
@@ -54,9 +54,15 @@ class ContextTest < Test::Unit::TestCase
54
54
  context.inspect)
55
55
  end
56
56
 
57
- def test_array_reference
57
+ def test_array_reference_by_string
58
58
  Groonga::Database.create
59
59
  context = Groonga::Context.default
60
60
  assert_equal("Int32", context["<int>"].name)
61
61
  end
62
+
63
+ def test_array_reference_by_symbol
64
+ Groonga::Database.create
65
+ context = Groonga::Context.default
66
+ assert_equal("Bool", context[:Bool].name)
67
+ end
62
68
  end