rroonga 1.2.9 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/Gemfile +1 -0
  2. data/Rakefile +1 -0
  3. data/bin/grntest-log-analyze +123 -0
  4. data/bin/groonga-query-log-extract +117 -0
  5. data/ext/groonga/rb-grn-accessor.c +7 -5
  6. data/ext/groonga/rb-grn-array-cursor.c +1 -1
  7. data/ext/groonga/rb-grn-array.c +34 -44
  8. data/ext/groonga/rb-grn-column.c +74 -38
  9. data/ext/groonga/rb-grn-context.c +19 -15
  10. data/ext/groonga/rb-grn-database.c +47 -42
  11. data/ext/groonga/rb-grn-double-array-trie-cursor.c +40 -0
  12. data/ext/groonga/rb-grn-double-array-trie.c +530 -0
  13. data/ext/groonga/rb-grn-encoding-support.c +1 -1
  14. data/ext/groonga/rb-grn-encoding.c +1 -1
  15. data/ext/groonga/rb-grn-exception.c +1 -1
  16. data/ext/groonga/rb-grn-expression-builder.c +1 -1
  17. data/ext/groonga/rb-grn-expression.c +63 -51
  18. data/ext/groonga/rb-grn-fix-size-column.c +7 -7
  19. data/ext/groonga/rb-grn-hash-cursor.c +1 -1
  20. data/ext/groonga/rb-grn-hash.c +42 -39
  21. data/ext/groonga/rb-grn-index-column.c +35 -31
  22. data/ext/groonga/rb-grn-index-cursor.c +1 -1
  23. data/ext/groonga/rb-grn-logger.c +23 -18
  24. data/ext/groonga/rb-grn-object.c +40 -27
  25. data/ext/groonga/rb-grn-operator.c +1 -1
  26. data/ext/groonga/rb-grn-patricia-trie-cursor.c +1 -1
  27. data/ext/groonga/rb-grn-patricia-trie.c +122 -90
  28. data/ext/groonga/rb-grn-plugin.c +8 -7
  29. data/ext/groonga/rb-grn-posting.c +1 -1
  30. data/ext/groonga/rb-grn-procedure.c +1 -1
  31. data/ext/groonga/rb-grn-query.c +12 -12
  32. data/ext/groonga/rb-grn-record.c +1 -1
  33. data/ext/groonga/rb-grn-snippet.c +26 -19
  34. data/ext/groonga/rb-grn-table-cursor-key-support.c +1 -1
  35. data/ext/groonga/rb-grn-table-cursor.c +4 -3
  36. data/ext/groonga/rb-grn-table-key-support.c +23 -23
  37. data/ext/groonga/rb-grn-table.c +268 -153
  38. data/ext/groonga/rb-grn-type.c +11 -7
  39. data/ext/groonga/rb-grn-utils.c +4 -1
  40. data/ext/groonga/rb-grn-variable-size-column.c +1 -1
  41. data/ext/groonga/rb-grn-variable.c +2 -2
  42. data/ext/groonga/rb-grn-view-accessor.c +1 -1
  43. data/ext/groonga/rb-grn-view-cursor.c +1 -1
  44. data/ext/groonga/rb-grn-view-record.c +1 -1
  45. data/ext/groonga/rb-grn-view.c +43 -34
  46. data/ext/groonga/rb-grn.h +6 -2
  47. data/ext/groonga/rb-groonga.c +1 -1
  48. data/lib/groonga.rb +4 -2
  49. data/lib/groonga/context.rb +16 -41
  50. data/lib/groonga/dumper.rb +6 -4
  51. data/lib/groonga/expression-builder.rb +52 -26
  52. data/lib/groonga/grntest-log.rb +206 -0
  53. data/lib/groonga/pagination.rb +21 -19
  54. data/lib/groonga/patricia-trie.rb +7 -10
  55. data/lib/groonga/posting.rb +1 -1
  56. data/lib/groonga/query-log.rb +348 -0
  57. data/lib/groonga/record.rb +47 -143
  58. data/lib/groonga/schema.rb +679 -406
  59. data/lib/groonga/view-record.rb +4 -10
  60. data/rroonga-build.rb +1 -1
  61. data/test/test-array.rb +25 -4
  62. data/test/test-column.rb +8 -8
  63. data/test/test-database.rb +2 -3
  64. data/test/test-double-array-trie.rb +164 -0
  65. data/test/test-expression-builder.rb +2 -2
  66. data/test/test-expression.rb +10 -9
  67. data/test/test-gqtp.rb +2 -2
  68. data/test/test-hash.rb +32 -8
  69. data/test/test-patricia-trie.rb +34 -10
  70. data/test/test-query-log.rb +258 -0
  71. data/test/test-record.rb +6 -5
  72. data/test/test-schema-create-table.rb +8 -0
  73. data/test/test-schema.rb +491 -234
  74. data/test/test-table.rb +17 -24
  75. metadata +123 -100
  76. data/ext/groonga/Makefile +0 -233
