rroonga 7.0.2 → 7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/doc/text/news.md +46 -7
- data/ext/groonga/rb-grn-array.c +1 -272
- data/ext/groonga/rb-grn-column-cache.c +240 -0
- data/ext/groonga/rb-grn-column.c +1 -1
- data/ext/groonga/rb-grn-context.c +28 -4
- data/ext/groonga/rb-grn-expression.c +23 -1
- data/ext/groonga/rb-grn-object.c +44 -1
- data/ext/groonga/rb-grn-procedure.c +16 -1
- data/ext/groonga/rb-grn-query-logger.c +55 -6
- data/ext/groonga/rb-grn-table.c +170 -1
- data/ext/groonga/rb-grn-utils.c +21 -2
- data/ext/groonga/rb-grn.h +18 -3
- data/ext/groonga/rb-groonga.c +2 -1
- data/lib/groonga.rb +8 -5
- data/lib/groonga/column.rb +0 -5
- data/lib/groonga/database.rb +0 -10
- data/lib/groonga/index-column.rb +0 -10
- data/lib/groonga/query-logger.rb +1 -1
- data/rroonga-build.rb +6 -6
- data/rroonga.gemspec +1 -1
- data/test/groonga-test-utils.rb +5 -8
- data/test/test-array.rb +1 -131
- data/test/test-column-cache.rb +46 -0
- data/test/test-command-select.rb +36 -1
- data/test/test-context.rb +1 -2
- data/test/test-database.rb +16 -2
- data/test/test-logger.rb +13 -1
- data/test/test-procedure.rb +7 -1
- data/test/test-query-logger.rb +12 -1
- data/test/test-table-arrow.rb +193 -0
- data/test/test-table-offset-and-limit.rb +3 -1
- metadata +65 -64
- data/lib/groonga/statistic-measurer.rb +0 -37
- data/lib/groonga/table.rb +0 -25
- data/test/test-statistic-measurer.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0ff170aa9082bbfb76dec6278fdf8e73e63d27b
|
4
|
+
data.tar.gz: 036da819743397109b89e4bf03c08083bf006cdc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1803d21a06243393ec418481e630b190d1b28cbb027fa10d9204967a4af8502ae9cb30ed25ce4acf578fbe62f924cc3fed8be2d6394b6b2e279808f41491c4a0
|
7
|
+
data.tar.gz: 286a503c57d6c6a82f625fcb893f03bba784020b465b335115c24b28474ea99612868ff4b827f108cb77c23118677a785b4762d31ee40fb98f8ff8cfade16999
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8; mode: ruby -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2009-
|
3
|
+
# Copyright (C) 2009-2018 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
# Copyright (C) 2017 Masafumi Yokoyama <yokoyama@clear-code.com>
|
5
5
|
#
|
6
6
|
# This library is free software; you can redistribute it and/or
|
@@ -158,7 +158,7 @@ windows_architectures = [:x86, :x64]
|
|
158
158
|
|
159
159
|
namespace :build do
|
160
160
|
namespace :windows do
|
161
|
-
ruby_versions = "2.1.6:2.2.2:2.3.0:2.4.0"
|
161
|
+
ruby_versions = "2.1.6:2.2.2:2.3.0:2.4.0:2.5.0"
|
162
162
|
|
163
163
|
windows_architectures.each do |architecture|
|
164
164
|
desc "Build gem for Windows #{architecture}"
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,44 @@
|
|
1
1
|
# NEWS
|
2
2
|
|
3
|
+
## 7.1.1: 2018-01-30 {#version-7-1-1}
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Added Groonga 7.1.1 support. Groonga 7.1.0 or older aren't supported.
|
8
|
+
|
9
|
+
* Added Apache Arrow support:
|
10
|
+
|
11
|
+
* {Groonga::Table#load_arrow}
|
12
|
+
|
13
|
+
* {Groonga::Table#dump_arrow}
|
14
|
+
|
15
|
+
* Windows: Added Ruby 2.4 or later support.
|
16
|
+
[groonga-dev,04565][Reported by ongaeshi]
|
17
|
+
|
18
|
+
* {Groonga::ColumnCache}: Added.
|
19
|
+
|
20
|
+
* {Groonga::Expression#parse}: Added `:no_syntax_error` option.
|
21
|
+
|
22
|
+
* {Groonga::Context#support_arrow?}: Added.
|
23
|
+
|
24
|
+
* {Groonga::Procedure#stable?}: Added.
|
25
|
+
|
26
|
+
* {Groonga::Array}: Removed queue support.
|
27
|
+
|
28
|
+
* {Groonga::QueryLogger.flags}: Added.
|
29
|
+
|
30
|
+
* {Groonga::QueryLogger.flags=}: Added.
|
31
|
+
|
32
|
+
* {Groonga::Object#corrupt?}: Added.
|
33
|
+
|
34
|
+
* {Groonga::Object#disk_usage}: Added.
|
35
|
+
|
36
|
+
### Thanks
|
37
|
+
|
38
|
+
* naofumi-fujii
|
39
|
+
|
40
|
+
* ongaeshi
|
41
|
+
|
3
42
|
## 7.0.2: 2017-04-29 {#version-7-0-2}
|
4
43
|
|
5
44
|
### Improvements
|
@@ -13,10 +52,10 @@
|
|
13
52
|
|
14
53
|
* {Groonga::InvertedIndexCursor#closed?}: Added.
|
15
54
|
|
16
|
-
* {Groonga::
|
55
|
+
* {Groonga::Table::KeySupport#key?}: Added.
|
17
56
|
|
18
|
-
* {Groonga::
|
19
|
-
{Groonga::
|
57
|
+
* {Groonga::Table::KeySupport#has_key?}: Deprecated. Use
|
58
|
+
{Groonga::Table::KeySupport#key?} instead.
|
20
59
|
|
21
60
|
* {Groonga::DataColumn#apply_window_function}: Supported `:group_keys`.
|
22
61
|
|
@@ -252,7 +291,7 @@
|
|
252
291
|
* Added {Groonga::Object#accessor?}.
|
253
292
|
* Added {Groonga::Object#key_accessor?}.
|
254
293
|
* Added {Groonga::Database#reindex}.
|
255
|
-
* Added {Groonga::
|
294
|
+
* Added {Groonga::Table::KeySupport#reindex}.
|
256
295
|
* Added {Groonga::FixSizeColumn#reindex}.
|
257
296
|
* Added {Groonga::VariableSizeColumn#reindex}.
|
258
297
|
* Added {Groonga::IndexColumn#reindex}.
|
@@ -1435,7 +1474,7 @@
|
|
1435
1474
|
|
1436
1475
|
* Used :key as the default value of `:order_by` of
|
1437
1476
|
`Groonga::PatriciaTrie#open_cursor`.
|
1438
|
-
* Removed a deprecated Groonga::
|
1477
|
+
* Removed a deprecated Groonga::Table::KeySupport#find.
|
1439
1478
|
* Used ShortText as the default key type of
|
1440
1479
|
Groonga::Hash#create and Groonga::PatriciaTrie#create.
|
1441
1480
|
* Renamed Groonga::Schema#load to Groonga::Schema#restore.
|
@@ -1562,7 +1601,7 @@
|
|
1562
1601
|
* Groonga::Table#find -> Groonga::Table#[]
|
1563
1602
|
* Groonga::Table#find -> obsolete
|
1564
1603
|
* Groonga::Table#[]= -> removed
|
1565
|
-
* Groonga::
|
1604
|
+
* Groonga::Table::KeySupport#[]= is alias of Groonga::Table::KeySupport#add
|
1566
1605
|
* Changed exception class to Groonga::NoSuchColumn from
|
1567
1606
|
Groonga::InvalidArgument when Groonga::Record accesses nonexistent
|
1568
1607
|
a column.
|
@@ -1604,7 +1643,7 @@
|
|
1604
1643
|
|
1605
1644
|
## 0.0.3: 2009-07-18
|
1606
1645
|
|
1607
|
-
* Added Groonga::
|
1646
|
+
* Added Groonga::Table::KeySupport#has_key? [#26145] [Tasuku SUENAGA]
|
1608
1647
|
* Groonga::Record#[] raises an exception for nonexistent
|
1609
1648
|
column name. [#26146] [Tasuku SUENAGA]
|
1610
1649
|
* Supported 32bit environment [niku]
|
data/ext/groonga/rb-grn-array.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2
2
|
/*
|
3
|
-
Copyright (C) 2009-
|
3
|
+
Copyright (C) 2009-2018 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
|
5
5
|
This library is free software; you can redistribute it and/or
|
6
6
|
modify it under the terms of the GNU Lesser General Public
|
@@ -192,274 +192,6 @@ rb_grn_array_add (int argc, VALUE *argv, VALUE self)
|
|
192
192
|
}
|
193
193
|
}
|
194
194
|
|
195
|
-
typedef struct _YieldRecordCallbackData
|
196
|
-
{
|
197
|
-
VALUE self;
|
198
|
-
VALUE record;
|
199
|
-
grn_id id;
|
200
|
-
int status;
|
201
|
-
} YieldRecordCallbackData;
|
202
|
-
|
203
|
-
static VALUE
|
204
|
-
yield_record (VALUE user_data)
|
205
|
-
{
|
206
|
-
YieldRecordCallbackData *data = (YieldRecordCallbackData *)user_data;
|
207
|
-
volatile VALUE record;
|
208
|
-
|
209
|
-
if (data->id == GRN_ID_NIL) {
|
210
|
-
record = Qnil;
|
211
|
-
} else {
|
212
|
-
record = rb_grn_record_new(data->self, data->id, Qnil);
|
213
|
-
}
|
214
|
-
data->record = record;
|
215
|
-
|
216
|
-
return rb_yield(record);
|
217
|
-
}
|
218
|
-
|
219
|
-
static void
|
220
|
-
yield_record_callback (grn_ctx *ctx, grn_array *array,
|
221
|
-
grn_id id, void *user_data)
|
222
|
-
{
|
223
|
-
YieldRecordCallbackData *data = user_data;
|
224
|
-
|
225
|
-
data->id = id;
|
226
|
-
rb_protect(yield_record, (VALUE)(data), &(data->status));
|
227
|
-
}
|
228
|
-
|
229
|
-
/*
|
230
|
-
* Pushes a record to the array. The record should be filled in the
|
231
|
-
* given block. The pushed record can be pulled by
|
232
|
-
* {Groonga::Array#pull}.
|
233
|
-
*
|
234
|
-
* @example A program that pushes a job without error handling
|
235
|
-
* queue = Groonga::Array.create(:name => "CrawlURLQueue")
|
236
|
-
* queue.define_column("url", "ShortText")
|
237
|
-
* urls = ["http://groonga.org/", "http://ranguba.org/"]
|
238
|
-
* urls.each do |url|
|
239
|
-
* queue.push do |record|
|
240
|
-
* record.url = url
|
241
|
-
* end
|
242
|
-
* end
|
243
|
-
*
|
244
|
-
* @example A program that pulls a job without error handling
|
245
|
-
* queue = Groonga::Array.open(:name => "CrawlURLQueue")
|
246
|
-
* loop do
|
247
|
-
* url = nil
|
248
|
-
* queue.pull do |record|
|
249
|
-
* url = record.url
|
250
|
-
* record.delete
|
251
|
-
* end
|
252
|
-
* # Crawl URL
|
253
|
-
* end
|
254
|
-
*
|
255
|
-
* The record that is passed to the given block may be nil. You need
|
256
|
-
* to handle the case. For example, just ignoring it or reports an
|
257
|
-
* error.
|
258
|
-
*
|
259
|
-
* @example A program that pushes a job with error handling
|
260
|
-
* queue = Groonga::Array.create(:name => "CrawlURLQueue")
|
261
|
-
* queue.define_column("url", "ShortText")
|
262
|
-
* urls = ["http://groonga.org/", "http://ranguba.org/"]
|
263
|
-
* urls.each do |url|
|
264
|
-
* queue.push do |record|
|
265
|
-
* record.url = url if record # check record is not nil
|
266
|
-
* end
|
267
|
-
* end
|
268
|
-
*
|
269
|
-
* If an error is occurred in the given block, the pushed record may
|
270
|
-
* not be filled completely. You should handle the case in pull side.
|
271
|
-
*
|
272
|
-
* @example A program that has an error in push block
|
273
|
-
* queue = Groonga::Array.create(:name => "CrawlURLQueue")
|
274
|
-
* queue.define_column("url", "ShortText")
|
275
|
-
* urls = ["http://groonga.org/", "http://ranguba.org/"]
|
276
|
-
* urls.each do |url|
|
277
|
-
* queue.push do |record|
|
278
|
-
* record.url = uri # Typo! It should be ur*l* not ur*i*
|
279
|
-
* # record.url isn't set
|
280
|
-
* end
|
281
|
-
* end
|
282
|
-
*
|
283
|
-
* @example A program that pulls a job with error handling
|
284
|
-
* queue = Groonga::Array.open(:name => "CrawlURLQueue")
|
285
|
-
* loop do
|
286
|
-
* url = nil
|
287
|
-
* queue.pull do |record|
|
288
|
-
* url = record.url # record.url is nil!
|
289
|
-
* record.delete
|
290
|
-
* end
|
291
|
-
* next if url.nil? # Ignore an uncompleted added job
|
292
|
-
* # Crawl URL
|
293
|
-
* end
|
294
|
-
*
|
295
|
-
* @overload push
|
296
|
-
* @yield [record] Filles columns of a pushed record in the given block.
|
297
|
-
* @yieldparam record [Groonga::Record or nil]
|
298
|
-
* A pushed record. It is nil when pushing is failed.
|
299
|
-
* @return [Groonga::Record or nil] A pushed record that is yielded.
|
300
|
-
*
|
301
|
-
*/
|
302
|
-
static VALUE
|
303
|
-
rb_grn_array_push (VALUE self)
|
304
|
-
{
|
305
|
-
grn_ctx *context = NULL;
|
306
|
-
grn_obj *table;
|
307
|
-
YieldRecordCallbackData data;
|
308
|
-
|
309
|
-
if (!rb_block_given_p()) {
|
310
|
-
rb_raise(rb_eArgError,
|
311
|
-
"tried to call Groonga::Array#push without a block");
|
312
|
-
}
|
313
|
-
|
314
|
-
table = SELF(self, &context);
|
315
|
-
|
316
|
-
data.self = self;
|
317
|
-
data.record = Qnil;
|
318
|
-
data.status = 0;
|
319
|
-
grn_array_push(context, (grn_array *)table, yield_record_callback, &data);
|
320
|
-
if (data.status != 0) {
|
321
|
-
rb_jump_tag(data.status);
|
322
|
-
}
|
323
|
-
rb_grn_context_check(context, self);
|
324
|
-
|
325
|
-
return data.record;
|
326
|
-
}
|
327
|
-
|
328
|
-
/*
|
329
|
-
* Pulls a record from the array. The required values should be
|
330
|
-
* retrieved in the given block.
|
331
|
-
*
|
332
|
-
* If {Groonga::Array#push} failes to fill values of the pushed
|
333
|
-
* record, the pulled record may be uncompleted. It should be handled
|
334
|
-
* by your application.
|
335
|
-
*
|
336
|
-
* If you passes @:block? => true@ option, the pull operation blocks
|
337
|
-
* until a pushed record is pushed. It is the default behavior.
|
338
|
-
*
|
339
|
-
* If you passes @:block? => false@ option, the pull operation returns
|
340
|
-
* immediately, the given block isn't called and returns nil when no
|
341
|
-
* record exist in the array.
|
342
|
-
*
|
343
|
-
* @example A program that pulls with non-block mode
|
344
|
-
* queue = Groonga::Array.open(:name => "CrawlURLQueue")
|
345
|
-
* loop do
|
346
|
-
* url = nil
|
347
|
-
* # The case for no pushed records in the array.
|
348
|
-
* pulled_record = queue.pull(:block? => false) do |record|
|
349
|
-
* # This block isn't called
|
350
|
-
* url = record.url
|
351
|
-
* record.delete
|
352
|
-
* end
|
353
|
-
* p pulled_record.nil? # => true
|
354
|
-
* end
|
355
|
-
*
|
356
|
-
* Note that your signal handlers can't be ran while a pull
|
357
|
-
* operation. You need to use {Groonga::Array#unblock} from
|
358
|
-
* another process to unblock the pull operation. If you call
|
359
|
-
* {Groonga::Array#unblock}, signal handler can be ran.
|
360
|
-
*
|
361
|
-
* @example Signal handler isn't called
|
362
|
-
* queue = Groonga::Array.open(:name => "CrawlURLQueue")
|
363
|
-
* trap(:INT) do
|
364
|
-
* p :not_called!
|
365
|
-
* end
|
366
|
-
* queue.pull do |record|
|
367
|
-
* # Send SIGINT while blocking the pull operation.
|
368
|
-
* # The signal handler isn't called.
|
369
|
-
* end
|
370
|
-
*
|
371
|
-
* @see Groonga::Array#push Examples exist in the push documentation.
|
372
|
-
*
|
373
|
-
* @overload pull(options={})
|
374
|
-
* @param [::Hash] options The option parameters.
|
375
|
-
* @option options [Boolean] :block? (true)
|
376
|
-
* Whether the pull operation is blocked or not when no record exist
|
377
|
-
* in the array.
|
378
|
-
* @yield [record] Gets required values for a pull record in the given block.
|
379
|
-
* @yieldparam record [Groonga::Record or nil]
|
380
|
-
* A pulled record. It is nil when no records exist in the array
|
381
|
-
* and @block?@ parameter is not @true@.
|
382
|
-
* @return [Groonga::Record or nil] A pulled record that is yielded.
|
383
|
-
*
|
384
|
-
*/
|
385
|
-
static VALUE
|
386
|
-
rb_grn_array_pull (int argc, VALUE *argv, VALUE self)
|
387
|
-
{
|
388
|
-
grn_ctx *context = NULL;
|
389
|
-
grn_obj *table;
|
390
|
-
VALUE options;
|
391
|
-
VALUE rb_block_p;
|
392
|
-
YieldRecordCallbackData data;
|
393
|
-
|
394
|
-
rb_scan_args(argc, argv, "01", &options);
|
395
|
-
|
396
|
-
rb_grn_scan_options(options,
|
397
|
-
"block?", &rb_block_p,
|
398
|
-
NULL);
|
399
|
-
|
400
|
-
if (!rb_block_given_p()) {
|
401
|
-
rb_raise(rb_eArgError,
|
402
|
-
"tried to call Groonga::Array#pull without a block");
|
403
|
-
}
|
404
|
-
|
405
|
-
table = SELF(self, &context);
|
406
|
-
|
407
|
-
if (NIL_P(rb_block_p)) {
|
408
|
-
rb_block_p = Qtrue;
|
409
|
-
}
|
410
|
-
|
411
|
-
data.self = self;
|
412
|
-
data.record = Qnil;
|
413
|
-
data.status = 0;
|
414
|
-
grn_array_pull(context, (grn_array *)table, RVAL2CBOOL(rb_block_p),
|
415
|
-
yield_record_callback, &data);
|
416
|
-
if (data.status != 0) {
|
417
|
-
rb_jump_tag(data.status);
|
418
|
-
}
|
419
|
-
rb_grn_context_check(context, self);
|
420
|
-
|
421
|
-
return data.record;
|
422
|
-
}
|
423
|
-
|
424
|
-
/*
|
425
|
-
* Unblocks all {Groonga::Array#pull} operations for the array.
|
426
|
-
*
|
427
|
-
* @example Pull, unblock and signal
|
428
|
-
* # pull.rb
|
429
|
-
* queue = Groonga::Array.open(:name => "CrawlURLQueue")
|
430
|
-
* trap(:INT) do
|
431
|
-
* p :called!
|
432
|
-
* end
|
433
|
-
* queue.pull do |record|
|
434
|
-
* # 1. Send SIGINT while blocking the pull operation.
|
435
|
-
* # The signal handler isn't called.
|
436
|
-
* # 2. Run unblock.rb.
|
437
|
-
* # The signal handler is called!
|
438
|
-
* end
|
439
|
-
*
|
440
|
-
* # unblock.rb
|
441
|
-
* queue = Groonga::Array.open(:name => "CrawlURLQueue")
|
442
|
-
* queue.unblock
|
443
|
-
*
|
444
|
-
* @see Groonga::Array#pull
|
445
|
-
*
|
446
|
-
* @overload unblock
|
447
|
-
* @return [void]
|
448
|
-
*
|
449
|
-
*/
|
450
|
-
static VALUE
|
451
|
-
rb_grn_array_unblock (VALUE self)
|
452
|
-
{
|
453
|
-
grn_ctx *context = NULL;
|
454
|
-
grn_obj *table;
|
455
|
-
|
456
|
-
table = SELF(self, &context);
|
457
|
-
|
458
|
-
grn_array_unblock(context, (grn_array *)table);
|
459
|
-
|
460
|
-
return Qnil;
|
461
|
-
}
|
462
|
-
|
463
195
|
void
|
464
196
|
rb_grn_init_array (VALUE mGrn)
|
465
197
|
{
|
@@ -469,7 +201,4 @@ rb_grn_init_array (VALUE mGrn)
|
|
469
201
|
rb_grn_array_s_create, -1);
|
470
202
|
|
471
203
|
rb_define_method(rb_cGrnArray, "add", rb_grn_array_add, -1);
|
472
|
-
rb_define_method(rb_cGrnArray, "push", rb_grn_array_push, 0);
|
473
|
-
rb_define_method(rb_cGrnArray, "pull", rb_grn_array_pull, -1);
|
474
|
-
rb_define_method(rb_cGrnArray, "unblock", rb_grn_array_unblock, 0);
|
475
204
|
}
|
@@ -0,0 +1,240 @@
|
|
1
|
+
/* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2
|
+
/* vim: set sts=4 sw=4 ts=8 noet: */
|
3
|
+
/*
|
4
|
+
Copyright (C) 2018 Kouhei Sutou <kou@clear-code.com>
|
5
|
+
|
6
|
+
This library is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU Lesser General Public
|
8
|
+
License version 2.1 as published by the Free Software Foundation.
|
9
|
+
|
10
|
+
This library is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public
|
16
|
+
License along with this library; if not, write to the Free Software
|
17
|
+
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "rb-grn.h"
|
21
|
+
|
22
|
+
/*
|
23
|
+
* Document-class: Groonga::ColumnCache
|
24
|
+
*
|
25
|
+
* This is a class for accelerating column value read.
|
26
|
+
*
|
27
|
+
* {Groonga::FixSizeColumn} is only supported for now.
|
28
|
+
*
|
29
|
+
* @since 7.1.1
|
30
|
+
*/
|
31
|
+
|
32
|
+
VALUE rb_cGrnColumnCache;
|
33
|
+
|
34
|
+
static void
|
35
|
+
rb_grn_column_cache_mark(void *data)
|
36
|
+
{
|
37
|
+
RbGrnColumnCache *rb_grn_column_cache = data;
|
38
|
+
|
39
|
+
if (!rb_grn_column_cache->column_cache)
|
40
|
+
return;
|
41
|
+
|
42
|
+
rb_gc_mark(rb_grn_column_cache->rb_column);
|
43
|
+
}
|
44
|
+
|
45
|
+
static void
|
46
|
+
rb_grn_column_cache_free(void *data)
|
47
|
+
{
|
48
|
+
RbGrnColumnCache *rb_grn_column_cache = data;
|
49
|
+
|
50
|
+
if (!rb_grn_column_cache->column_cache)
|
51
|
+
return;
|
52
|
+
|
53
|
+
GRN_OBJ_FIN(rb_grn_column_cache->context,
|
54
|
+
&(rb_grn_column_cache->buffer));
|
55
|
+
grn_column_cache_close(rb_grn_column_cache->context,
|
56
|
+
rb_grn_column_cache->column_cache);
|
57
|
+
}
|
58
|
+
|
59
|
+
static rb_data_type_t data_type = {
|
60
|
+
"Groonga::ColumnCache",
|
61
|
+
{
|
62
|
+
rb_grn_column_cache_mark,
|
63
|
+
rb_grn_column_cache_free,
|
64
|
+
NULL,
|
65
|
+
},
|
66
|
+
NULL,
|
67
|
+
NULL,
|
68
|
+
RUBY_TYPED_FREE_IMMEDIATELY
|
69
|
+
};
|
70
|
+
|
71
|
+
static VALUE
|
72
|
+
rb_grn_column_cache_allocate (VALUE klass)
|
73
|
+
{
|
74
|
+
return TypedData_Wrap_Struct(klass, &data_type, NULL);
|
75
|
+
}
|
76
|
+
|
77
|
+
static VALUE rb_grn_column_cache_close (VALUE self);
|
78
|
+
|
79
|
+
/*
|
80
|
+
* Opens a new column cache and passes to the given block. The opened
|
81
|
+
* column cache is closed after the given block is finished.
|
82
|
+
*
|
83
|
+
* @overload open(column) {|column_cache| ...}
|
84
|
+
* @param column [Groonga::Column] The column to be cached.
|
85
|
+
*
|
86
|
+
* @yieldparam [Groonga::ColumnCache] The opened column cache.
|
87
|
+
*
|
88
|
+
* @return [Object] The object returned by the given block.
|
89
|
+
*/
|
90
|
+
static VALUE
|
91
|
+
rb_grn_column_cache_s_open (VALUE klass, VALUE rb_column)
|
92
|
+
{
|
93
|
+
VALUE rb_column_cache;
|
94
|
+
|
95
|
+
rb_column_cache = rb_funcall(klass, rb_intern("new"), 1, rb_column);
|
96
|
+
if (rb_block_given_p()) {
|
97
|
+
return rb_ensure(rb_yield, rb_column_cache,
|
98
|
+
rb_grn_column_cache_close, rb_column_cache);
|
99
|
+
} else {
|
100
|
+
return rb_column_cache;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
/*
|
105
|
+
* @overload initialize(column)
|
106
|
+
* @param column [Groonga::Column] The column to be cached.
|
107
|
+
*
|
108
|
+
* @return [Groonga::ColumnCache] Create a new column cache.
|
109
|
+
*/
|
110
|
+
static VALUE
|
111
|
+
rb_grn_column_cache_initialize (VALUE self, VALUE rb_column)
|
112
|
+
{
|
113
|
+
RbGrnColumnCache *rb_grn_column_cache;
|
114
|
+
grn_ctx *context;
|
115
|
+
grn_obj *column;
|
116
|
+
grn_id range_id;
|
117
|
+
|
118
|
+
rb_grn_column_cache = ALLOC(RbGrnColumnCache);
|
119
|
+
rb_grn_column_cache->self = self;
|
120
|
+
rb_grn_column_cache->context = NULL;
|
121
|
+
rb_grn_column_cache->rb_column = rb_column;
|
122
|
+
rb_grn_column_cache->column_cache = NULL;
|
123
|
+
DATA_PTR(self) = rb_grn_column_cache;
|
124
|
+
|
125
|
+
column = RVAL2GRNCOLUMN(rb_column, &(rb_grn_column_cache->context));
|
126
|
+
context = rb_grn_column_cache->context;
|
127
|
+
rb_grn_column_cache->column_cache = grn_column_cache_open(context, column);
|
128
|
+
if (!rb_grn_column_cache->column_cache) {
|
129
|
+
rb_raise(rb_eArgError,
|
130
|
+
"failed to create column cache: %s%s%" PRIsVALUE,
|
131
|
+
context->rc == GRN_SUCCESS ? "" : context->errbuf,
|
132
|
+
context->rc == GRN_SUCCESS ? "" : ": ",
|
133
|
+
rb_column);
|
134
|
+
}
|
135
|
+
|
136
|
+
range_id = grn_obj_get_range(context, column);
|
137
|
+
GRN_VALUE_FIX_SIZE_INIT(&(rb_grn_column_cache->buffer),
|
138
|
+
GRN_OBJ_DO_SHALLOW_COPY,
|
139
|
+
range_id);
|
140
|
+
rb_grn_column_cache->range = grn_ctx_at(context, range_id);
|
141
|
+
rb_grn_column_cache->table = grn_ctx_at(context, column->header.domain);
|
142
|
+
|
143
|
+
return Qnil;
|
144
|
+
}
|
145
|
+
|
146
|
+
/*
|
147
|
+
* @overload [](id)
|
148
|
+
* @param id [Integer, Groonga::Record] The record ID for the
|
149
|
+
* column value.
|
150
|
+
*
|
151
|
+
* @return [Object] The value for the record ID.
|
152
|
+
*/
|
153
|
+
static VALUE
|
154
|
+
rb_grn_column_cache_array_reference (VALUE self, VALUE rb_id)
|
155
|
+
{
|
156
|
+
RbGrnColumnCache *rb_grn_column_cache;
|
157
|
+
grn_id id;
|
158
|
+
void *value;
|
159
|
+
size_t value_size = 0;
|
160
|
+
|
161
|
+
TypedData_Get_Struct(self,
|
162
|
+
RbGrnColumnCache,
|
163
|
+
&data_type,
|
164
|
+
rb_grn_column_cache);
|
165
|
+
|
166
|
+
if (!rb_grn_column_cache->column_cache) {
|
167
|
+
return Qnil;
|
168
|
+
}
|
169
|
+
|
170
|
+
id = rb_grn_id_from_ruby_object(rb_id,
|
171
|
+
rb_grn_column_cache->context,
|
172
|
+
rb_grn_column_cache->table,
|
173
|
+
self);
|
174
|
+
value = grn_column_cache_ref(rb_grn_column_cache->context,
|
175
|
+
rb_grn_column_cache->column_cache,
|
176
|
+
id,
|
177
|
+
&value_size);
|
178
|
+
rb_grn_context_check(rb_grn_column_cache->context, self);
|
179
|
+
GRN_TEXT_SET_REF(&(rb_grn_column_cache->buffer),
|
180
|
+
value,
|
181
|
+
value_size);
|
182
|
+
|
183
|
+
return GRNBULK2RVAL(rb_grn_column_cache->context,
|
184
|
+
&(rb_grn_column_cache->buffer),
|
185
|
+
rb_grn_column_cache->range,
|
186
|
+
self);
|
187
|
+
}
|
188
|
+
|
189
|
+
/*
|
190
|
+
* @overload close
|
191
|
+
* @return [void] Close the column cache.
|
192
|
+
*/
|
193
|
+
static VALUE
|
194
|
+
rb_grn_column_cache_close (VALUE self)
|
195
|
+
{
|
196
|
+
RbGrnColumnCache *rb_grn_column_cache;
|
197
|
+
|
198
|
+
TypedData_Get_Struct(self,
|
199
|
+
RbGrnColumnCache,
|
200
|
+
&data_type,
|
201
|
+
rb_grn_column_cache);
|
202
|
+
|
203
|
+
if (rb_grn_column_cache->column_cache) {
|
204
|
+
GRN_OBJ_FIN(rb_grn_column_cache->context,
|
205
|
+
&(rb_grn_column_cache->buffer));
|
206
|
+
grn_column_cache_close(rb_grn_column_cache->context,
|
207
|
+
rb_grn_column_cache->column_cache);
|
208
|
+
rb_grn_column_cache->column_cache = NULL;
|
209
|
+
rb_grn_context_check(rb_grn_column_cache->context, self);
|
210
|
+
}
|
211
|
+
|
212
|
+
return Qnil;
|
213
|
+
}
|
214
|
+
|
215
|
+
void
|
216
|
+
rb_grn_init_column_cache (VALUE mGrn)
|
217
|
+
{
|
218
|
+
rb_cGrnColumnCache =
|
219
|
+
rb_define_class_under(mGrn, "ColumnCache", rb_cData);
|
220
|
+
|
221
|
+
rb_define_alloc_func(rb_cGrnColumnCache, rb_grn_column_cache_allocate);
|
222
|
+
|
223
|
+
rb_define_singleton_method(rb_cGrnColumnCache,
|
224
|
+
"open",
|
225
|
+
rb_grn_column_cache_s_open,
|
226
|
+
1);
|
227
|
+
|
228
|
+
rb_define_method(rb_cGrnColumnCache,
|
229
|
+
"initialize",
|
230
|
+
rb_grn_column_cache_initialize,
|
231
|
+
1);
|
232
|
+
rb_define_method(rb_cGrnColumnCache,
|
233
|
+
"[]",
|
234
|
+
rb_grn_column_cache_array_reference,
|
235
|
+
1);
|
236
|
+
rb_define_method(rb_cGrnColumnCache,
|
237
|
+
"close",
|
238
|
+
rb_grn_column_cache_close,
|
239
|
+
0);
|
240
|
+
}
|