groonga 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/NEWS.ja.rdoc +18 -3
  2. data/NEWS.rdoc +18 -3
  3. data/README.ja.rdoc +2 -0
  4. data/README.rdoc +2 -0
  5. data/Rakefile +14 -5
  6. data/TUTORIAL.ja.rdoc +82 -16
  7. data/benchmark/{read-write-small-many-items.rb → read-write-many-small-items.rb} +26 -23
  8. data/benchmark/{write-small-many-items.rb → write-many-small-items.rb} +26 -23
  9. data/example/bookmark.rb +49 -5
  10. data/ext/rb-grn-array.c +11 -1
  11. data/ext/rb-grn-column.c +132 -5
  12. data/ext/rb-grn-context.c +85 -80
  13. data/ext/rb-grn-database.c +182 -9
  14. data/ext/rb-grn-expression-builder.c +69 -0
  15. data/ext/rb-grn-expression.c +314 -0
  16. data/ext/rb-grn-fix-size-column.c +68 -89
  17. data/ext/rb-grn-hash.c +14 -5
  18. data/ext/rb-grn-index-column.c +14 -55
  19. data/ext/rb-grn-object.c +206 -75
  20. data/ext/rb-grn-operation.c +92 -0
  21. data/ext/rb-grn-patricia-trie.c +10 -32
  22. data/ext/rb-grn-query.c +9 -9
  23. data/ext/rb-grn-table-cursor.c +19 -80
  24. data/ext/rb-grn-table-key-support.c +33 -39
  25. data/ext/rb-grn-table.c +436 -79
  26. data/ext/rb-grn-type.c +10 -3
  27. data/ext/rb-grn-utils.c +131 -4
  28. data/ext/rb-grn-variable-size-column.c +36 -0
  29. data/ext/rb-grn-variable.c +90 -0
  30. data/ext/rb-grn.h +109 -56
  31. data/ext/rb-groonga.c +4 -0
  32. data/extconf.rb +39 -13
  33. data/html/index.html +2 -2
  34. data/lib/groonga.rb +22 -0
  35. data/lib/groonga/expression-builder.rb +141 -0
  36. data/lib/groonga/record.rb +25 -1
  37. data/lib/groonga/schema.rb +418 -0
  38. data/test/test-column.rb +11 -23
  39. data/test/test-context.rb +1 -1
  40. data/test/test-database.rb +60 -19
  41. data/test/test-expression-builder.rb +114 -0
  42. data/test/test-expression.rb +55 -0
  43. data/test/test-fix-size-column.rb +53 -0
  44. data/test/test-hash.rb +10 -3
  45. data/test/test-index-column.rb +24 -0
  46. data/test/test-patricia-trie.rb +9 -0
  47. data/test/test-procedure.rb +5 -5
  48. data/test/test-record.rb +71 -4
  49. data/test/test-schema.rb +207 -0
  50. data/test/test-table.rb +94 -12
  51. data/test/test-type.rb +18 -11
  52. data/test/test-variable-size-column.rb +53 -0
  53. data/test/test-variable.rb +28 -0
  54. metadata +18 -5