@@ -16,7 +16,8 @@
16
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
 
18
18
  module Groonga
19
- module ExpressionBuildable # :nodoc:
19
+ # @private
20
+ module ExpressionBuildable
20
21
  attr_reader :table
21
22
  attr_accessor :query
22
23
  attr_accessor :syntax
@@ -94,7 +95,8 @@ module Groonga
94
95
  expression
95
96
  end
96
97
 
97
- class ExpressionBuilder # :nodoc:
98
+ # @private
99
+ class ExpressionBuilder
98
100
  def initialize
99
101
  super()
100
102
  end
@@ -108,7 +110,8 @@ module Groonga
108
110
  end
109
111
  end
110
112
 
111
- class SetExpressionBuilder < ExpressionBuilder # :nodoc:
113
+ # @private
114
+ class SetExpressionBuilder < ExpressionBuilder
112
115
  def initialize(operation, *expression_builders)
113
116
  super()
114
117
  @operation = operation
@@ -124,19 +127,22 @@ module Groonga
124
127
  end
125
128
  end
126
129
 
127
- class AndExpressionBuilder < SetExpressionBuilder # :nodoc:
130
+ # @private
131
+ class AndExpressionBuilder < SetExpressionBuilder
128
132
  def initialize(*expression_builders)
129
133
  super(Groonga::Operation::AND, *expression_builders)
130
134
  end
131
135
  end
132
136
 
133
- class OrExpressionBuilder < SetExpressionBuilder # :nodoc:
137
+ # @private
138
+ class OrExpressionBuilder < SetExpressionBuilder
134
139
  def initialize(*expression_builders)
135
140
  super(Groonga::Operation::OR, *expression_builders)
136
141
  end
137
142
  end
138
143
 
139
- class ColumnValueExpressionBuilder < ExpressionBuilder # :nodoc:
144
+ # @private
145
+ class ColumnValueExpressionBuilder < ExpressionBuilder
140
146
  def initialize(column, options={})
141
147
  super()
142
148
  @table = options[:table] || column.table
@@ -244,7 +250,8 @@ module Groonga
244
250
  end
245
251
  end
246
252
 
247
- class MatchTargetColumnExpressionBuilder < ColumnValueExpressionBuilder # :nodoc:
253
+ # @private
254
+ class MatchTargetColumnExpressionBuilder < ColumnValueExpressionBuilder
248
255
  def build(expression, variable)
249
256
  if @column.is_a?(String)
250
257
  expression.append_constant(@column)
@@ -259,7 +266,8 @@ module Groonga
259
266
  end
260
267
  end
261
268
 
262
- class MatchTargetExpressionBuilder < ExpressionBuilder # :nodoc:
269
+ # @private
270
+ class MatchTargetExpressionBuilder < ExpressionBuilder
263
271
  def initialize(target)
264
272
  super()
265
273
  @target = target
@@ -279,7 +287,8 @@ module Groonga
279
287
  end
280
288
  end
281
289
 
282
- class BinaryExpressionBuilder < ExpressionBuilder # :nodoc:
290
+ # @private
291
+ class BinaryExpressionBuilder < ExpressionBuilder
283
292
  def initialize(operation, column_value_builder, value)
