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.
Files changed (52) hide show
  1. data/NEWS.ja.rdoc +11 -0
  2. data/NEWS.rdoc +11 -0
  3. data/README.ja.rdoc +4 -3
  4. data/README.rdoc +4 -3
  5. data/Rakefile +1 -1
  6. data/TUTORIAL.ja.rdoc +168 -44
  7. data/benchmark/common.rb +49 -0
  8. data/benchmark/read-write-small-many-items.rb +156 -0
  9. data/benchmark/write-small-many-items.rb +145 -0
  10. data/example/bookmark.rb +68 -20
  11. data/ext/rb-grn-array-cursor.c +8 -0
  12. data/ext/rb-grn-array.c +40 -11
  13. data/ext/rb-grn-column.c +38 -209
  14. data/ext/rb-grn-context.c +203 -56
  15. data/ext/rb-grn-database.c +119 -5
  16. data/ext/rb-grn-encoding-support.c +64 -0
  17. data/ext/rb-grn-encoding.c +58 -1
  18. data/ext/rb-grn-fix-size-column.c +220 -0
  19. data/ext/rb-grn-hash-cursor.c +8 -0
  20. data/ext/rb-grn-hash.c +244 -2
  21. data/ext/rb-grn-index-column.c +474 -0
  22. data/ext/rb-grn-object.c +143 -265
  23. data/ext/rb-grn-patricia-trie.c +148 -2
  24. data/ext/rb-grn-query.c +5 -3
  25. data/ext/rb-grn-record.c +3 -2
  26. data/ext/rb-grn-snippet.c +5 -3
  27. data/ext/rb-grn-table-cursor-key-support.c +3 -3
  28. data/ext/rb-grn-table-cursor.c +106 -112
  29. data/ext/rb-grn-table-key-support.c +220 -118
  30. data/ext/rb-grn-table.c +336 -80
  31. data/ext/rb-grn-type.c +5 -4
  32. data/ext/rb-grn-utils.c +62 -63
  33. data/ext/rb-grn.h +215 -14
  34. data/ext/rb-groonga.c +7 -16
  35. data/extconf.rb +3 -1
  36. data/html/favicon.ico +0 -0
  37. data/html/favicon.xcf +0 -0
  38. data/html/index.html +1 -7
  39. data/lib/groonga/record.rb +6 -1
  40. data/test/groonga-test-utils.rb +1 -0
  41. data/test/test-array.rb +81 -0
  42. data/test/test-column.rb +22 -12
  43. data/test/test-context.rb +1 -29
  44. data/test/test-database.rb +30 -0
  45. data/test/test-hash.rb +194 -0
  46. data/test/test-index-column.rb +57 -0
  47. data/test/test-patricia-trie.rb +82 -0
  48. data/test/test-record.rb +10 -10
  49. data/test/test-table.rb +37 -130
  50. data/test/test-type.rb +4 -3
  51. metadata +15 -4
  52. 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 = grn_ctx_lookup(*context,
53
- StringValuePtr(object),
54
- RSTRING_LEN(object));
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 = grn_ctx_get(*context, NUM2UINT(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
- static void
85
- rb_rb_grn_object_free (void *object)
76
+ void
77
+ rb_grn_object_unbind (RbGrnObject *rb_grn_object)
86
78
  {
87
- RbGrnObject *rb_grn_object = object;
79
+ grn_ctx *context;
80
+ grn_obj *grn_object;
88
81
 
89
- if (rb_grn_object->context && rb_grn_object->object &&
90
- rb_grn_object->owner) {
91
- /* FIXME */
92
- /* grn_obj_close(rb_grn_object->context, rb_grn_object->object); */
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
- RbGrnObject *rb_grn_object;
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
- return Data_Wrap_Struct(klass, NULL, rb_rb_grn_object_free, rb_grn_object);
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, rb_rb_grn_object_free, NULL);
199
+ return Data_Wrap_Struct(klass, NULL, rb_grn_object_free, NULL);
168
200
  }
169
201
 
170
202
  void
171
- rb_grn_object_initialize (VALUE self, grn_ctx *context, grn_obj *object)
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->context = context;
178
- rb_grn_object->object = object;
179
- rb_grn_object->owner = RB_GRN_TRUE;
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
- RbGrnObject *rb_grn_object;
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
- GRN_BULK_PUTC(context, &name, '\0');
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 = grn_ctx_get(context, domain);
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 = grn_ctx_get(context, range);
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 = grn_ctx_get(context, domain);
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 = grn_ctx_get(context, range);
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 = grn_ctx_get(context, range_id);
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
  }