@@ -0,0 +1,92 @@
1
+ /* -*- c-file-style: "ruby" -*- */
2
+ /*
3
+ Copyright (C) 2009 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+ */
18
+
19
+ #include "rb-grn.h"
20
+
21
+ VALUE rb_mGrnOperation;
22
+
23
+ void
24
+ rb_grn_init_operation (VALUE mGrn)
25
+ {
26
+ rb_mGrnOperation = rb_define_module_under(mGrn, "Operation");
27
+
28
+ rb_define_const(rb_mGrnOperation, "NO_OPERATION",
29
+ UINT2NUM(GRN_OP_NOP));
30
+ rb_define_const(rb_mGrnOperation, "PUSH",
31
+ UINT2NUM(GRN_OP_PUSH));
32
+ rb_define_const(rb_mGrnOperation, "POP",
33
+ UINT2NUM(GRN_OP_POP));
34
+ rb_define_const(rb_mGrnOperation, "CALL",
35
+ UINT2NUM(GRN_OP_CALL));
36
+ rb_define_const(rb_mGrnOperation, "INTERN",
37
+ UINT2NUM(GRN_OP_INTERN));
38
+ rb_define_const(rb_mGrnOperation, "TABLE_CREATE",
39
+ UINT2NUM(GRN_OP_TABLE_CREATE));
40
+ rb_define_const(rb_mGrnOperation, "EXPRESSION_GET_VARIABLE",
41
+ UINT2NUM(GRN_OP_EXPR_GET_VAR));
42
+ rb_define_const(rb_mGrnOperation, "VARIABLE_SET_VALUE",
43
+ UINT2NUM(GRN_OP_VAR_SET_VALUE));
44
+ rb_define_const(rb_mGrnOperation, "OBJECT_GET_VALUE",
45
+ UINT2NUM(GRN_OP_OBJ_GET_VALUE));
46
+ rb_define_const(rb_mGrnOperation, "OBJECT_SET_VALUE",
47
+ UINT2NUM(GRN_OP_OBJ_SET_VALUE));
48
+ rb_define_const(rb_mGrnOperation, "OBJECT_SEARCH",
49
+ UINT2NUM(GRN_OP_OBJ_SEARCH));
50
+ rb_define_const(rb_mGrnOperation, "TABLE_SELECT",
51
+ UINT2NUM(GRN_OP_TABLE_SELECT));
52
+ rb_define_const(rb_mGrnOperation, "TABLE_SORT",
53
+ UINT2NUM(GRN_OP_TABLE_SORT));
54
+ rb_define_const(rb_mGrnOperation, "TABLE_GROUP",
55
+ UINT2NUM(GRN_OP_TABLE_GROUP));
56
+ rb_define_const(rb_mGrnOperation, "JSON_PUT",
57
+ UINT2NUM(GRN_OP_JSON_PUT));
58
+ rb_define_const(rb_mGrnOperation, "AND",
59
+ UINT2NUM(GRN_OP_AND));
60
+ rb_define_const(rb_mGrnOperation, "OR",
61
+ UINT2NUM(GRN_OP_OR));
62
+ rb_define_const(rb_mGrnOperation, "EQUAL",
63
+ UINT2NUM(GRN_OP_EQUAL));
64
+ rb_define_const(rb_mGrnOperation, "NOT_EQUAL",
65
+ UINT2NUM(GRN_OP_NOT_EQUAL));
66
+ rb_define_const(rb_mGrnOperation, "LESS",
67
+ UINT2NUM(GRN_OP_LESS));
68
+ rb_define_const(rb_mGrnOperation, "GREATER",
69
+ UINT2NUM(GRN_OP_GREATER));
70
+ rb_define_const(rb_mGrnOperation, "LESS_EQUAL",
71
+ UINT2NUM(GRN_OP_LESS_EQUAL));
72
+ rb_define_const(rb_mGrnOperation, "GREATER_EQUAL",
73
+ UINT2NUM(GRN_OP_GREATER_EQUAL));
74
+ rb_define_const(rb_mGrnOperation, "MATCH",
75
+ UINT2NUM(GRN_OP_MATCH));
76
+ /*
77
+ rb_define_const(rb_mGrnOperation, "GEO_DISTANCE1",
78
+ UINT2NUM(GRN_OP_GEO_DISTANCE1));
79
+ rb_define_const(rb_mGrnOperation, "GEO_DISTANCE2",
80
+ UINT2NUM(GRN_OP_GEO_DISTANCE2));
81
+ rb_define_const(rb_mGrnOperation, "GEO_DISTANCE3",
82
+ UINT2NUM(GRN_OP_GEO_DISTANCE3));
83
+ rb_define_const(rb_mGrnOperation, "GEO_DISTANCE4",
84
+ UINT2NUM(GRN_OP_GEO_DISTANCE4));
85
+ rb_define_const(rb_mGrnOperation, "GEO_WITHINP5",
86
+ UINT2NUM(GRN_OP_GEO_WITHINP5));
87
+ rb_define_const(rb_mGrnOperation, "GEO_WITHINP6",
88
+ UINT2NUM(GRN_OP_GEO_WITHINP6));
89
+ rb_define_const(rb_mGrnOperation, "GEO_WITHINP8",
90
+ UINT2NUM(GRN_OP_GEO_WITHINP8));
91
+ */
92
+ }
@@ -33,7 +33,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
33
33
  VALUE rb_table;