284
293
  super()
285
294
  @operation = operation
@@ -294,73 +303,85 @@ module Groonga
294
303
  end
295
304
  end
296
305
 
297
- class EqualExpressionBuilder < BinaryExpressionBuilder # :nodoc:
306
+ # @private
307
+ class EqualExpressionBuilder < BinaryExpressionBuilder
298
308
  def initialize(column_value_builder, value)
299
309
  super(Groonga::Operation::EQUAL, column_value_builder, value)
300
310
  end
301
311
  end
302
312
 
303
- class MatchExpressionBuilder < BinaryExpressionBuilder # :nodoc:
313
+ # @private
314
+ class MatchExpressionBuilder < BinaryExpressionBuilder
304
315
  def initialize(column_value_builder, value)
305
316
  super(Groonga::Operation::MATCH, column_value_builder, value)
306
317
  end
307
318
  end
308
319
 
309
- class LessExpressionBuilder < BinaryExpressionBuilder # :nodoc:
320
+ # @private
321
+ class LessExpressionBuilder < BinaryExpressionBuilder
310
322
  def initialize(column_value_builder, value)
311
323
  super(Groonga::Operation::LESS, column_value_builder, value)
312
324
  end
313
325
  end
314
326
 
315
- class LessEqualExpressionBuilder < BinaryExpressionBuilder # :nodoc:
327
+ # @private
328
+ class LessEqualExpressionBuilder < BinaryExpressionBuilder
316
329
  def initialize(column_value_builder, value)
317
330
  super(Groonga::Operation::LESS_EQUAL, column_value_builder, value)
318
331
  end
319
332
  end
320
333
 
321
- class GreaterExpressionBuilder < BinaryExpressionBuilder # :nodoc:
334
+ # @private
335
+ class GreaterExpressionBuilder < BinaryExpressionBuilder
322
336
  def initialize(column_value_builder, value)
323
337
  super(Groonga::Operation::GREATER, column_value_builder, value)
324
338
  end
325
339
  end
326
340
 
327
- class GreaterEqualExpressionBuilder < BinaryExpressionBuilder # :nodoc:
341
+ # @private
342
+ class GreaterEqualExpressionBuilder < BinaryExpressionBuilder
328
343
  def initialize(column_value_builder, value)
329
344
  super(Groonga::Operation::GREATER_EQUAL, column_value_builder, value)
330
345
  end
331
346
  end
332
347
 
333
- class PlusExpressionBuilder < BinaryExpressionBuilder # :nodoc:
348
+ # @private
349
+ class PlusExpressionBuilder < BinaryExpressionBuilder
334
350
  def initialize(column_value_builder, value)
335
351
  super(Groonga::Operation::PLUS, column_value_builder, value)
336
352
  end
337
353
  end
338
354
 
339
- class MinusExpressionBuilder < BinaryExpressionBuilder # :nodoc:
355
+ # @private
356
+ class MinusExpressionBuilder < BinaryExpressionBuilder
340
357
  def initialize(column_value_builder, value)
341
358
  super(Groonga::Operation::MINUS, column_value_builder, value)
342
359
  end
343
360
  end
344
361
 
345
- class StarExpressionBuilder < BinaryExpressionBuilder # :nodoc:
362
+ # @private
363
+ class StarExpressionBuilder < BinaryExpressionBuilder
346
364
  def initialize(column_value_builder, value)
347
365
  super(Groonga::Operation::STAR, column_value_builder, value)
348
366
  end
349
367
  end
350
368
 
351
- class SlashExpressionBuilder < BinaryExpressionBuilder # :nodoc:
369
+ # @private
370
+ class SlashExpressionBuilder < BinaryExpressionBuilder
352
371
  def initialize(column_value_builder, value)
353
372
  super(Groonga::Operation::SLASH, column_value_builder, value)
354
373
  end
355
374
  end
356
375
 
357
- class ModExpressionBuilder < BinaryExpressionBuilder # :nodoc:
376
+ # @private
377
+ class ModExpressionBuilder < BinaryExpressionBuilder
358
378
  def initialize(column_value_builder, value)
