rroonga 6.1.3 → 7.0.2
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/doc/text/news.md +28 -0
- data/ext/groonga/rb-grn-column.c +53 -32
- data/ext/groonga/rb-grn-context.c +1 -1
- data/ext/groonga/rb-grn-data-column.c +103 -0
- data/ext/groonga/rb-grn-default-cache.c +104 -0
- data/ext/groonga/rb-grn-index-column.c +93 -15
- data/ext/groonga/rb-grn-inverted-index-cursor.c +269 -0
- data/ext/groonga/rb-grn-object.c +1 -1
- data/ext/groonga/rb-grn-plugin.c +1 -1
- data/ext/groonga/rb-grn-table-cursor.c +1 -1
- data/ext/groonga/rb-grn-table-key-support.c +6 -0
- data/ext/groonga/rb-grn-table.c +0 -3
- data/ext/groonga/rb-grn-utils.c +35 -7
- data/ext/groonga/rb-grn.h +13 -4
- data/ext/groonga/rb-groonga.c +2 -0
- data/rroonga-build.rb +7 -7
- data/test/test-data-column.rb +71 -2
- data/test/test-default-cache.rb +43 -0
- data/test/test-double-array-trie.rb +7 -0
- data/test/test-fix-size-column.rb +12 -0
- data/test/test-hash.rb +7 -0
- data/test/test-index-column.rb +12 -0
- data/test/test-index-cursor.rb +93 -28
- data/test/test-patricia-trie.rb +7 -0
- data/test/test-variable-size-column.rb +19 -0
- metadata +63 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1349d0af1d5185ee0bdd44af2b212dcf55a28e7a
|
4
|
+
data.tar.gz: cfa39b3cf8128946bb1d22d9ee39bc8c39c0860c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4a58abe995dd332f77d4e6e36ad837469e6a9653bb3be44ed2fe297c3cfdf5c061f7a76b90de2b045454e79215ac913eb32a9d29718bbafb38dfad65bc44fd8
|
7
|
+
data.tar.gz: 1a89ed23b0b257a227998309d9297ccfd10fe5f14feb7d77974ce21ea9d0e34d530c6ffbf35e4fb8ff21236b1f43f7dec7dbce76c1f7f3b9c62c403306ffb875
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,33 @@
|
|
1
1
|
# NEWS
|
2
2
|
|
3
|
+
## 7.0.2: 2017-04-29 {#version-7-0-2}
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Supported Groonga 7.0.2. Groonga 7.0.1 or older aren't supported.
|
8
|
+
|
9
|
+
* {Groonga::IndexColumn#open_cursor}: Supported opening a cursor by
|
10
|
+
token.
|
11
|
+
|
12
|
+
* {Groonga::IndexColumn#[]}: Supported a token.
|
13
|
+
|
14
|
+
* {Groonga::InvertedIndexCursor#closed?}: Added.
|
15
|
+
|
16
|
+
* {Groonga::TableKeySupport#key?}: Added.
|
17
|
+
|
18
|
+
* {Groonga::TableKeySupport#has_key?}: Deprecated. Use
|
19
|
+
{Groonga::TableKeySupport#key?} instead.
|
20
|
+
|
21
|
+
* {Groonga::DataColumn#apply_window_function}: Supported `:group_keys`.
|
22
|
+
|
23
|
+
* {Groonga::Column#weight_vector?}: Added.
|
24
|
+
|
25
|
+
* {Groonga::DataColumn#apply_expression}: Added.
|
26
|
+
|
27
|
+
* {Groonga::Column#data?}: Added.
|
28
|
+
|
29
|
+
* {Groonga::DefaultCache}: Added.
|
30
|
+
|
3
31
|
## 6.1.3: 2017-01-12 {#version-6-1-3}
|
4
32
|
|
5
33
|
### Improvements
|
data/ext/groonga/rb-grn-column.c
CHANGED
@@ -609,12 +609,11 @@ rb_grn_column_truncate (VALUE self)
|
|
609
609
|
}
|
610
610
|
|
611
611
|
/*
|
612
|
-
*
|
613
|
-
*
|
612
|
+
* @overload index?
|
613
|
+
* @return [Bool] `true` if the column is an index column
|
614
|
+
* ({Groonga::IndexColumn}), `false` otherwise.
|
614
615
|
*
|
615
616
|
* @since 1.0.5
|
616
|
-
*
|
617
|
-
* @overload index?
|
618
617
|
*/
|
619
618
|
static VALUE
|
620
619
|
rb_grn_column_index_p (VALUE self)
|
@@ -634,64 +633,83 @@ rb_grn_column_index_p (VALUE self)
|
|
634
633
|
}
|
635
634
|
|
636
635
|
/*
|
637
|
-
*
|
638
|
-
*
|
636
|
+
* @overload vector?
|
637
|
+
* @return [Bool] `true` if the column is a vector column,
|
638
|
+
* `false` otherwise.
|
639
639
|
*
|
640
640
|
* @since 1.0.5
|
641
|
-
*
|
642
|
-
* @overload vector?
|
643
641
|
*/
|
644
642
|
static VALUE
|
645
643
|
rb_grn_column_vector_p (VALUE self)
|
646
644
|
{
|
647
645
|
grn_ctx *context;
|
648
646
|
grn_obj *column;
|
649
|
-
grn_column_flags flags;
|
650
|
-
grn_column_flags column_type;
|
651
647
|
|
652
648
|
rb_grn_column_deconstruct(SELF(self), &column, &context,
|
653
649
|
NULL, NULL,
|
654
650
|
NULL, NULL, NULL);
|
655
651
|
|
656
|
-
|
657
|
-
|
658
|
-
}
|
652
|
+
return CBOOL2RVAL(grn_obj_is_vector_column(context, column));
|
653
|
+
}
|
659
654
|
|
660
|
-
|
661
|
-
|
662
|
-
|
655
|
+
/*
|
656
|
+
* @overload weight_vector?
|
657
|
+
* @return [Bool] `true` if the column is a weight vector column,
|
658
|
+
* `false` otherwise.
|
659
|
+
*
|
660
|
+
* @since 7.0.2
|
661
|
+
*/
|
662
|
+
static VALUE
|
663
|
+
rb_grn_column_weight_vector_p (VALUE self)
|
664
|
+
{
|
665
|
+
grn_ctx *context;
|
666
|
+
grn_obj *column;
|
667
|
+
|
668
|
+
rb_grn_column_deconstruct(SELF(self), &column, &context,
|
669
|
+
NULL, NULL,
|
670
|
+
NULL, NULL, NULL);
|
671
|
+
|
672
|
+
return CBOOL2RVAL(grn_obj_is_weight_vector_column(context, column));
|
663
673
|
}
|
664
674
|
|
665
675
|
/*
|
666
|
-
*
|
667
|
-
*
|
676
|
+
* @overload scalar?
|
677
|
+
* @return [Bool] `true` if the column is a scalar column,
|
678
|
+
* `false` otherwise.
|
668
679
|
*
|
669
680
|
* @since 1.0.5
|
670
|
-
*
|
671
|
-
* @overload scalar?
|
672
681
|
*/
|
673
682
|
static VALUE
|
674
683
|
rb_grn_column_scalar_p (VALUE self)
|
675
684
|
{
|
676
685
|
grn_ctx *context;
|
677
686
|
grn_obj *column;
|
678
|
-
grn_column_flags flags;
|
679
|
-
grn_column_flags column_type;
|
680
687
|
|
681
688
|
rb_grn_column_deconstruct(SELF(self), &column, &context,
|
682
689
|
NULL, NULL,
|
683
690
|
NULL, NULL, NULL);
|
684
691
|
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
692
|
+
return CBOOL2RVAL(grn_obj_is_scalar_column(context, column));
|
693
|
+
}
|
694
|
+
|
695
|
+
/*
|
696
|
+
* @overload data?
|
697
|
+
* @return [Bool] `true` if the column is a data column (a scalar
|
698
|
+
* column or a vector column), `false` otherwise.
|
699
|
+
*
|
700
|
+
* @since 7.0.2
|
701
|
+
*/
|
702
|
+
static VALUE
|
703
|
+
rb_grn_column_data_p (VALUE self)
|
704
|
+
{
|
705
|
+
grn_ctx *context;
|
706
|
+
grn_obj *column;
|
707
|
+
|
708
|
+
rb_grn_column_deconstruct(SELF(self), &column, &context,
|
709
|
+
NULL, NULL,
|
710
|
+
NULL, NULL, NULL);
|
711
|
+
|
712
|
+
return CBOOL2RVAL(grn_obj_is_data_column(context, column));
|
695
713
|
}
|
696
714
|
|
697
715
|
/*
|
@@ -842,7 +860,10 @@ rb_grn_init_column (VALUE mGrn)
|
|
842
860
|
/* deprecated: backward compatibility */
|
843
861
|
rb_define_alias(rb_cGrnColumn, "index_column?", "index?");
|
844
862
|
rb_define_method(rb_cGrnColumn, "vector?", rb_grn_column_vector_p, 0);
|
863
|
+
rb_define_method(rb_cGrnColumn, "weight_vector?",
|
864
|
+
rb_grn_column_weight_vector_p, 0);
|
845
865
|
rb_define_method(rb_cGrnColumn, "scalar?", rb_grn_column_scalar_p, 0);
|
866
|
+
rb_define_method(rb_cGrnColumn, "data?", rb_grn_column_data_p, 0);
|
846
867
|
|
847
868
|
rb_define_method(rb_cGrnColumn, "with_weight?",
|
848
869
|
rb_grn_column_with_weight_p, 0);
|
@@ -991,7 +991,7 @@ rb_grn_context_object_created (VALUE rb_context, VALUE rb_object)
|
|
991
991
|
void
|
992
992
|
rb_grn_init_context (VALUE mGrn)
|
993
993
|
{
|
994
|
-
cGrnContext = rb_define_class_under(mGrn, "Context",
|
994
|
+
cGrnContext = rb_define_class_under(mGrn, "Context", rb_cData);
|
995
995
|
rb_define_alloc_func(cGrnContext, rb_grn_context_alloc);
|
996
996
|
|
997
997
|
rb_cv_set(cGrnContext, "@@default", Qnil);
|
@@ -70,6 +70,9 @@ VALUE rb_cGrnDataColumn;
|
|
70
70
|
* @overload apply_window_function(options={}) {|record| }
|
71
71
|
* @param options [::Hash] The name and value pairs.
|
72
72
|
* @option options [::Array<String>] :sort_keys
|
73
|
+
* TODO: Description.
|
74
|
+
* @option options [::Array<String>] :group_keys
|
75
|
+
* TODO: Description.
|
73
76
|
*
|
74
77
|
* @yield [record]
|
75
78
|
* It yields an object that builds expression. The block must
|
@@ -93,6 +96,7 @@ rb_grn_data_column_apply_window_function (int argc, VALUE *argv, VALUE self)
|
|
93
96
|
grn_obj *window_function_call = NULL;
|
94
97
|
VALUE rb_options;
|
95
98
|
VALUE rb_sort_keys;
|
99
|
+
VALUE rb_group_keys;
|
96
100
|
VALUE rb_builder;
|
97
101
|
VALUE rb_window_function_call;
|
98
102
|
|
@@ -106,6 +110,7 @@ rb_grn_data_column_apply_window_function (int argc, VALUE *argv, VALUE self)
|
|
106
110
|
rb_scan_args(argc, argv, "01", &rb_options);
|
107
111
|
rb_grn_scan_options(rb_options,
|
108
112
|
"sort_keys", &rb_sort_keys,
|
113
|
+
"group_keys", &rb_group_keys,
|
109
114
|
NULL);
|
110
115
|
|
111
116
|
if (!NIL_P(rb_sort_keys)) {
|
@@ -126,6 +131,24 @@ rb_grn_data_column_apply_window_function (int argc, VALUE *argv, VALUE self)
|
|
126
131
|
rb_table);
|
127
132
|
}
|
128
133
|
|
134
|
+
if (!NIL_P(rb_group_keys)) {
|
135
|
+
VALUE rb_table;
|
136
|
+
|
137
|
+
if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_group_keys, rb_cArray)))
|
138
|
+
rb_raise(rb_eArgError, ":group_keys should be an array of key: <%s>",
|
139
|
+
rb_grn_inspect(rb_group_keys));
|
140
|
+
|
141
|
+
definition.n_group_keys = RARRAY_LEN(rb_group_keys);
|
142
|
+
definition.group_keys = ALLOCA_N(grn_table_sort_key,
|
143
|
+
definition.n_group_keys);
|
144
|
+
rb_table = GRNOBJECT2RVAL(Qnil, context, table, GRN_FALSE);
|
145
|
+
rb_grn_table_sort_keys_fill(context,
|
146
|
+
definition.group_keys,
|
147
|
+
definition.n_group_keys,
|
148
|
+
rb_group_keys,
|
149
|
+
rb_table);
|
150
|
+
}
|
151
|
+
|
129
152
|
rb_builder = rb_grn_record_expression_builder_new(rb_table, Qnil);
|
130
153
|
rb_window_function_call =
|
131
154
|
rb_grn_record_expression_builder_build(rb_builder);
|
@@ -144,6 +167,84 @@ rb_grn_data_column_apply_window_function (int argc, VALUE *argv, VALUE self)
|
|
144
167
|
return self;
|
145
168
|
}
|
146
169
|
|
170
|
+
/*
|
171
|
+
* Applies the expression to all records in the table of the
|
172
|
+
* column. Results are stored into the column.
|
173
|
+
*
|
174
|
+
* @example Compute column values from other column values.
|
175
|
+
*
|
176
|
+
* Groonga::Schema.define do |schema|
|
177
|
+
* schema.create_table("Comments") do |table|
|
178
|
+
* # The column that has base data to compute "plus1" column data.
|
179
|
+
* table.uint32("base")
|
180
|
+
* # The column for storing computed value with "base" column data.
|
181
|
+
* table.uint32("plus1")
|
182
|
+
* end
|
183
|
+
* end
|
184
|
+
* comments = Groonga["Comments"]
|
185
|
+
* plus1 = Groonga["Comments.plus1"]
|
186
|
+
*
|
187
|
+
* 3.times do |i|
|
188
|
+
* comments.add(:base => i)
|
189
|
+
* end
|
190
|
+
*
|
191
|
+
* plus1.apply_expression do |record|
|
192
|
+
* # Computes "base" column value plus one.
|
193
|
+
* record.base + 1
|
194
|
+
* end
|
195
|
+
*
|
196
|
+
* comments.each do |comment|
|
197
|
+
* p [comment.base, comment.plus1]
|
198
|
+
* # -> [0, 1]
|
199
|
+
* # -> [1, 2]
|
200
|
+
* # -> [2, 3]
|
201
|
+
* end
|
202
|
+
*
|
203
|
+
* @overload apply_expression {|record| }
|
204
|
+
*
|
205
|
+
* @yield [record]
|
206
|
+
* It yields an object that builds expression. The block must
|
207
|
+
* build an expression to be applied to all records.
|
208
|
+
* @yieldparam [Groonga::RecordExpressionBuilder] record
|
209
|
+
* The expression builder to create an expression.
|
210
|
+
* @yieldreturn [Groonga::ExpressionBuilder]
|
211
|
+
* It must be an expression.
|
212
|
+
*
|
213
|
+
* @since 7.0.2
|
214
|
+
*/
|
215
|
+
static VALUE
|
216
|
+
rb_grn_data_column_apply_expression (VALUE self)
|
217
|
+
{
|
218
|
+
grn_rc rc;
|
219
|
+
grn_ctx *context;
|
220
|
+
grn_obj *column;
|
221
|
+
grn_obj *table;
|
222
|
+
VALUE rb_table;
|
223
|
+
grn_obj *expression = NULL;
|
224
|
+
VALUE rb_builder;
|
225
|
+
VALUE rb_expression;
|
226
|
+
|
227
|
+
rb_grn_column_deconstruct(SELF(self), &column, &context,
|
228
|
+
NULL, &table,
|
229
|
+
NULL, NULL, NULL);
|
230
|
+
rb_table = GRNOBJECT2RVAL(Qnil, context, table, GRN_FALSE);
|
231
|
+
|
232
|
+
rb_builder = rb_grn_record_expression_builder_new(rb_table, Qnil);
|
233
|
+
rb_expression = rb_grn_record_expression_builder_build(rb_builder);
|
234
|
+
rb_grn_object_deconstruct(RB_GRN_OBJECT(DATA_PTR(rb_expression)),
|
235
|
+
&expression, NULL,
|
236
|
+
NULL, NULL, NULL, NULL);
|
237
|
+
|
238
|
+
rc = grn_table_apply_expr(context,
|
239
|
+
table,
|
240
|
+
column,
|
241
|
+
expression);
|
242
|
+
rb_grn_context_check(context, self);
|
243
|
+
rb_grn_rc_check(rc, self);
|
244
|
+
|
245
|
+
return self;
|
246
|
+
}
|
247
|
+
|
147
248
|
void
|
148
249
|
rb_grn_init_data_column (VALUE mGrn)
|
149
250
|
{
|
@@ -151,6 +252,8 @@ rb_grn_init_data_column (VALUE mGrn)
|
|
151
252
|
|
152
253
|
rb_define_method(rb_cGrnDataColumn, "apply_window_function",
|
153
254
|
rb_grn_data_column_apply_window_function, -1);
|
255
|
+
rb_define_method(rb_cGrnDataColumn, "apply_expression",
|
256
|
+
rb_grn_data_column_apply_expression, 0);
|
154
257
|
|
155
258
|
rb_grn_init_fix_size_column(mGrn);
|
156
259
|
rb_grn_init_variable_size_column(mGrn);
|
@@ -0,0 +1,104 @@
|
|
1
|
+
/* -*- mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2
|
+
/*
|
3
|
+
Copyright (C) 2017 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include "rb-grn.h"
|
20
|
+
|
21
|
+
/*
|
22
|
+
* Document-module: Groonga::DefaultCache
|
23
|
+
*
|
24
|
+
* This module provides the default cache related features.
|
25
|
+
*
|
26
|
+
* @since 7.0.2
|
27
|
+
*/
|
28
|
+
|
29
|
+
/*
|
30
|
+
* @overload base_path
|
31
|
+
* @return [String, nil] the default cache base path or `nil`.
|
32
|
+
*
|
33
|
+
* @since 7.0.2
|
34
|
+
*/
|
35
|
+
static VALUE
|
36
|
+
rb_grn_default_cache_s_get_base_path (VALUE klass)
|
37
|
+
{
|
38
|
+
const char *base_path;
|
39
|
+
|
40
|
+
base_path = grn_get_default_cache_base_path();
|
41
|
+
if (base_path) {
|
42
|
+
return rb_str_new_cstr(base_path);
|
43
|
+
} else {
|
44
|
+
return Qnil;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
/*
|
49
|
+
* @overload base_path=(base_path)
|
50
|
+
* @param base_path [String, nil] The new default cache base path.
|
51
|
+
* If you specify `String`, the default cache will be persistent.
|
52
|
+
* If you specify `nil`, the default cache will be just on memory.
|
53
|
+
* You need to call {.reopen} to apply this change.
|
54
|
+
* @return [String, nil] The `base_path` itself.
|
55
|
+
*
|
56
|
+
* @since 7.0.2
|
57
|
+
*/
|
58
|
+
static VALUE
|
59
|
+
rb_grn_default_cache_s_set_base_path (VALUE klass, VALUE rb_base_path)
|
60
|
+
{
|
61
|
+
if (NIL_P(rb_base_path)) {
|
62
|
+
grn_set_default_cache_base_path(NULL);
|
63
|
+
} else {
|
64
|
+
const char *base_path;
|
65
|
+
base_path = StringValueCStr(rb_base_path);
|
66
|
+
grn_set_default_cache_base_path(base_path);
|
67
|
+
}
|
68
|
+
|
69
|
+
return rb_base_path;
|
70
|
+
}
|
71
|
+
|
72
|
+
/*
|
73
|
+
* @overload reopen
|
74
|
+
* Reopens the default cache.
|
75
|
+
*
|
76
|
+
* @return [void]
|
77
|
+
*
|
78
|
+
* @since 7.0.2
|
79
|
+
*/
|
80
|
+
static VALUE
|
81
|
+
rb_grn_default_cache_s_reopen (VALUE klass)
|
82
|
+
{
|
83
|
+
grn_rc rc;
|
84
|
+
|
85
|
+
rc = grn_cache_default_reopen();
|
86
|
+
rb_grn_rc_check(rc, klass);
|
87
|
+
|
88
|
+
return Qnil;
|
89
|
+
}
|
90
|
+
|
91
|
+
void
|
92
|
+
rb_grn_init_default_cache (VALUE mGrn)
|
93
|
+
{
|
94
|
+
VALUE mGrnDefaultCache;
|
95
|
+
|
96
|
+
mGrnDefaultCache = rb_define_module_under(mGrn, "DefaultCache");
|
97
|
+
|
98
|
+
rb_define_singleton_method(mGrnDefaultCache, "base_path",
|
99
|
+
rb_grn_default_cache_s_get_base_path, 0);
|
100
|
+
rb_define_singleton_method(mGrnDefaultCache, "base_path=",
|
101
|
+
rb_grn_default_cache_s_set_base_path, 1);
|
102
|
+
rb_define_singleton_method(mGrnDefaultCache, "reopen",
|
103
|
+
rb_grn_default_cache_s_reopen, 0);
|
104
|
+
}
|
@@ -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-2017 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
|
5
5
|
|
6
6
|
This library is free software; you can redistribute it and/or
|
@@ -54,11 +54,18 @@ void
|
|
54
54
|
rb_grn_index_column_bind (RbGrnIndexColumn *rb_grn_index_column,
|
55
55
|
grn_ctx *context, grn_obj *column)
|
56
56
|
{
|
57
|
+
RbGrnColumn *rb_grn_column;
|
57
58
|
RbGrnObject *rb_grn_object;
|
58
59
|
|
59
|
-
|
60
|
-
|
60
|
+
rb_grn_column = RB_GRN_COLUMN(rb_grn_index_column);
|
61
|
+
rb_grn_column_bind(rb_grn_column, context, column);
|
62
|
+
|
63
|
+
grn_obj_reinit(context,
|
64
|
+
rb_grn_column->value,
|
65
|
+
GRN_DB_UINT32,
|
66
|
+
0);
|
61
67
|
|
68
|
+
rb_grn_object = RB_GRN_OBJECT(rb_grn_index_column);
|
62
69
|
rb_grn_index_column->old_value = grn_obj_open(context, GRN_BULK, 0,
|
63
70
|
rb_grn_object->range_id);
|
64
71
|
rb_grn_index_column->set_value =
|
@@ -191,6 +198,38 @@ rb_grn_index_column_inspect (VALUE self)
|
|
191
198
|
return inspected;
|
192
199
|
}
|
193
200
|
|
201
|
+
static VALUE
|
202
|
+
rb_grn_index_column_array_reference (VALUE self, VALUE rb_token)
|
203
|
+
{
|
204
|
+
grn_ctx *context = NULL;
|
205
|
+
grn_obj *column;
|
206
|
+
grn_obj *domain;
|
207
|
+
grn_id token_id;
|
208
|
+
grn_obj *value;
|
209
|
+
VALUE rb_value;
|
210
|
+
|
211
|
+
rb_grn_index_column_deconstruct(SELF(self),
|
212
|
+
&column,
|
213
|
+
&context,
|
214
|
+
NULL,
|
215
|
+
&domain,
|
216
|
+
&value,
|
217
|
+
NULL,
|
218
|
+
NULL,
|
219
|
+
NULL,
|
220
|
+
NULL,
|
221
|
+
NULL,
|
222
|
+
NULL);
|
223
|
+
|
224
|
+
token_id = RVAL2GRNID(rb_token, context, domain, self);
|
225
|
+
GRN_BULK_REWIND(value);
|
226
|
+
grn_obj_get_value(context, column, token_id, value);
|
227
|
+
rb_grn_context_check(context, self);
|
228
|
+
rb_value = GRNVALUE2RVAL(context, value, NULL, self);
|
229
|
+
|
230
|
+
return rb_value;
|
231
|
+
}
|
232
|
+
|
194
233
|
/*
|
195
234
|
* Adds a record that has @value@ content to inverted index for fast
|
196
235
|
* fulltext serach. Normally, this method is not used
|
@@ -933,6 +972,12 @@ rb_grn_index_column_medium_p (VALUE self)
|
|
933
972
|
return CBOOL2RVAL(flags & GRN_OBJ_INDEX_MEDIUM);
|
934
973
|
}
|
935
974
|
|
975
|
+
static VALUE
|
976
|
+
call_close (VALUE object)
|
977
|
+
{
|
978
|
+
return rb_funcall(object, rb_intern("close"), 0);
|
979
|
+
}
|
980
|
+
|
936
981
|
/*
|
937
982
|
* Opens cursor to iterate posting in the index column.
|
938
983
|
*
|
@@ -958,13 +1003,14 @@ rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self)
|
|
958
1003
|
grn_ctx *context;
|
959
1004
|
grn_obj *column;
|
960
1005
|
grn_column_flags column_flags;
|
1006
|
+
grn_obj *domain_object;
|
961
1007
|
grn_obj *range_object;
|
962
|
-
grn_table_cursor *table_cursor;
|
1008
|
+
grn_table_cursor *table_cursor = NULL;
|
1009
|
+
grn_id token_id = GRN_ID_NIL;
|
963
1010
|
grn_id rid_min = GRN_ID_NIL;
|
964
1011
|
grn_id rid_max = GRN_ID_MAX;
|
965
1012
|
int flags = 0;
|
966
|
-
|
967
|
-
VALUE rb_table_cursor;
|
1013
|
+
VALUE rb_table_cursor_or_token;
|
968
1014
|
VALUE options;
|
969
1015
|
VALUE rb_with_section, rb_with_weight, rb_with_position;
|
970
1016
|
VALUE rb_table;
|
@@ -972,21 +1018,28 @@ rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self)
|
|
972
1018
|
VALUE rb_cursor;
|
973
1019
|
|
974
1020
|
rb_grn_index_column_deconstruct(SELF(self), &column, &context,
|
975
|
-
NULL,
|
1021
|
+
NULL, &domain_object,
|
976
1022
|
NULL, NULL, NULL,
|
977
1023
|
NULL, &range_object,
|
978
1024
|
NULL, NULL);
|
979
1025
|
|
980
|
-
rb_scan_args(argc, argv, "11", &
|
1026
|
+
rb_scan_args(argc, argv, "11", &rb_table_cursor_or_token, &options);
|
981
1027
|
rb_grn_scan_options(options,
|
982
1028
|
"with_section", &rb_with_section,
|
983
1029
|
"with_weight", &rb_with_weight,
|
984
1030
|
"with_position", &rb_with_position,
|
985
1031
|
NULL);
|
986
1032
|
|
987
|
-
table_cursor = RVAL2GRNTABLECURSOR(rb_table_cursor, NULL);
|
988
1033
|
rb_table = GRNOBJECT2RVAL(Qnil, context, range_object, GRN_FALSE);
|
989
|
-
rb_lexicon =
|
1034
|
+
rb_lexicon = rb_funcall(self, rb_intern("table"), 0);
|
1035
|
+
if (CBOOL2RVAL(rb_obj_is_kind_of(rb_table_cursor_or_token,
|
1036
|
+
rb_cGrnTableCursor))) {
|
1037
|
+
VALUE rb_table_cursor = rb_table_cursor_or_token;
|
1038
|
+
table_cursor = RVAL2GRNTABLECURSOR(rb_table_cursor, NULL);
|
1039
|
+
} else {
|
1040
|
+
VALUE rb_token = rb_table_cursor_or_token;
|
1041
|
+
token_id = RVAL2GRNID(rb_token, context, domain_object, self);
|
1042
|
+
}
|
990
1043
|
|
991
1044
|
column_flags = grn_column_get_flags(context, column);
|
992
1045
|
|
@@ -1008,13 +1061,34 @@ rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self)
|
|
1008
1061
|
flags |= GRN_OBJ_WITH_POSITION;
|
1009
1062
|
}
|
1010
1063
|
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1064
|
+
if (table_cursor) {
|
1065
|
+
grn_obj *index_cursor;
|
1066
|
+
index_cursor = grn_index_cursor_open(context, table_cursor,
|
1067
|
+
column, rid_min, rid_max, flags);
|
1068
|
+
rb_cursor = GRNINDEXCURSOR2RVAL(context,
|
1069
|
+
index_cursor,
|
1070
|
+
rb_table,
|
1071
|
+
rb_lexicon);
|
1072
|
+
} else {
|
1073
|
+
grn_ii *ii = (grn_ii *)column;
|
1074
|
+
grn_ii_cursor *ii_cursor;
|
1075
|
+
ii_cursor = grn_ii_cursor_open(context,
|
1076
|
+
ii,
|
1077
|
+
token_id,
|
1078
|
+
rid_min,
|
1079
|
+
rid_max,
|
1080
|
+
grn_ii_get_n_elements(context, ii),
|
1081
|
+
flags);
|
1082
|
+
rb_cursor = rb_grn_inverted_index_cursor_to_ruby_object(context,
|
1083
|
+
ii_cursor,
|
1084
|
+
token_id,
|
1085
|
+
flags,
|
1086
|
+
rb_table,
|
1087
|
+
rb_lexicon);
|
1088
|
+
}
|
1015
1089
|
|
1016
1090
|
if (rb_block_given_p())
|
1017
|
-
return rb_ensure(rb_yield, rb_cursor,
|
1091
|
+
return rb_ensure(rb_yield, rb_cursor, call_close, rb_cursor);
|
1018
1092
|
else
|
1019
1093
|
return rb_cursor;
|
1020
1094
|
}
|
@@ -1337,6 +1411,10 @@ rb_grn_init_index_column (VALUE mGrn)
|
|
1337
1411
|
rb_define_method(rb_cGrnIndexColumn, "inspect",
|
1338
1412
|
rb_grn_index_column_inspect, 0);
|
1339
1413
|
|
1414
|
+
rb_define_method(rb_cGrnIndexColumn, "[]",
|
1415
|
+
rb_grn_index_column_array_reference, 1);
|
1416
|
+
rb_undef_method(rb_cGrnIndexColumn, "[]=");
|
1417
|
+
|
1340
1418
|
rb_define_method(rb_cGrnIndexColumn, "add",
|
1341
1419
|
rb_grn_index_column_add, -1);
|
1342
1420
|
rb_define_method(rb_cGrnIndexColumn, "delete",
|