34
34
  VALUE options, rb_context, rb_name, rb_path, rb_persistent;
35
35
  VALUE rb_key_normalize, rb_key_with_sis, rb_key_type, rb_value_size;
36
- VALUE rb_default_tokenizer;
36
+ VALUE rb_default_tokenizer, rb_sub_records;
37
37
 
38
38
  rb_scan_args(argc, argv, "01", &options);
39
39
 
@@ -47,6 +47,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
47
47
  "key_type", &rb_key_type,
48
48
  "value_size", &rb_value_size,
49
49
  "default_tokenizer", &rb_default_tokenizer,
50
+ "sub_records", &rb_sub_records,
50
51
  NULL);
51
52
 
52
53
  context = rb_grn_context_ensure(&rb_context);
@@ -54,6 +55,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
54
55
  if (!NIL_P(rb_name)) {
55
56
  name = StringValuePtr(rb_name);
56
57
  name_size = RSTRING_LEN(rb_name);
58
+ flags |= GRN_OBJ_PERSISTENT;
57
59
  }
58
60
 
59
61
  if (!NIL_P(rb_path)) {
@@ -79,13 +81,15 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
79
81
  if (!NIL_P(rb_value_size))
80
82
  value_size = NUM2UINT(rb_value_size);
81
83
 
84
+ if (RVAL2CBOOL(rb_sub_records))
85
+ flags |= GRN_OBJ_WITH_SUBREC;
86
+
82
87
  table = grn_table_create(context, name, name_size, path,
83
88
  flags, key_type, value_size);
84
89
  if (!table)
85
90
  rb_grn_context_check(context, rb_ary_new4(argc, argv));
86
- rb_table = rb_grn_table_key_support_alloc(self);
87
- rb_grn_table_key_support_assign(rb_table, rb_context, context, table,
88
- RB_GRN_TRUE);
91
+ rb_table = rb_grn_object_alloc(self);
92
+ rb_grn_object_assign(Qnil, rb_table, rb_context, context, table);
89
93
  rb_grn_context_check(context, rb_table);
90
94
 
91
95
  if (!NIL_P(rb_default_tokenizer))
@@ -106,7 +110,7 @@ rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
106
110
  grn_obj *table;
107
111
  grn_id domain_id;
108
112
  grn_obj *key, *domain, *result;
109
- grn_sel_operator operator;
113
+ grn_operator operator;
110
114
  grn_search_optarg search_options;
111
115
  rb_grn_boolean search_options_is_set = RB_GRN_TRUE;
112
116
  VALUE rb_key, options, rb_result, rb_operator, rb_type;
@@ -135,32 +139,7 @@ rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
135
139
  result = RVAL2GRNOBJECT(rb_result, &context);
136
140
  }
137
141
 