359
379
  super(Groonga::Operation::MOD, column_value_builder, value)
360
380
  end
361
381
  end
362
382
 
363
- class SubExpressionBuilder < ExpressionBuilder # :nodoc:
383
+ # @private
384
+ class SubExpressionBuilder < ExpressionBuilder
364
385
  def initialize(query, options)
365
386
  super()
366
387
  @query = query
@@ -372,20 +393,23 @@ module Groonga
372
393
  end
373
394
  end
374
395
 
375
- class PrefixSearchExpressionBuilder < BinaryExpressionBuilder # :nodoc:
396
+ # @private
397
+ class PrefixSearchExpressionBuilder < BinaryExpressionBuilder
376
398
  def initialize(column_value_builder, value)
377
399
  super(Groonga::Operation::PREFIX, column_value_builder, value)
378
400
  end
379
401
  end
380
402
 
381
- class SuffixSearchExpressionBuilder < BinaryExpressionBuilder # :nodoc:
403
+ # @private
404
+ class SuffixSearchExpressionBuilder < BinaryExpressionBuilder
382
405
  def initialize(column_value_builder, value)
383
406
  super(Groonga::Operation::SUFFIX, column_value_builder, value)
384
407
  end
385
408
  end
386
409
  end
387
410
 
388
- class RecordExpressionBuilder # :nodoc:
411
+ # @private
412
+ class RecordExpressionBuilder
389
413
  include ExpressionBuildable
390
414
 
391
415
  def initialize(table, name)
@@ -475,7 +499,8 @@ module Groonga
475
499
  end
476
500
  end
477
501
 
478
- class MatchTargetRecordExpressionBuilder < RecordExpressionBuilder # :nodoc:
502
+ # @private
503
+ class MatchTargetRecordExpressionBuilder < RecordExpressionBuilder
479
504
  private
480
505
  def column_expression_builder(column, name)
