groonga 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
  }