rroonga 1.2.9 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Rakefile +1 -0
- data/bin/grntest-log-analyze +123 -0
- data/bin/groonga-query-log-extract +117 -0
- data/ext/groonga/rb-grn-accessor.c +7 -5
- data/ext/groonga/rb-grn-array-cursor.c +1 -1
- data/ext/groonga/rb-grn-array.c +34 -44
- data/ext/groonga/rb-grn-column.c +74 -38
- data/ext/groonga/rb-grn-context.c +19 -15
- data/ext/groonga/rb-grn-database.c +47 -42
- data/ext/groonga/rb-grn-double-array-trie-cursor.c +40 -0
- data/ext/groonga/rb-grn-double-array-trie.c +530 -0
- data/ext/groonga/rb-grn-encoding-support.c +1 -1
- data/ext/groonga/rb-grn-encoding.c +1 -1
- data/ext/groonga/rb-grn-exception.c +1 -1
- data/ext/groonga/rb-grn-expression-builder.c +1 -1
- data/ext/groonga/rb-grn-expression.c +63 -51
- data/ext/groonga/rb-grn-fix-size-column.c +7 -7
- data/ext/groonga/rb-grn-hash-cursor.c +1 -1
- data/ext/groonga/rb-grn-hash.c +42 -39
- data/ext/groonga/rb-grn-index-column.c +35 -31
- data/ext/groonga/rb-grn-index-cursor.c +1 -1
- data/ext/groonga/rb-grn-logger.c +23 -18
- data/ext/groonga/rb-grn-object.c +40 -27
- data/ext/groonga/rb-grn-operator.c +1 -1
- data/ext/groonga/rb-grn-patricia-trie-cursor.c +1 -1
- data/ext/groonga/rb-grn-patricia-trie.c +122 -90
- data/ext/groonga/rb-grn-plugin.c +8 -7
- data/ext/groonga/rb-grn-posting.c +1 -1
- data/ext/groonga/rb-grn-procedure.c +1 -1
- data/ext/groonga/rb-grn-query.c +12 -12
- data/ext/groonga/rb-grn-record.c +1 -1
- data/ext/groonga/rb-grn-snippet.c +26 -19
- data/ext/groonga/rb-grn-table-cursor-key-support.c +1 -1
- data/ext/groonga/rb-grn-table-cursor.c +4 -3
- data/ext/groonga/rb-grn-table-key-support.c +23 -23
- data/ext/groonga/rb-grn-table.c +268 -153
- data/ext/groonga/rb-grn-type.c +11 -7
- data/ext/groonga/rb-grn-utils.c +4 -1
- data/ext/groonga/rb-grn-variable-size-column.c +1 -1
- data/ext/groonga/rb-grn-variable.c +2 -2
- data/ext/groonga/rb-grn-view-accessor.c +1 -1
- data/ext/groonga/rb-grn-view-cursor.c +1 -1
- data/ext/groonga/rb-grn-view-record.c +1 -1
- data/ext/groonga/rb-grn-view.c +43 -34
- data/ext/groonga/rb-grn.h +6 -2
- data/ext/groonga/rb-groonga.c +1 -1
- data/lib/groonga.rb +4 -2
- data/lib/groonga/context.rb +16 -41
- data/lib/groonga/dumper.rb +6 -4
- data/lib/groonga/expression-builder.rb +52 -26
- data/lib/groonga/grntest-log.rb +206 -0
- data/lib/groonga/pagination.rb +21 -19
- data/lib/groonga/patricia-trie.rb +7 -10
- data/lib/groonga/posting.rb +1 -1
- data/lib/groonga/query-log.rb +348 -0
- data/lib/groonga/record.rb +47 -143
- data/lib/groonga/schema.rb +679 -406
- data/lib/groonga/view-record.rb +4 -10
- data/rroonga-build.rb +1 -1
- data/test/test-array.rb +25 -4
- data/test/test-column.rb +8 -8
- data/test/test-database.rb +2 -3
- data/test/test-double-array-trie.rb +164 -0
- data/test/test-expression-builder.rb +2 -2
- data/test/test-expression.rb +10 -9
- data/test/test-gqtp.rb +2 -2
- data/test/test-hash.rb +32 -8
- data/test/test-patricia-trie.rb +34 -10
- data/test/test-query-log.rb +258 -0
- data/test/test-record.rb +6 -5
- data/test/test-schema-create-table.rb +8 -0
- data/test/test-schema.rb +491 -234
- data/test/test-table.rb +17 -24
- metadata +123 -100
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/groonga/pagination.rb
CHANGED
@@ -69,8 +69,8 @@ module Groonga
|
|
69
69
|
# ページネーション用便利メソッド。ページネーションをした
|
70
70
|
# い場合は #sort よりも #paginate の方が便利。
|
71
71
|
#
|
72
|
-
# 説明文(descriptionカラム)を「Ruby
|
73
|
-
#
|
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
|
-
# [
|
101
|
-
#
|
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
|
-
#
|
104
|
-
#
|
105
|
-
#
|
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
|
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
|
-
#
|
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
|
-
#
|
167
|
+
# 現在のページが最後のページなら +true+ を返す。
|
166
168
|
def last_page?
|
167
169
|
@current_page == last_page
|
168
170
|
end
|
169
171
|
|
170
|
-
#
|
172
|
+
# 次のページがあるなら +true+ を返す。
|
171
173
|
def have_next_page?
|
172
174
|
@current_page < @n_pages
|
173
175
|
end
|
174
176
|
|
175
|
-
#
|
176
|
-
#
|
177
|
+
# 次のページ番号を返す。次のページがない場合は +nil+
|
178
|
+
# を返す。
|
177
179
|
def next_page
|
178
180
|
have_next_page? ? @current_page + 1 : nil
|
179
181
|
end
|
180
182
|
|
181
|
-
#
|
183
|
+
# 前のページがあるなら +true+ を返す。
|
182
184
|
def have_previous_page?
|
183
185
|
@current_page > 1
|
184
186
|
end
|
185
187
|
|
186
|
-
#
|
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
|
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
|
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
|