rroonga 7.0.2 → 7.1.1
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.
- 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
|
+
}
|