138
- operator = RVAL2GRNSELECTOPERATOR(rb_operator);
139
-
140
- search_options.flags = 0;
141
- if (NIL_P(rb_type)) {
142
- search_options_is_set = RB_GRN_FALSE;
143
- } else if (rb_grn_equal_option(rb_type, "exact")) {
144
- search_options.flags |= GRN_SEARCH_EXACT;
145
- } else if (rb_grn_equal_option(rb_type, "longest_common_prefix") ||
146
- rb_grn_equal_option(rb_type, "longest-common-prefix")) {
147
- search_options.flags |= GRN_SEARCH_LCP;
148
- } else if (rb_grn_equal_option(rb_type, "suffix")) {
149
- search_options.flags |= GRN_SEARCH_SUFFIX;
150
- } else if (rb_grn_equal_option(rb_type, "prefix")) {
151
- search_options.flags |= GRN_SEARCH_PREFIX;
152
- } else if (rb_grn_equal_option(rb_type, "term_extract") ||
153
- rb_grn_equal_option(rb_type, "term-extract")) {
154
- search_options.flags |= GRN_SEARCH_TERM_EXTRACT;
155
- } else if (rb_grn_equal_option(rb_type, "suffix")) {
156
- search_options.flags |= GRN_SEARCH_SUFFIX;
157
- } else {
158
- rb_raise(rb_eArgError,
159
- "search type should be one of "
160
- "[nil, :exact, :longest_common_prefix, :suffix, "
161
- ":prefix, :term_extract]: %s",
162
- rb_grn_inspect(rb_type));
163
- }
142
+ operator = RVAL2GRNOPERATOR(rb_operator);
164
143
 