481
506
  MatchTargetColumnExpressionBuilder.new(column,
@@ -484,7 +509,8 @@ module Groonga
484
509
  end
485
510
  end
486
511
 
487
- class ColumnExpressionBuilder # :nodoc:
512
+ # @private
513
+ class ColumnExpressionBuilder
488
514
  include ExpressionBuildable
489
515
 
490
516
  def initialize(column, name, query, options={})
@@ -0,0 +1,206 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License version 2.1 as published by the Free Software Foundation.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+
18
+ require "English"
19
+ require "time"
20
+
21
+ require "json"
22
+
23
+ module Groonga
24
+ module GrntestLog
25
+ class EnvironmentEvent
26
+ def initialize(environment)
27
+ @environment = environment
28
+ end
29
+
30
+ def script
31
+ @environment["script"]
32
+ end
33
+
34
+ def user
35
+ @environment["user"]
36
+ end
37
+
38
+ def date
39
+ Time.parse(@environment["date"])
40
+ end
41
+
42
+ def cpu
43
+ @environment["cpu"]
44
+ end
45
+
46
+ def bit
47
+ @environment["bit"]
48
+ end
49
+
50
+ def core
51
+ @environment["core"]
52
+ end
53
+
54
+ def ram
55
+ @environment["RAM"]
56
+ end
57
+
58
+ def unevictable
59
+ @environment["Unevictable"]
60
+ end
61
+
62
+ def mlocked
63
+ @environment["Mlocked"]
64
+ end
65
+
66
+ def total_memory
67
+ parse_size_with_unit(ram)
68
+ end
69
+
70
+ def unevictable_memory
71
+ parse_size_with_unit(unevictable)
72
+ end
73
+
74
+ def locked_memory
75
+ parse_size_with_unit(mlocked)
76
+ end
77
+
78
+ def hdd
79
+ @environment["HDD"]
80
+ end
81
+
82
+ def disk_size
83
+ parse_size_with_unit(hdd)
84
+ end
85
+
86
+ def os
87
+ @environment["OS"]
88
+ end
89
+
90
+ def host
91
+ @environment["HOST"]
92
+ end
93
+
94
+ def port
95
+ @environment["PORT"]
96
+ end
97
+
98
+ def version
99
+ @environment["VERSION"]
100
+ end
101
+
102
+ private
103
+ def parse_size_with_unit(size_with_unit)
104
+ case size_with_unit
105
+ when /\A(\d+)\z/
106
+ $1.to_i
107
+ when /\A(\d+)([KM])Bytes\z/
108
+ size = $1.to_i
109
+ unit = $2
110
+ case unit
111
+ when "K"
112
+ size * 1024
113
+ when "M"
114
+ size * (1024 ** 2)
115
+ else
116
+ raise ArgumentError,
117
+ "unknown size unit: <#{unit}>: <#{size_with_unit}>"
118
+ end
119
+ else
120
+ raise ArgumentError, "unknown size: <#{size_with_unit}>"
121
+ end
122
+ end
123
+ end
124
+
125
+ class JobsStartEvent
126
+ attr_reader :jobs
127
+ def initialize(jobs)
128
+ @jobs = jobs
129
+ end
130
+ end
131
+
132
+ class TaskEvent < Struct.new(:id, :command,
133
+ :relative_start_time, :relative_end_time,
134
+ :result)
135
+ def elapsed_time
136
+ relative_end_time - relative_start_time
137
+ end
138
+ end
139
+
140
+ class JobSummaryEvent
141
+ attr_reader :job, :latency, :elapsed, :qps, :min, :max, :n_queries
142
+ def initialize(summary)
143
+ @job = summary["job"]
144
+ @total_elapsed_time = summary["total_elapsed_time"] || summary["latency"]
145
+ @job_elapsed_time = summary["job_elapsed_time"] || summary["self"]
146
+ @qps = summary["qps"]
147
+ @min = summary["min"]
148
+ @max = summary["max"]
149
+ @n_queries = summary["n_queries"] || summary["queries"]
150
+ end
151
+ end
152
+
153
+ class JobsEndEvent
154
+ attr_reader :summaries
155
+ def initialize(summaries)
156
+ @summaries = summaries
157
+ end
158
+ end
159
+
160
+ class Parser
161
+ def initialize
162
+ end
163
+
164
+ def parse(input, &block)
165
+ in_environment = false
166
+ buffer = ""
167
+ input.each_line do |line|
168
+ if in_environment
169
+ case line
170
+ when "},\n"
171
+ buffer << "}"
172
+ yield(EnvironmentEvent.new(parse_json(buffer)))
173
+ buffer.clear
174
+ in_environment = false
175
+ else
176
+ buffer << line
177
+ end
178
+ else
179
+ case line
180
+ when /\A\[\{"script":/
181
+ buffer << line[1..-1]
182
+ in_environment = true
183
+ when /\A\{"jobs":/
184
+ yield(JobsStartEvent.new(parse_json(line.sub(/,$/, "}"))))
185
+ when /\A"detail": \[$/
186
+ # ignore
187
+ when /\A\[\d+,/
188
+ yield(TaskEvent.new(*parse_json(line.sub(/\]+,$/, "]"))))
189
+ when /\A"summary": /
190
+ summaries = parse_json(line.gsub(/(?:\A"summary": |\},$)/, ''))
191
+ summaries = summaries.collect do |summary|
192
+ JobSummaryEvent.new(summary)
193
+ end
194
+ yield(JobsEndEvent.new(summaries))
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ private
201
+ def parse_json(string)
202
+ JSON.parse(string)
203
+ end
204
+ end
205
+ end
206
+ end
@@ -69,8 +69,8 @@ module Groonga
69
69
  # ページネーション用便利メソッド。ページネーションをした
70
70
  # い場合は #sort よりも #paginate の方が便利。
71
71
  #
72
- # 説明文(descriptionカラム)を「Ruby」で全文検索し、検
73
- # 索結果をスコアの高い順にソートして、10項目ずつ表示する
72
+ # 説明文(descriptionカラム)を「Ruby」で全文検索し、
73
+ # 検索結果をスコアの高い順にソートして、10項目ずつ表示する
74
74
  # 場合は以下のようになる。
75
75
  #
76
76
  # query = "Ruby"
@@ -95,14 +95,16 @@ module Groonga
95
95
  # _sort_keys_ には ソートに用いる情報を指定する。
96
96
  # 指定の仕方は #sort と同様なので、詳細は #sort を参照。
97
97
  #
98
- # _options_に指定可能な値は以下の通り。
98
+ # _options_ に指定可能な値は以下の通り。
99
99
  #
100
- # [+:size+]
101
- # 1ページあたりに表示する最大項目数。デフォルトは10。
100
+ # @param [::Hash] options The name and value
101
+ # pairs. Omitted names are initialized as the default value.
102
+ # @option options [Integer] :size (10) The size
102
103
  #
103
- # [+:page+]
104
- # ページ番号。ページ番号は0ベースではなく1ベースである
105
- # ことに注意。デフォルトは1ページ目。
104
+ # 1ページあたりに表示する最大項目数。
105
+ # @option options [Integer] :page (1) The page
106
+ #
107
+ # ページ番号。ページ番号は0ベースではなく1ベースであることに注意。
106
108
  def paginate(sort_keys, options={})
107
109
  _size = size
108
110
  page_size = options[:size] || 10
@@ -142,7 +144,7 @@ module Groonga
142
144
  # 全レコード数。
143
145
  attr_reader :n_records
144
146
 
145
- # 2ページ以上ある場合は+true+を返す。
147
+ # 2ページ以上ある場合は +true+ を返す。
146
148
  def have_pages?
147
149
  @n_pages > 1
148
150
  end
@@ -152,7 +154,7 @@ module Groonga
152
154
  1
153
155
  end
154
156
 
155
- # 現在のページが最初のページなら+true+を返す。
157
+ # 現在のページが最初のページなら +true+ を返す。
156
158
  def first_page?
157
159
  @current_page == first_page
158
160
  end
@@ -162,29 +164,29 @@ module Groonga
162
164
  @n_pages
163
165
  end
164
166
 
165
- # 現在のページが最後のページなら+true+を返す。
167
+ # 現在のページが最後のページなら +true+ を返す。
166
168
  def last_page?
167
169
  @current_page == last_page
168
170
  end
169
171
 
170
- # 次のページがあるなら+true+を返す。
172
+ # 次のページがあるなら +true+ を返す。
171
173
  def have_next_page?
172
174
  @current_page < @n_pages
173
175
  end
174
176
 
175
- # 次のページ番号を返す。次のページがない場合は+nil+を返
176
- # す。
177
+ # 次のページ番号を返す。次のページがない場合は +nil+
178
+ # を返す。
177
179
  def next_page
178
180
  have_next_page? ? @current_page + 1 : nil
179
181
  end
180
182
 
181
- # 前のページがあるなら+true+を返す。
183
+ # 前のページがあるなら +true+ を返す。
182
184
  def have_previous_page?
183
185
  @current_page > 1
184
186
  end
185
187
 
186
- # 前のページ番号を返す。前のページがない場合は+nil+を返
187
- # す。
188
+ # 前のページ番号を返す。前のページがない場合は +nil+
189
+ # を返す。
188
190
  def previous_page
189
191
  have_previous_page? ? @current_page - 1 : nil
190
192
  end
@@ -199,7 +201,7 @@ module Groonga
199
201
  # あることに注意。つまり、最初のレコードは0番目のレコー
200
202
  # ドではなく、1番目のレコードになる。
201
203
  #
202
- # レコードが1つもない場合は+nil+を返す。
204
+ # レコードが1つもない場合は +nil+ を返す。
203
205
  def start_offset
204
206
  return nil if @n_records.zero?
205
207
  1 + (@current_page - 1) * @page_size
@@ -210,7 +212,7 @@ module Groonga
210
212
  # あることに注意。つまり、最初のレコードは0番目のレコー
211
213
  # ドではなく、1番目のレコードになる。
212
214
  #
213
- # レコードが1つもない場合は+nil+を返す。
215
+ # レコードが1つもない場合は +nil+ を返す。
214
216
  def end_offset
215
217
  return nil if @n_records.zero?
216
218
  [start_offset + @page_size - 1, @n_records].min