groonga 0.0.1 → 0.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.
- data/NEWS.ja.rdoc +11 -0
- data/NEWS.rdoc +11 -0
- data/README.ja.rdoc +4 -3
- data/README.rdoc +4 -3
- data/Rakefile +1 -1
- data/TUTORIAL.ja.rdoc +168 -44
- data/benchmark/common.rb +49 -0
- data/benchmark/read-write-small-many-items.rb +156 -0
- data/benchmark/write-small-many-items.rb +145 -0
- data/example/bookmark.rb +68 -20
- data/ext/rb-grn-array-cursor.c +8 -0
- data/ext/rb-grn-array.c +40 -11
- data/ext/rb-grn-column.c +38 -209
- data/ext/rb-grn-context.c +203 -56
- data/ext/rb-grn-database.c +119 -5
- data/ext/rb-grn-encoding-support.c +64 -0
- data/ext/rb-grn-encoding.c +58 -1
- data/ext/rb-grn-fix-size-column.c +220 -0
- data/ext/rb-grn-hash-cursor.c +8 -0
- data/ext/rb-grn-hash.c +244 -2
- data/ext/rb-grn-index-column.c +474 -0
- data/ext/rb-grn-object.c +143 -265
- data/ext/rb-grn-patricia-trie.c +148 -2
- data/ext/rb-grn-query.c +5 -3
- data/ext/rb-grn-record.c +3 -2
- data/ext/rb-grn-snippet.c +5 -3
- data/ext/rb-grn-table-cursor-key-support.c +3 -3
- data/ext/rb-grn-table-cursor.c +106 -112
- data/ext/rb-grn-table-key-support.c +220 -118
- data/ext/rb-grn-table.c +336 -80
- data/ext/rb-grn-type.c +5 -4
- data/ext/rb-grn-utils.c +62 -63
- data/ext/rb-grn.h +215 -14
- data/ext/rb-groonga.c +7 -16
- data/extconf.rb +3 -1
- data/html/favicon.ico +0 -0
- data/html/favicon.xcf +0 -0
- data/html/index.html +1 -7
- data/lib/groonga/record.rb +6 -1
- data/test/groonga-test-utils.rb +1 -0
- data/test/test-array.rb +81 -0
- data/test/test-column.rb +22 -12
- data/test/test-context.rb +1 -29
- data/test/test-database.rb +30 -0
- data/test/test-hash.rb +194 -0
- data/test/test-index-column.rb +57 -0
- data/test/test-patricia-trie.rb +82 -0
- data/test/test-record.rb +10 -10
- data/test/test-table.rb +37 -130
- data/test/test-type.rb +4 -3
- metadata +15 -4
- data/benchmark/small-many-items.rb +0 -175
data/ext/rb-grn-object.c
CHANGED
@@ -30,14 +30,6 @@
|
|
30
30
|
|
31
31
|
VALUE rb_cGrnObject;
|
32
32
|
|
33
|
-
typedef struct _RbGrnObject RbGrnObject;
|
34
|
-
struct _RbGrnObject
|
35
|
-
{
|
36
|
-
grn_ctx *context;
|
37
|
-
grn_obj *object;
|
38
|
-
rb_grn_boolean owner;
|
39
|
-
};
|
40
|
-
|
41
33
|
grn_obj *
|
42
34
|
rb_grn_object_from_ruby_object (VALUE object, grn_ctx **context)
|
43
35
|
{
|
@@ -49,16 +41,16 @@ rb_grn_object_from_ruby_object (VALUE object, grn_ctx **context)
|
|
49
41
|
if (context && *context) {
|
50
42
|
grn_obj *grn_object;
|
51
43
|
if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cString))) {
|
52
|
-
grn_object =
|
53
|
-
|
54
|
-
|
44
|
+
grn_object = grn_ctx_get(*context,
|
45
|
+
StringValuePtr(object),
|
46
|
+
RSTRING_LEN(object));
|
55
47
|
if (!grn_object)
|
56
48
|
rb_raise(rb_eArgError,
|
57
49
|
"unregistered groonga object: name: <%s>",
|
58
50
|
rb_grn_inspect(object));
|
59
51
|
return grn_object;
|
60
52
|
} else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cInteger))) {
|
61
|
-
grn_object =
|
53
|
+
grn_object = grn_ctx_at(*context, NUM2UINT(object));
|
62
54
|
if (!grn_object)
|
63
55
|
rb_raise(rb_eArgError,
|
64
56
|
"unregistered groonga object: ID: <%s>",
|
@@ -81,17 +73,44 @@ rb_grn_object_from_ruby_object (VALUE object, grn_ctx **context)
|
|
81
73
|
return rb_grn_object->object;
|
82
74
|
}
|
83
75
|
|
84
|
-
|
85
|
-
|
76
|
+
void
|
77
|
+
rb_grn_object_unbind (RbGrnObject *rb_grn_object)
|
86
78
|
{
|
87
|
-
|
79
|
+
grn_ctx *context;
|
80
|
+
grn_obj *grn_object;
|
88
81
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
82
|
+
context = rb_grn_object->context;
|
83
|
+
grn_object = rb_grn_object->object;
|
84
|
+
|
85
|
+
if (context)
|
86
|
+
rb_grn_context_unregister(context, rb_grn_object);
|
87
|
+
|
88
|
+
if (rb_grn_object->owner && context && grn_object) {
|
89
|
+
const char *path;
|
90
|
+
grn_obj *db = NULL;
|
91
|
+
|
92
|
+
path = grn_obj_path(context, grn_object);
|
93
|
+
db = grn_ctx_db(context);
|
94
|
+
if (path == NULL || (path && db)) {
|
95
|
+
if (grn_object == db) {
|
96
|
+
rb_grn_context_unbind(context);
|
97
|
+
} else {
|
98
|
+
grn_obj_close(context, grn_object);
|
99
|
+
}
|
100
|
+
}
|
93
101
|
}
|
94
102
|
|
103
|
+
rb_grn_object->context = NULL;
|
104
|
+
rb_grn_object->object = NULL;
|
105
|
+
rb_grn_object->owner = RB_GRN_FALSE;
|
106
|
+
}
|
107
|
+
|
108
|
+
static void
|
109
|
+
rb_grn_object_free (void *object)
|
110
|
+
{
|
111
|
+
RbGrnObject *rb_grn_object = object;
|
112
|
+
|
113
|
+
rb_grn_object->unbind(rb_grn_object);
|
95
114
|
xfree(rb_grn_object);
|
96
115
|
}
|
97
116
|
|
@@ -145,38 +164,110 @@ VALUE
|
|
145
164
|
rb_grn_object_to_ruby_object (VALUE klass, grn_ctx *context, grn_obj *object,
|
146
165
|
rb_grn_boolean owner)
|
147
166
|
{
|
148
|
-
|
167
|
+
VALUE rb_object;
|
149
168
|
|
150
169
|
if (!object)
|
151
170
|
return Qnil;
|
152
171
|
|
153
|
-
rb_grn_object = ALLOC(RbGrnObject);
|
154
|
-
rb_grn_object->context = context;
|
155
|
-
rb_grn_object->object = object;
|
156
|
-
rb_grn_object->owner = owner;
|
157
|
-
|
158
172
|
if (NIL_P(klass))
|
159
173
|
klass = GRNOBJECT2RCLASS(object);
|
160
174
|
|
161
|
-
|
175
|
+
if (klass == rb_cGrnHash ||
|
176
|
+
klass == rb_cGrnPatriciaTrie) {
|
177
|
+
rb_object = rb_grn_table_key_support_alloc(klass);
|
178
|
+
rb_grn_table_key_support_assign(rb_object, Qnil, context, object, owner);
|
179
|
+
} else if (klass == rb_cGrnArray) {
|
180
|
+
rb_object = rb_grn_table_alloc(klass);
|
181
|
+
rb_grn_table_assign(rb_object, Qnil, context, object, owner);
|
182
|
+
} else if (klass == rb_cGrnFixSizeColumn) {
|
183
|
+
rb_object = rb_grn_fix_size_column_alloc(klass);
|
184
|
+
rb_grn_fix_size_column_assign(rb_object, Qnil, context, object, owner);
|
185
|
+
} else if (klass == rb_cGrnIndexColumn) {
|
186
|
+
rb_object = rb_grn_index_column_alloc(klass);
|
187
|
+
rb_grn_index_column_assign(rb_object, Qnil, context, object, owner);
|
188
|
+
} else {
|
189
|
+
rb_object = rb_grn_object_alloc(klass);
|
190
|
+
rb_grn_object_assign(rb_object, Qnil, context, object, owner);
|
191
|
+
}
|
192
|
+
|
193
|
+
return rb_object;
|
162
194
|
}
|
163
195
|
|
164
196
|
VALUE
|
165
197
|
rb_grn_object_alloc (VALUE klass)
|
166
198
|
{
|
167
|
-
return Data_Wrap_Struct(klass, NULL,
|
199
|
+
return Data_Wrap_Struct(klass, NULL, rb_grn_object_free, NULL);
|
168
200
|
}
|
169
201
|
|
170
202
|
void
|
171
|
-
|
203
|
+
rb_grn_object_bind (RbGrnObject *rb_grn_object,
|
204
|
+
grn_ctx *context, grn_obj *object, rb_grn_boolean owner)
|
205
|
+
{
|
206
|
+
rb_grn_object->context = context;
|
207
|
+
rb_grn_object->object = object;
|
208
|
+
|
209
|
+
rb_grn_object->domain_id = GRN_ID_NIL;
|
210
|
+
if (object)
|
211
|
+
rb_grn_object->domain_id = object->header.domain;
|
212
|
+
if (rb_grn_object->domain_id == GRN_ID_NIL)
|
213
|
+
rb_grn_object->domain = NULL;
|
214
|
+
else
|
215
|
+
rb_grn_object->domain = grn_ctx_at(context, rb_grn_object->domain_id);
|
216
|
+
|
217
|
+
rb_grn_object->range_id = GRN_ID_NIL;
|
218
|
+
if (object && object->header.type != GRN_TYPE)
|
219
|
+
rb_grn_object->range_id = grn_obj_get_range(context, object);
|
220
|
+
if (rb_grn_object->range_id == GRN_ID_NIL)
|
221
|
+
rb_grn_object->range = NULL;
|
222
|
+
else
|
223
|
+
rb_grn_object->range = grn_ctx_at(context, rb_grn_object->range_id);
|
224
|
+
|
225
|
+
rb_grn_object->owner = owner;
|
226
|
+
|
227
|
+
rb_grn_object->unbind = RB_GRN_UNBIND_FUNCTION(rb_grn_object_unbind);
|
228
|
+
|
229
|
+
if (context)
|
230
|
+
rb_grn_context_register(context, rb_grn_object);
|
231
|
+
}
|
232
|
+
|
233
|
+
void
|
234
|
+
rb_grn_object_assign (VALUE self, VALUE rb_context,
|
235
|
+
grn_ctx *context, grn_obj *object,
|
236
|
+
rb_grn_boolean owner)
|
172
237
|
{
|
173
238
|
RbGrnObject *rb_grn_object;
|
174
239
|
|
175
240
|
rb_grn_object = ALLOC(RbGrnObject);
|
176
241
|
DATA_PTR(self) = rb_grn_object;
|
177
|
-
rb_grn_object
|
178
|
-
|
179
|
-
|
242
|
+
rb_grn_object_bind(rb_grn_object, context, object, owner);
|
243
|
+
|
244
|
+
rb_iv_set(self, "context", rb_context);
|
245
|
+
}
|
246
|
+
|
247
|
+
void
|
248
|
+
rb_grn_object_deconstruct (RbGrnObject *rb_grn_object,
|
249
|
+
grn_obj **object,
|
250
|
+
grn_ctx **context,
|
251
|
+
grn_id *domain_id,
|
252
|
+
grn_obj **domain,
|
253
|
+
grn_id *range_id,
|
254
|
+
grn_obj **range)
|
255
|
+
{
|
256
|
+
if (!rb_grn_object)
|
257
|
+
return;
|
258
|
+
|
259
|
+
if (object)
|
260
|
+
*object = rb_grn_object->object;
|
261
|
+
if (context)
|
262
|
+
*context = rb_grn_object->context;
|
263
|
+
if (domain_id)
|
264
|
+
*domain_id = rb_grn_object->domain_id;
|
265
|
+
if (domain)
|
266
|
+
*domain = rb_grn_object->domain;
|
267
|
+
if (range_id)
|
268
|
+
*range_id = rb_grn_object->range_id;
|
269
|
+
if (range)
|
270
|
+
*range = rb_grn_object->range;
|
180
271
|
}
|
181
272
|
|
182
273
|
/*
|
@@ -191,16 +282,7 @@ rb_grn_object_initialize (VALUE self, grn_ctx *context, grn_obj *object)
|
|
191
282
|
VALUE
|
192
283
|
rb_grn_object_close (VALUE self)
|
193
284
|
{
|
194
|
-
|
195
|
-
|
196
|
-
rb_grn_object = SELF(self);
|
197
|
-
if (rb_grn_object->context && rb_grn_object->object) {
|
198
|
-
if (rb_grn_object->owner)
|
199
|
-
grn_obj_close(rb_grn_object->context, rb_grn_object->object);
|
200
|
-
rb_grn_object->context = NULL;
|
201
|
-
rb_grn_object->object = NULL;
|
202
|
-
rb_grn_object->owner = RB_GRN_FALSE;
|
203
|
-
}
|
285
|
+
rb_grn_object_unbind(SELF(self));
|
204
286
|
return Qnil;
|
205
287
|
}
|
206
288
|
|
@@ -276,13 +358,14 @@ rb_grn_object_inspect_content_name (VALUE inspected,
|
|
276
358
|
} else {
|
277
359
|
grn_obj name;
|
278
360
|
|
279
|
-
GRN_OBJ_INIT(&name, GRN_BULK, 0);
|
361
|
+
GRN_OBJ_INIT(&name, GRN_BULK, 0, GRN_ID_NIL);
|
280
362
|
grn_bulk_space(context, &name, name_size);
|
281
363
|
grn_obj_name(context, object, GRN_BULK_HEAD(&name), name_size);
|
282
|
-
|
364
|
+
GRN_TEXT_PUTC(context, &name, '\0');
|
283
365
|
rb_str_cat2(inspected, "<");
|
284
366
|
rb_str_cat2(inspected, GRN_BULK_HEAD(&name));
|
285
367
|
rb_str_cat2(inspected, ">");
|
368
|
+
grn_obj_close(context, &name);
|
286
369
|
}
|
287
370
|
|
288
371
|
return inspected;
|
@@ -321,7 +404,7 @@ rb_grn_object_inspect_content_domain (VALUE inspected,
|
|
321
404
|
} else {
|
322
405
|
grn_obj *domain_object;
|
323
406
|
|
324
|
-
domain_object =
|
407
|
+
domain_object = grn_ctx_at(context, domain);
|
325
408
|
if (domain_object) {
|
326
409
|
rb_grn_object_inspect_object(inspected, context, domain_object);
|
327
410
|
} else {
|
@@ -353,7 +436,7 @@ rb_grn_object_inspect_content_range (VALUE inspected,
|
|
353
436
|
} else {
|
354
437
|
grn_obj *range_object;
|
355
438
|
|
356
|
-
range_object =
|
439
|
+
range_object = grn_ctx_at(context, range);
|
357
440
|
if (range_object) {
|
358
441
|
rb_grn_object_inspect_object(inspected, context, range_object);
|
359
442
|
} else {
|
@@ -391,6 +474,9 @@ rb_grn_object_inspect_content (VALUE self, VALUE inspected)
|
|
391
474
|
grn_obj *object;
|
392
475
|
|
393
476
|
rb_grn_object = SELF(self);
|
477
|
+
if (!rb_grn_object)
|
478
|
+
return inspected;
|
479
|
+
|
394
480
|
context = rb_grn_object->context;
|
395
481
|
object = rb_grn_object->object;
|
396
482
|
|
@@ -487,7 +573,7 @@ rb_grn_object_get_domain (VALUE self)
|
|
487
573
|
} else {
|
488
574
|
grn_obj *domain_object;
|
489
575
|
|
490
|
-
domain_object =
|
576
|
+
domain_object = grn_ctx_at(context, domain);
|
491
577
|
if (domain_object)
|
492
578
|
return GRNOBJECT2RVAL(Qnil, context, domain_object, RB_GRN_FALSE);
|
493
579
|
else
|
@@ -558,7 +644,7 @@ rb_grn_object_get_range (VALUE self)
|
|
558
644
|
} else {
|
559
645
|
grn_obj *range_object;
|
560
646
|
|
561
|
-
range_object =
|
647
|
+
range_object = grn_ctx_at(context, range);
|
562
648
|
if (range_object)
|
563
649
|
return GRNOBJECT2RVAL(Qnil, context, range_object, RB_GRN_FALSE);
|
564
650
|
else
|
@@ -622,30 +708,27 @@ rb_grn_object_array_reference (VALUE self, VALUE rb_id)
|
|
622
708
|
|
623
709
|
id = NUM2UINT(rb_id);
|
624
710
|
range_id = grn_obj_get_range(context, object);
|
625
|
-
range =
|
711
|
+
range = grn_ctx_at(context, range_id);
|
626
712
|
range_type = range ? range->header.type : GRN_VOID;
|
627
713
|
switch (object->header.type) {
|
628
714
|
case GRN_TABLE_HASH_KEY:
|
629
715
|
case GRN_TABLE_PAT_KEY:
|
630
716
|
case GRN_TABLE_NO_KEY:
|
631
|
-
GRN_OBJ_INIT(&value, GRN_BULK, 0);
|
717
|
+
GRN_OBJ_INIT(&value, GRN_BULK, 0, GRN_ID_NIL);
|
632
718
|
break;
|
633
719
|
case GRN_TYPE:
|
634
720
|
case GRN_ACCESSOR: /* FIXME */
|
635
|
-
GRN_OBJ_INIT(&value, GRN_BULK, 0);
|
636
|
-
value.header.domain = range_id;
|
721
|
+
GRN_OBJ_INIT(&value, GRN_BULK, 0, range_id);
|
637
722
|
break;
|
638
723
|
case GRN_COLUMN_VAR_SIZE:
|
639
724
|
case GRN_COLUMN_FIX_SIZE:
|
640
725
|
switch (object->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) {
|
641
726
|
case GRN_OBJ_COLUMN_VECTOR:
|
642
|
-
GRN_OBJ_INIT(&value, GRN_VECTOR, 0);
|
643
|
-
value.header.domain = range_id;
|
727
|
+
GRN_OBJ_INIT(&value, GRN_VECTOR, 0, range_id);
|
644
728
|
break;
|
645
729
|
case GRN_OBJ_COLUMN_INDEX:
|
646
730
|
case GRN_OBJ_COLUMN_SCALAR:
|
647
|
-
GRN_OBJ_INIT(&value, GRN_BULK, 0);
|
648
|
-
value.header.domain = range_id;
|
731
|
+
GRN_OBJ_INIT(&value, GRN_BULK, 0, range_id);
|
649
732
|
break;
|
650
733
|
default:
|
651
734
|
rb_raise(rb_eGrnError, "unsupported column type: %u: %s",
|
@@ -687,8 +770,10 @@ rb_grn_object_set (VALUE self, VALUE rb_id, VALUE rb_value, int flags)
|
|
687
770
|
context = rb_grn_object->context;
|
688
771
|
id = NUM2UINT(rb_id);
|
689
772
|
if (RVAL2CBOOL(rb_obj_is_kind_of(rb_value, rb_cArray))) {
|
773
|
+
GRN_OBJ_INIT(&value, GRN_VECTOR, 0, GRN_ID_NIL);
|
690
774
|
RVAL2GRNVECTOR(rb_value, context, &value);
|
691
775
|
} else {
|
776
|
+
GRN_OBJ_INIT(&value, GRN_BULK, 0, GRN_ID_NIL);
|
692
777
|
RVAL2GRNBULK(rb_value, context, &value);
|
693
778
|
}
|
694
779
|
rc = grn_obj_set_value(context, rb_grn_object->object, id,
|
@@ -731,214 +816,6 @@ rb_grn_object_append_value (VALUE self, VALUE rb_id, VALUE rb_value)
|
|
731
816
|
return rb_grn_object_set(self, rb_id, rb_value, GRN_OBJ_APPEND);
|
732
817
|
}
|
733
818
|
|
734
|
-
/*
|
735
|
-
* Document-method: search
|
736
|
-
*
|
737
|
-
* call-seq:
|
738
|
-
* object.search(query, options={}) -> Groonga::Table
|
739
|
-
*
|
740
|
-
* _object_から_query_に対応するオブジェクトを検索し、見つかっ
|
741
|
-
* たオブジェクトのIDがキーになっているGroonga::Tableを返す。
|
742
|
-
*
|
743
|
-
* 利用可能なオプションは以下の通り。
|
744
|
-
*
|
745
|
-
* [_:result_]
|
746
|
-
* 結果を格納するGroonga::Hash。指定しない場合は新しく
|
747
|
-
* Groonga::Hashを生成し、それに結果を格納して返す。
|
748
|
-
* [_:operator_]
|
749
|
-
* 以下のどれかの値を指定する。+nil+, <tt>"or"</tt>, <tt>"||"</tt>,
|
750
|
-
* <tt>"and"</tt>, <tt>"+"</tt>, <tt>"&&"</tt>, <tt>"but"</tt>,
|
751
|
-
* <tt>"not"</tt>, <tt>"-"</tt>, <tt>"adjust"</tt>, <tt>">"</tt>。
|
752
|
-
* それぞれ以下のようになる。(FIXME: 「以下」)
|
753
|
-
* [_:exact_]
|
754
|
-
* +true+を指定すると完全一致で検索する
|
755
|
-
* [_:longest_common_prefix_]
|
756
|
-
* +true+を指定すると_query_と同じ接頭辞をもつエントリのう
|
757
|
-
* ち、もっとも長いエントリを検索する
|
758
|
-
* [_:suffix_]
|
759
|
-
* +true+を指定すると_query_が後方一致するエントリを検索す
|
760
|
-
* る
|
761
|
-
* [_:prefix_]
|
762
|
-
* +true+を指定すると_query_が前方一致するレコードを検索す
|
763
|
-
* る
|
764
|
-
* [_:near_]
|
765
|
-
* +true+を指定すると_query_に指定した複数の語が近傍に含ま
|
766
|
-
* れるレコードを検索する
|
767
|
-
* [...]
|
768
|
-
* ...
|
769
|
-
*/
|
770
|
-
static VALUE
|
771
|
-
rb_grn_object_search (int argc, VALUE *argv, VALUE self)
|
772
|
-
{
|
773
|
-
RbGrnObject *rb_grn_object;
|
774
|
-
grn_ctx *context;
|
775
|
-
grn_obj *object;
|
776
|
-
grn_obj *query;
|
777
|
-
grn_obj *result;
|
778
|
-
grn_sel_operator operator;
|
779
|
-
grn_search_optarg search_options;
|
780
|
-
rb_grn_boolean search_options_is_set = RB_GRN_FALSE;
|
781
|
-
rb_grn_boolean query_is_created = RB_GRN_FALSE;
|
782
|
-
grn_rc rc;
|
783
|
-
VALUE rb_query, options, rb_result, rb_operator;
|
784
|
-
VALUE rb_exact, rb_longest_common_prefix, rb_suffix, rb_prefix, rb_partial;
|
785
|
-
VALUE rb_near, rb_near2, rb_similar, rb_term_extract;
|
786
|
-
VALUE rb_similarity_threshold, rb_max_interval, rb_weight_vector;
|
787
|
-
VALUE rb_procedure, rb_max_size;
|
788
|
-
|
789
|
-
rb_grn_object = SELF(self);
|
790
|
-
if (!rb_grn_object->object)
|
791
|
-
return Qnil;
|
792
|
-
|
793
|
-
context = rb_grn_object->context;
|
794
|
-
object = rb_grn_object->object;
|
795
|
-
|
796
|
-
rb_scan_args(argc, argv, "11", &rb_query, &options);
|
797
|
-
|
798
|
-
if (CBOOL2RVAL(rb_obj_is_kind_of(rb_query, rb_cGrnQuery))) {
|
799
|
-
grn_query *_query;
|
800
|
-
_query = RVAL2GRNQUERY(rb_query);
|
801
|
-
query = (grn_obj *)_query;
|
802
|
-
} else {
|
803
|
-
query_is_created = RB_GRN_TRUE;
|
804
|
-
query = RVAL2GRNBULK(rb_query, context, NULL);
|
805
|
-
}
|
806
|
-
|
807
|
-
rb_grn_scan_options(options,
|
808
|
-
"result", &rb_result,
|
809
|
-
"operator", &rb_operator,
|
810
|
-
"exact", &rb_exact,
|
811
|
-
"longest_common_prefix", &rb_longest_common_prefix,
|
812
|
-
"suffix", &rb_suffix,
|
813
|
-
"prefix", &rb_prefix,
|
814
|
-
"partial", &rb_partial,
|
815
|
-
"near", &rb_near,
|
816
|
-
"near2", &rb_near2,
|
817
|
-
"similar", &rb_similar,
|
818
|
-
"term_extract", &rb_term_extract,
|
819
|
-
"similarity_threshold", &rb_similarity_threshold,
|
820
|
-
"max_interval", &rb_max_interval,
|
821
|
-
"weight_vector", &rb_weight_vector,
|
822
|
-
"procedure", &rb_procedure,
|
823
|
-
"max_size", &rb_max_size,
|
824
|
-
NULL);
|
825
|
-
|
826
|
-
if (NIL_P(rb_result)) {
|
827
|
-
grn_obj *domain = NULL;
|
828
|
-
|
829
|
-
switch (object->header.type) {
|
830
|
-
case GRN_TABLE_PAT_KEY:
|
831
|
-
case GRN_TABLE_HASH_KEY:
|
832
|
-
domain = object;
|
833
|
-
break;
|
834
|
-
default:
|
835
|
-
domain = grn_ctx_get(context, grn_obj_get_range(context, object));
|
836
|
-
break;
|
837
|
-
}
|
838
|
-
result = grn_table_create(context, NULL, 0, NULL,
|
839
|
-
GRN_OBJ_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC,
|
840
|
-
domain, 0);
|
841
|
-
rb_grn_context_check(context, self);
|
842
|
-
} else {
|
843
|
-
result = RVAL2GRNOBJECT(rb_result, &context);
|
844
|
-
}
|
845
|
-
|
846
|
-
operator = RVAL2GRNSELECTOPERATOR(rb_operator);
|
847
|
-
|
848
|
-
search_options.flags = 0;
|
849
|
-
if (!NIL_P(rb_exact)) {
|
850
|
-
search_options_is_set = RB_GRN_TRUE;
|
851
|
-
if (RVAL2CBOOL(rb_exact))
|
852
|
-
search_options.flags |= GRN_SEARCH_EXACT;
|
853
|
-
}
|
854
|
-
if (!NIL_P(rb_longest_common_prefix)) {
|
855
|
-
search_options_is_set = RB_GRN_TRUE;
|
856
|
-
if (RVAL2CBOOL(rb_longest_common_prefix))
|
857
|
-
search_options.flags |= GRN_SEARCH_LCP;
|
858
|
-
}
|
859
|
-
if (!NIL_P(rb_suffix)) {
|
860
|
-
search_options_is_set = RB_GRN_TRUE;
|
861
|
-
if (RVAL2CBOOL(rb_suffix))
|
862
|
-
search_options.flags |= GRN_SEARCH_SUFFIX;
|
863
|
-
}
|
864
|
-
if (!NIL_P(rb_prefix)) {
|
865
|
-
search_options_is_set = RB_GRN_TRUE;
|
866
|
-
if (RVAL2CBOOL(rb_prefix))
|
867
|
-
search_options.flags |= GRN_SEARCH_PREFIX;
|
868
|
-
}
|
869
|
-
if (!NIL_P(rb_partial)) {
|
870
|
-
search_options_is_set = RB_GRN_TRUE;
|
871
|
-
if (RVAL2CBOOL(rb_partial))
|
872
|
-
search_options.flags |= GRN_SEARCH_PARTIAL;
|
873
|
-
}
|
874
|
-
if (!NIL_P(rb_near)) {
|
875
|
-
search_options_is_set = RB_GRN_TRUE;
|
876
|
-
if (RVAL2CBOOL(rb_near))
|
877
|
-
search_options.flags |= GRN_SEARCH_NEAR;
|
878
|
-
}
|
879
|
-
if (!NIL_P(rb_near2)) {
|
880
|
-
search_options_is_set = RB_GRN_TRUE;
|
881
|
-
if (RVAL2CBOOL(rb_near2))
|
882
|
-
search_options.flags |= GRN_SEARCH_NEAR2;
|
883
|
-
}
|
884
|
-
if (!NIL_P(rb_similar)) {
|
885
|
-
search_options_is_set = RB_GRN_TRUE;
|
886
|
-
if (RVAL2CBOOL(rb_similar))
|
887
|
-
search_options.flags |= GRN_SEARCH_SIMILAR;
|
888
|
-
}
|
889
|
-
if (!NIL_P(rb_term_extract)) {
|
890
|
-
search_options_is_set = RB_GRN_TRUE;
|
891
|
-
if (RVAL2CBOOL(rb_term_extract))
|
892
|
-
search_options.flags |= GRN_SEARCH_TERM_EXTRACT;
|
893
|
-
}
|
894
|
-
|
895
|
-
search_options.similarity_threshold = 30; /* FIXME */
|
896
|
-
if (!NIL_P(rb_similarity_threshold)) {
|
897
|
-
search_options_is_set = RB_GRN_TRUE;
|
898
|
-
search_options.similarity_threshold = NUM2INT(rb_similarity_threshold);
|
899
|
-
}
|
900
|
-
|
901
|
-
search_options.max_interval = 5; /* FIXME */
|
902
|
-
if (!NIL_P(rb_max_interval)) {
|
903
|
-
search_options_is_set = RB_GRN_TRUE;
|
904
|
-
search_options.max_interval = NUM2INT(rb_max_interval);
|
905
|
-
}
|
906
|
-
|
907
|
-
search_options.weight_vector = NULL; /* FIXME */
|
908
|
-
if (!NIL_P(rb_weight_vector)) {
|
909
|
-
search_options_is_set = RB_GRN_TRUE;
|
910
|
-
/* FIXME */
|
911
|
-
/* search_options.weight_vector = RVAL2INTVECTOR(rb_weight_vector); */
|
912
|
-
}
|
913
|
-
|
914
|
-
search_options.proc = NULL;
|
915
|
-
if (!NIL_P(rb_procedure)) {
|
916
|
-
search_options_is_set = RB_GRN_TRUE;
|
917
|
-
search_options.proc = RVAL2GRNOBJECT(rb_procedure, &context);
|
918
|
-
}
|
919
|
-
|
920
|
-
search_options.max_size = 100; /* FIXME */
|
921
|
-
if (!NIL_P(rb_max_size)) {
|
922
|
-
search_options_is_set = RB_GRN_TRUE;
|
923
|
-
search_options.max_size = INT2NUM(rb_max_size);
|
924
|
-
}
|
925
|
-
|
926
|
-
rc = grn_obj_search(context,
|
927
|
-
object,
|
928
|
-
query,
|
929
|
-
result,
|
930
|
-
operator,
|
931
|
-
search_options_is_set ? &search_options : NULL);
|
932
|
-
if (query_is_created)
|
933
|
-
grn_obj_close(context, query);
|
934
|
-
rb_grn_rc_check(rc, self);
|
935
|
-
|
936
|
-
if (NIL_P(rb_result))
|
937
|
-
return GRNOBJECT2RVAL(Qnil, context, result, RB_GRN_TRUE);
|
938
|
-
else
|
939
|
-
return rb_result;
|
940
|
-
}
|
941
|
-
|
942
819
|
static VALUE
|
943
820
|
rb_grn_object_remove (VALUE self)
|
944
821
|
{
|
@@ -954,6 +831,9 @@ rb_grn_object_remove (VALUE self)
|
|
954
831
|
rc = grn_obj_remove(context, rb_grn_object->object);
|
955
832
|
rb_grn_rc_check(rc, self);
|
956
833
|
|
834
|
+
rb_grn_object->unbind(rb_grn_object);
|
835
|
+
rb_iv_set(self, "context", Qnil);
|
836
|
+
|
957
837
|
return Qnil;
|
958
838
|
}
|
959
839
|
|
@@ -979,7 +859,5 @@ rb_grn_init_object (VALUE mGrn)
|
|
979
859
|
rb_define_method(rb_cGrnObject, "[]=", rb_grn_object_array_set, 2);
|
980
860
|
rb_define_method(rb_cGrnObject, "append", rb_grn_object_append_value, 2);
|
981
861
|
|
982
|
-
rb_define_method(rb_cGrnObject, "search", rb_grn_object_search, -1);
|
983
|
-
|
984
862
|
rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, 0);
|
985
863
|
}
|