165
144
  rc = grn_obj_search(context, table, key,
166
145
  result, operator,
@@ -175,7 +154,6 @@ rb_grn_init_patricia_trie (VALUE mGrn)
175
154
  {
176
155
  rb_cGrnPatriciaTrie =
177
156
  rb_define_class_under(mGrn, "PatriciaTrie", rb_cGrnTable);
178
- rb_define_alloc_func(rb_cGrnPatriciaTrie, rb_grn_table_key_support_alloc);
179
157
 
180
158
  rb_include_module(rb_cGrnPatriciaTrie, rb_mGrnTableKeySupport);
181
159
  rb_define_singleton_method(rb_cGrnPatriciaTrie, "create",
data/ext/rb-grn-query.c CHANGED
@@ -89,26 +89,26 @@ rb_grn_query_alloc (VALUE klass)
89
89
  return Data_Wrap_Struct(klass, NULL, rb_rb_grn_query_free, NULL);
90
90
  }
91
91
 
92
- grn_sel_operator
93
- rb_grn_select_operator_from_ruby_object (VALUE rb_operator)
92
+ grn_operator
93
+ rb_grn_operator_from_ruby_object (VALUE rb_operator)
94
94
  {
95
- grn_sel_operator operator = GRN_SEL_OR;
95
+ grn_operator operator = GRN_OP_OR;
96
96
 
97
97
  if (NIL_P(rb_operator) ||
98
98
  rb_grn_equal_option(rb_operator, "or") ||
99
99
  rb_grn_equal_option(rb_operator, "||")) {
100
- operator = GRN_SEL_OR;
100
+ operator = GRN_OP_OR;
101
101
  } else if (rb_grn_equal_option(rb_operator, "and") ||
102
102
  rb_grn_equal_option(rb_operator, "+") ||
103
103
  rb_grn_equal_option(rb_operator, "&&")) {
104
- operator = GRN_SEL_AND;
104
+ operator = GRN_OP_AND;
105
105
  } else if (rb_grn_equal_option(rb_operator, "but") ||
106
106
  rb_grn_equal_option(rb_operator, "not") ||
107
107
  rb_grn_equal_option(rb_operator, "-")) {
108
- operator = GRN_SEL_BUT;
108
+ operator = GRN_OP_BUT;
109
109
  } else if (rb_grn_equal_option(rb_operator, "adjust") ||
110
110
  rb_grn_equal_option(rb_operator, ">")) {
111
- operator = GRN_SEL_ADJUST;
111
+ operator = GRN_OP_ADJUST;
112
112
  } else {
113
113
  rb_raise(rb_eArgError,
114
114
  "operator should be one of "
@@ -127,7 +127,7 @@ rb_grn_query_initialize (int argc, VALUE *argv, VALUE self)
127
127
  grn_query *query;
128
128
  char *query_string;
129
129
  unsigned int query_string_length;
130
- grn_sel_operator default_operator;
130
+ grn_operator default_operator;
131
131
  int max_expressions = RB_GRN_QUERY_DEFAULT_MAX_EXPRESSIONS;
132
132
  VALUE rb_query_string, options, rb_context, rb_default_operator;
133
133
  VALUE rb_max_expressions;
@@ -145,7 +145,7 @@ rb_grn_query_initialize (int argc, VALUE *argv, VALUE self)
145
145
 
146
146
  context = rb_grn_context_ensure(&rb_context);
147
147
 
148
- default_operator = RVAL2GRNSELECTOPERATOR(rb_default_operator);
148
+ default_operator = RVAL2GRNOPERATOR(rb_default_operator);
149
149
 
150
150
  if (!NIL_P(rb_max_expressions))
151
151
  max_expressions = NUM2INT(rb_max_expressions);
@@ -32,91 +32,14 @@ rb_grn_table_cursor_from_ruby_object (VALUE object, grn_ctx **context)
32
32
  return RVAL2GRNOBJECT(object, context);
33
33
  }
34
34
 
35
- VALUE
36
- rb_grn_table_cursor_to_ruby_class (grn_obj *object)
37
- {
38
- VALUE klass = Qnil;
39
-
40
- switch (object->header.type) {
41
- case GRN_CURSOR_TABLE_HASH_KEY:
42
- klass = rb_cGrnHashCursor;
43
- break;
44
- case GRN_CURSOR_TABLE_PAT_KEY:
45
- klass = rb_cGrnPatriciaTrieCursor;
46
- break;
47
- case GRN_CURSOR_TABLE_NO_KEY:
48
- klass = rb_cGrnArrayCursor;
49
- break;
50
- default:
51
- rb_raise(rb_eTypeError,
52
- "unsupported groonga object type: %d",
53
- object->header.type);
54
- break;
55
- }
56
-
57
- return klass;
58
- }
59
-
60
35
  VALUE
61
36
  rb_grn_table_cursor_to_ruby_object (VALUE klass, grn_ctx *context,
62
37
  grn_table_cursor *cursor,
63
38
  rb_grn_boolean owner)
64
39
  {
65
- if (NIL_P(klass))
66
- klass = rb_grn_table_cursor_to_ruby_class(cursor);
67
40
  return GRNOBJECT2RVAL(klass, context, cursor, owner);
68
41
  }
69
42
 
70
- void
71
- rb_grn_table_cursor_unbind (RbGrnTableCursor *rb_grn_table_cursor)
72
- {
73
- RbGrnObject *rb_grn_object;
74
-
75
- rb_grn_object = RB_GRN_OBJECT(rb_grn_table_cursor);
76
- rb_grn_object_unbind(rb_grn_object);
77
- }
78
-
79
- static void
80
- rb_grn_table_cursor_free (void *object)
81
- {
82
- RbGrnTableCursor *rb_grn_table_cursor = object;
83
-
84
- rb_grn_table_cursor_unbind(rb_grn_table_cursor);
85
- xfree(rb_grn_table_cursor);
86
- }
87
-
88
- VALUE
89
- rb_grn_table_cursor_alloc (VALUE klass)
90
- {
91
- return Data_Wrap_Struct(klass, NULL, rb_grn_table_cursor_free, NULL);
92
- }
93
-
94
- void
95
- rb_grn_table_cursor_bind (RbGrnTableCursor *rb_grn_table_cursor,
96
- grn_ctx *context, grn_table_cursor *cursor,
97
- rb_grn_boolean owner)
98
- {
99
- RbGrnObject *rb_grn_object;
100
-
101
- rb_grn_object = RB_GRN_OBJECT(rb_grn_table_cursor);
102
- rb_grn_object_bind(rb_grn_object, context, cursor, owner);
103
- rb_grn_object->unbind = RB_GRN_UNBIND_FUNCTION(rb_grn_table_cursor_unbind);
104
- }
105
-
106
- void
107
- rb_grn_table_cursor_assign (VALUE self, VALUE rb_context,
108
- grn_ctx *context, grn_table_cursor *cursor,
109
- rb_grn_boolean owner)
110
- {
111
- RbGrnTableCursor *rb_grn_table_cursor;
112
-
113
- rb_grn_table_cursor = ALLOC(RbGrnTableCursor);
114
- DATA_PTR(self) = rb_grn_table_cursor;
115
- rb_grn_table_cursor_bind(rb_grn_table_cursor, context, cursor, owner);
116
-
117
- rb_iv_set(self, "context", rb_context);
118
- }
119
-
120
43
  void
121
44
  rb_grn_table_cursor_deconstruct (RbGrnTableCursor *rb_grn_table_cursor,
122
45
  grn_table_cursor **cursor,
@@ -137,7 +60,23 @@ rb_grn_table_cursor_deconstruct (RbGrnTableCursor *rb_grn_table_cursor,
137
60
  VALUE
138
61
  rb_grn_table_cursor_close (VALUE self)
139
62
  {
140
- rb_grn_table_cursor_unbind(SELF(self));
63
+ RbGrnTableCursor *rb_grn_table_cursor;
64
+ grn_table_cursor *cursor;
65
+ grn_ctx *context;
66
+
67
+ rb_grn_table_cursor = SELF(self);
68
+ rb_grn_table_cursor_deconstruct(rb_grn_table_cursor, &cursor, &context,
69
+ NULL, NULL, NULL, NULL);
70
+
71
+ if (context && cursor) {
72
+ RbGrnObject *rb_grn_object;
73
+
74
+ rb_grn_object = RB_GRN_OBJECT(rb_grn_table_cursor);
75
+ grn_obj_close(context, cursor);
76
+ rb_grn_object->context = NULL;
77
+ rb_grn_object->object = NULL;
78
+ }
79
+
141
80
  return Qnil;
142
81
  }
143
82
 
@@ -259,8 +198,8 @@ rb_grn_table_cursor_each (VALUE self)
259
198
  void
260
199
  rb_grn_init_table_cursor (VALUE mGrn)
261
200
  {
262
- rb_cGrnTableCursor = rb_define_class_under(mGrn, "TableCurosr", rb_cObject);
263
- rb_define_alloc_func(rb_cGrnTableCursor, rb_grn_table_cursor_alloc);
201
+ rb_cGrnTableCursor = rb_define_class_under(mGrn, "TableCursor", rb_cObject);
202
+ rb_define_alloc_func(rb_cGrnTableCursor, rb_grn_object_alloc);
264
203
 
265
204
  rb_include_module(rb_cGrnTableCursor, rb_mEnumerable);
266
205
 
@@ -45,34 +45,26 @@ rb_grn_table_key_support_deconstruct (RbGrnTableKeySupport *rb_grn_table_key_sup
45
45
  *key = rb_grn_table_key_support->key;
46
46
  }
47
47
 
48
- static void
49
- rb_grn_table_key_support_free (void *object)
48
+ void
49
+ rb_grn_table_key_support_finalizer (grn_ctx *context,
50
+ grn_obj *grn_object,
51
+ RbGrnTableKeySupport *rb_grn_table_key_support)
50
52
  {
51
- RbGrnObject *rb_grn_object = object;
52
- RbGrnTable *rb_grn_table = object;
53
- RbGrnTableKeySupport *rb_grn_table_key_support = object;
54
- grn_ctx *context;
53
+ if (!context)
54
+ return;
55
55
 
56
- context = rb_grn_object->context;
57
- if (context)
56
+ if (rb_grn_table_key_support->key)
58
57
  grn_obj_close(context, rb_grn_table_key_support->key);
58
+ rb_grn_table_key_support->key = NULL;
59
59
 
60
- rb_grn_table_unbind(rb_grn_table);
61
-
62
- xfree(rb_grn_table_key_support);
63
- }
64
-
65
- VALUE
66
- rb_grn_table_key_support_alloc (VALUE klass)
67
- {
68
- return Data_Wrap_Struct(klass, NULL, rb_grn_table_key_support_free, NULL);
60
+ rb_grn_table_finalizer(context, grn_object,
61
+ RB_GRN_TABLE(rb_grn_table_key_support));
69
62
  }
70
63
 
71
64
  void
72
65
  rb_grn_table_key_support_bind (RbGrnTableKeySupport *rb_grn_table_key_support,
73
66
  grn_ctx *context,
74
- grn_obj *table_key_support,
75
- rb_grn_boolean owner)
67
+ grn_obj *table_key_support)
76
68
  {
77
69
  RbGrnObject *rb_grn_object;
78
70
  RbGrnTable *rb_grn_table;
@@ -80,29 +72,12 @@ rb_grn_table_key_support_bind (RbGrnTableKeySupport *rb_grn_table_key_support,
80
72
  rb_grn_object = RB_GRN_OBJECT(rb_grn_table_key_support);
81
73
 
82
74
  rb_grn_table = RB_GRN_TABLE(rb_grn_table_key_support);
83
- rb_grn_table_bind(rb_grn_table, context, table_key_support, owner);
75
+ rb_grn_table_bind(rb_grn_table, context, table_key_support);
84
76
 
85
77
  rb_grn_table_key_support->key =
86
78
  grn_obj_open(context, GRN_BULK, 0, rb_grn_object->domain_id);
87
79
  }
88
80
 
89
- void
90
- rb_grn_table_key_support_assign (VALUE self, VALUE rb_context,
91
- grn_ctx *context,
92
- grn_obj *table_key_support,
93
- rb_grn_boolean owner)
94
- {
95
- RbGrnTableKeySupport *rb_grn_table_key_support;
96
-
97
- rb_grn_table_key_support = ALLOC(RbGrnTableKeySupport);
98
- DATA_PTR(self) = rb_grn_table_key_support;
99
-
100
- rb_grn_table_key_support_bind(rb_grn_table_key_support,
101
- context, table_key_support, owner);
102
-
103
- rb_iv_set(self, "context", rb_context);
104
- }
105
-
106
81
  static VALUE
107
82
  rb_grn_table_key_support_initialize (int argc, VALUE *argv, VALUE self)
108
83
  {
@@ -112,8 +87,7 @@ rb_grn_table_key_support_initialize (int argc, VALUE *argv, VALUE self)
112
87
 
113
88
  table = rb_grn_table_open_raw(argc, argv, &context, &rb_context);
114
89
  rb_grn_context_check(context, self);
115
- rb_grn_table_key_support_assign(self, rb_context, context,
116
- table, RB_GRN_TRUE);
90
+ rb_grn_object_assign(Qnil, self, rb_context, context, table);
117
91
 
118
92
  return Qnil;
119
93
  }
@@ -182,6 +156,24 @@ rb_grn_table_key_support_get_key (VALUE self, VALUE rb_id)
182
156
  return rb_key;
183
157
  }
184
158
 
159
+ static VALUE
160
+ rb_grn_table_key_support_has_key (VALUE self, VALUE rb_key)
161
+ {
162
+ grn_ctx *context;
163
+ grn_obj *table, *key, *domain;
164
+ grn_id id, domain_id;
165
+
166
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
167
+ &key, &domain_id, &domain,
168
+ NULL, NULL, NULL);
169
+
170
+ GRN_BULK_REWIND(key);
171
+ RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);
172
+ id = grn_table_get(context, table, GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key));
173
+
174
+ return id == GRN_ID_NIL ? Qfalse : Qtrue;
175
+ }
176
+
185
177
  static VALUE
186
178
  rb_grn_table_key_support_delete_by_key (VALUE self, VALUE rb_key)
187
179
  {
@@ -383,6 +375,8 @@ rb_grn_init_table_key_support (VALUE mGrn)
383
375
  rb_grn_table_key_support_add, -1);
384
376
  rb_define_method(rb_mGrnTableKeySupport, "key",
385
377
  rb_grn_table_key_support_get_key, 1);
378
+ rb_define_method(rb_mGrnTableKeySupport, "has_key?",
379
+ rb_grn_table_key_support_has_key, 1);
386
380
 
387
381
  rb_define_method(rb_mGrnTableKeySupport, "delete",
388
382
  rb_grn_table_key_support_delete, 1);