rroonga 0.9.2-mswin32

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 (202) hide show
  1. data/AUTHORS +5 -0
  2. data/NEWS.ja.rdoc +114 -0
  3. data/NEWS.rdoc +116 -0
  4. data/README.ja.rdoc +65 -0
  5. data/README.rdoc +66 -0
  6. data/Rakefile +217 -0
  7. data/benchmark/common.rb +49 -0
  8. data/benchmark/read-write-many-small-items.rb +144 -0
  9. data/benchmark/write-many-small-items.rb +135 -0
  10. data/example/bookmark.rb +161 -0
  11. data/example/index-html.rb +89 -0
  12. data/example/search/config.ru +211 -0
  13. data/example/search/public/css/groonga.css +122 -0
  14. data/ext/.gitignore +2 -0
  15. data/ext/libruby-groonga.a +0 -0
  16. data/ext/rb-grn-accessor.c +52 -0
  17. data/ext/rb-grn-array-cursor.c +36 -0
  18. data/ext/rb-grn-array.c +210 -0
  19. data/ext/rb-grn-column.c +573 -0
  20. data/ext/rb-grn-context.c +655 -0
  21. data/ext/rb-grn-database.c +472 -0
  22. data/ext/rb-grn-encoding-support.c +64 -0
  23. data/ext/rb-grn-encoding.c +257 -0
  24. data/ext/rb-grn-exception.c +1110 -0
  25. data/ext/rb-grn-expression-builder.c +75 -0
  26. data/ext/rb-grn-expression.c +735 -0
  27. data/ext/rb-grn-fix-size-column.c +166 -0
  28. data/ext/rb-grn-hash-cursor.c +38 -0
  29. data/ext/rb-grn-hash.c +294 -0
  30. data/ext/rb-grn-index-column.c +488 -0
  31. data/ext/rb-grn-logger.c +504 -0
  32. data/ext/rb-grn-object.c +1369 -0
  33. data/ext/rb-grn-operation.c +198 -0
  34. data/ext/rb-grn-patricia-trie-cursor.c +39 -0
  35. data/ext/rb-grn-patricia-trie.c +488 -0
  36. data/ext/rb-grn-procedure.c +52 -0
  37. data/ext/rb-grn-query.c +260 -0
  38. data/ext/rb-grn-record.c +40 -0
  39. data/ext/rb-grn-snippet.c +334 -0
  40. data/ext/rb-grn-table-cursor-key-support.c +69 -0
  41. data/ext/rb-grn-table-cursor.c +247 -0
  42. data/ext/rb-grn-table-key-support.c +731 -0
  43. data/ext/rb-grn-table.c +2141 -0
  44. data/ext/rb-grn-type.c +181 -0
  45. data/ext/rb-grn-utils.c +769 -0
  46. data/ext/rb-grn-variable-size-column.c +36 -0
  47. data/ext/rb-grn-variable.c +108 -0
  48. data/ext/rb-grn-view-accessor.c +53 -0
  49. data/ext/rb-grn-view-cursor.c +35 -0
  50. data/ext/rb-grn-view-record.c +41 -0
  51. data/ext/rb-grn-view.c +421 -0
  52. data/ext/rb-grn.h +700 -0
  53. data/ext/rb-groonga.c +117 -0
  54. data/extconf.rb +266 -0
  55. data/html/bar.svg +153 -0
  56. data/html/developer.html +117 -0
  57. data/html/developer.svg +469 -0
  58. data/html/download.svg +253 -0
  59. data/html/favicon.ico +0 -0
  60. data/html/favicon.xcf +0 -0
  61. data/html/footer.html.erb +28 -0
  62. data/html/head.html.erb +4 -0
  63. data/html/header.html.erb +17 -0
  64. data/html/index.html +147 -0
  65. data/html/install.svg +636 -0
  66. data/html/logo.xcf +0 -0
  67. data/html/ranguba.css +250 -0
  68. data/html/tutorial.svg +559 -0
  69. data/lib/groonga.rb +90 -0
  70. data/lib/groonga/context.rb +184 -0
  71. data/lib/groonga/expression-builder.rb +285 -0
  72. data/lib/groonga/patricia-trie.rb +53 -0
  73. data/lib/groonga/record.rb +311 -0
  74. data/lib/groonga/schema.rb +1191 -0
  75. data/lib/groonga/view-record.rb +56 -0
  76. data/license/GPL +340 -0
  77. data/license/LGPL +504 -0
  78. data/license/RUBY +59 -0
  79. data/misc/grnop2ruby.rb +49 -0
  80. data/pkg-config.rb +333 -0
  81. data/test-unit/Rakefile +40 -0
  82. data/test-unit/TODO +5 -0
  83. data/test-unit/bin/testrb +5 -0
  84. data/test-unit/html/classic.html +15 -0
  85. data/test-unit/html/index.html +25 -0
  86. data/test-unit/html/index.html.ja +27 -0
  87. data/test-unit/lib/test/unit.rb +323 -0
  88. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  89. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  90. data/test-unit/lib/test/unit/attribute.rb +125 -0
  91. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  92. data/test-unit/lib/test/unit/collector.rb +36 -0
  93. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  94. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  95. data/test-unit/lib/test/unit/collector/load.rb +136 -0
  96. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  97. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  98. data/test-unit/lib/test/unit/color.rb +96 -0
  99. data/test-unit/lib/test/unit/diff.rb +724 -0
  100. data/test-unit/lib/test/unit/error.rb +130 -0
  101. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  102. data/test-unit/lib/test/unit/failure.rb +136 -0
  103. data/test-unit/lib/test/unit/fixture.rb +176 -0
  104. data/test-unit/lib/test/unit/notification.rb +129 -0
  105. data/test-unit/lib/test/unit/omission.rb +191 -0
  106. data/test-unit/lib/test/unit/pending.rb +150 -0
  107. data/test-unit/lib/test/unit/priority.rb +180 -0
  108. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  109. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  110. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  111. data/test-unit/lib/test/unit/testcase.rb +476 -0
  112. data/test-unit/lib/test/unit/testresult.rb +89 -0
  113. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  114. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  115. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  116. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  117. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  118. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  119. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  120. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  121. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  122. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  123. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  124. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  125. data/test-unit/lib/test/unit/version.rb +7 -0
  126. data/test-unit/sample/adder.rb +13 -0
  127. data/test-unit/sample/subtracter.rb +12 -0
  128. data/test-unit/sample/test_adder.rb +20 -0
  129. data/test-unit/sample/test_subtracter.rb +20 -0
  130. data/test-unit/sample/test_user.rb +23 -0
  131. data/test-unit/test/collector/test-descendant.rb +133 -0
  132. data/test-unit/test/collector/test-load.rb +348 -0
  133. data/test-unit/test/collector/test_dir.rb +406 -0
  134. data/test-unit/test/collector/test_objectspace.rb +100 -0
  135. data/test-unit/test/run-test.rb +15 -0
  136. data/test-unit/test/test-attribute.rb +86 -0
  137. data/test-unit/test/test-color-scheme.rb +67 -0
  138. data/test-unit/test/test-color.rb +47 -0
  139. data/test-unit/test/test-diff.rb +518 -0
  140. data/test-unit/test/test-emacs-runner.rb +60 -0
  141. data/test-unit/test/test-fixture.rb +287 -0
  142. data/test-unit/test/test-notification.rb +33 -0
  143. data/test-unit/test/test-omission.rb +81 -0
  144. data/test-unit/test/test-pending.rb +70 -0
  145. data/test-unit/test/test-priority.rb +119 -0
  146. data/test-unit/test/test-testcase.rb +544 -0
  147. data/test-unit/test/test_assertions.rb +1151 -0
  148. data/test-unit/test/test_error.rb +26 -0
  149. data/test-unit/test/test_failure.rb +33 -0
  150. data/test-unit/test/test_testresult.rb +113 -0
  151. data/test-unit/test/test_testsuite.rb +129 -0
  152. data/test-unit/test/testunit-test-util.rb +14 -0
  153. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  154. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  155. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  156. data/test-unit/test/util/test_observable.rb +102 -0
  157. data/test-unit/test/util/test_procwrapper.rb +36 -0
  158. data/test/.gitignore +1 -0
  159. data/test/groonga-test-utils.rb +133 -0
  160. data/test/run-test.rb +58 -0
  161. data/test/test-array.rb +97 -0
  162. data/test/test-column.rb +316 -0
  163. data/test/test-context-select.rb +93 -0
  164. data/test/test-context.rb +73 -0
  165. data/test/test-database.rb +113 -0
  166. data/test/test-encoding.rb +33 -0
  167. data/test/test-exception.rb +93 -0
  168. data/test/test-expression-builder.rb +156 -0
  169. data/test/test-expression.rb +134 -0
  170. data/test/test-fix-size-column.rb +65 -0
  171. data/test/test-gqtp.rb +72 -0
  172. data/test/test-hash.rb +312 -0
  173. data/test/test-index-column.rb +81 -0
  174. data/test/test-logger.rb +37 -0
  175. data/test/test-patricia-trie.rb +189 -0
  176. data/test/test-procedure.rb +37 -0
  177. data/test/test-query.rb +22 -0
  178. data/test/test-record.rb +279 -0
  179. data/test/test-remote.rb +54 -0
  180. data/test/test-schema-view.rb +90 -0
  181. data/test/test-schema.rb +459 -0
  182. data/test/test-snippet.rb +130 -0
  183. data/test/test-table-cursor.rb +153 -0
  184. data/test/test-table-offset-and-limit.rb +102 -0
  185. data/test/test-table-select-normalize.rb +53 -0
  186. data/test/test-table-select.rb +150 -0
  187. data/test/test-table.rb +690 -0
  188. data/test/test-type.rb +71 -0
  189. data/test/test-variable-size-column.rb +98 -0
  190. data/test/test-variable.rb +28 -0
  191. data/test/test-vector-column.rb +76 -0
  192. data/test/test-version.rb +31 -0
  193. data/test/test-view.rb +72 -0
  194. data/text/TUTORIAL.ja.rdoc +392 -0
  195. data/text/expression.rdoc +284 -0
  196. data/vendor/local/bin/grntest.exe +0 -0
  197. data/vendor/local/bin/groonga.exe +0 -0
  198. data/vendor/local/bin/libgroonga.dll +0 -0
  199. data/vendor/local/bin/libmecab.dll +0 -0
  200. data/vendor/local/include/groonga.h +2285 -0
  201. data/vendor/local/lib/libgroonga.lib +0 -0
  202. metadata +280 -0
@@ -0,0 +1,69 @@
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
+ #define SELF(object) ((RbGrnTableCursor *)DATA_PTR(object))
22
+
23
+ VALUE rb_mGrnTableCursorKeySupport;
24
+
25
+ /*
26
+ * Document-module: Groonga::TableCursor::KeySupport
27
+ *
28
+ * 主キーを持つテーブル用のカーソルであるGroonga::HashCursor
29
+ * とGroonga::PatriciaTrieCursorに主キーの機能を提供するモジ
30
+ * ュール。
31
+ */
32
+
33
+ /*
34
+ * call-seq:
35
+ * cursor.key -> 主キー
36
+ *
37
+ * カレントレコードの主キーを返す。
38
+ */
39
+ static VALUE
40
+ rb_grn_table_cursor_get_key (VALUE self)
41
+ {
42
+ VALUE rb_key = Qnil;
43
+ grn_ctx *context;
44
+ grn_table_cursor *cursor;
45
+
46
+ rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
47
+ NULL, NULL, NULL, NULL);
48
+ if (context && cursor) {
49
+ void *key;
50
+ int key_size;
51
+ grn_obj *table;
52
+
53
+ table = grn_table_cursor_table(context, cursor);
54
+ key_size = grn_table_cursor_get_key(context, cursor, &key);
55
+ rb_key = GRNKEY2RVAL(context, key, key_size, table, self);
56
+ }
57
+
58
+ return rb_key;
59
+ }
60
+
61
+ void
62
+ rb_grn_init_table_cursor_key_support (VALUE mGrn)
63
+ {
64
+ rb_mGrnTableCursorKeySupport =
65
+ rb_define_module_under(rb_cGrnTableCursor, "KeySupport");
66
+
67
+ rb_define_method(rb_mGrnTableCursorKeySupport, "key",
68
+ rb_grn_table_cursor_get_key, 0);
69
+ }
@@ -0,0 +1,247 @@
1
+ /* -*- c-file-style: "ruby" -*- */
2
+ /*
3
+ Copyright (C) 2009-2010 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
+ #define SELF(object) ((RbGrnTableCursor *)DATA_PTR(object))
22
+
23
+ VALUE rb_cGrnTableCursor;
24
+
25
+ /*
26
+ * Document-class: Groonga::TableCursor
27
+ *
28
+ * テーブルに登録されているレコードを順番に取り出すための
29
+ * オブジェクト。Groonga::Table#open_cursorで生成できる。
30
+ */
31
+
32
+ grn_table_cursor *
33
+ rb_grn_table_cursor_from_ruby_object (VALUE object, grn_ctx **context)
34
+ {
35
+ if (!RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnTableCursor))) {
36
+ rb_raise(rb_eTypeError, "not a groonga table cursor");
37
+ }
38
+
39
+ return RVAL2GRNOBJECT(object, context);
40
+ }
41
+
42
+ VALUE
43
+ rb_grn_table_cursor_to_ruby_object (VALUE klass, grn_ctx *context,
44
+ grn_table_cursor *cursor,
45
+ rb_grn_boolean owner)
46
+ {
47
+ return GRNOBJECT2RVAL(klass, context, cursor, owner);
48
+ }
49
+
50
+ void
51
+ rb_grn_table_cursor_deconstruct (RbGrnTableCursor *rb_grn_table_cursor,
52
+ grn_table_cursor **cursor,
53
+ grn_ctx **context,
54
+ grn_id *domain_id,
55
+ grn_obj **domain,
56
+ grn_id *range_id,
57
+ grn_obj **range)
58
+ {
59
+ RbGrnObject *rb_grn_object;
60
+
61
+ rb_grn_object = RB_GRN_OBJECT(rb_grn_table_cursor);
62
+ rb_grn_object_deconstruct(rb_grn_object, cursor, context,
63
+ domain_id, domain,
64
+ range_id, range);
65
+ }
66
+
67
+ /*
68
+ * call-seq:
69
+ * cursor.value -> 値
70
+ *
71
+ * カレントレコードの値を返す。
72
+ */
73
+ static VALUE
74
+ rb_grn_table_cursor_get_value (VALUE self)
75
+ {
76
+ grn_ctx *context;
77
+ grn_table_cursor *cursor;
78
+ VALUE rb_value = Qnil;
79
+
80
+ rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
81
+ NULL, NULL, NULL, NULL);
82
+ if (context && cursor) {
83
+ int n;
84
+ void *value;
85
+
86
+ n = grn_table_cursor_get_value(context, cursor, &value);
87
+ rb_value = rb_str_new(value, n);
88
+ }
89
+
90
+ return rb_value;
91
+ }
92
+
93
+ /*
94
+ * call-seq:
95
+ * cursor.value = 値
96
+ *
97
+ * カレントレコードの値を設定する。既存の値は上書きされる。
98
+ */
99
+ static VALUE
100
+ rb_grn_table_cursor_set_value (VALUE self, VALUE value)
101
+ {
102
+ grn_ctx *context;
103
+ grn_table_cursor *cursor;
104
+
105
+ rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
106
+ NULL, NULL, NULL, NULL);
107
+ if (context && cursor) {
108
+ grn_rc rc;
109
+
110
+ rc = grn_table_cursor_set_value(context,
111
+ cursor,
112
+ StringValuePtr(value),
113
+ GRN_OBJ_SET);
114
+ rb_grn_rc_check(rc, self);
115
+ }
116
+
117
+ return Qnil;
118
+ }
119
+
120
+ /*
121
+ * call-seq:
122
+ * table_cursor.delete
123
+ *
124
+ * カレントレコードを削除する。
125
+ */
126
+ static VALUE
127
+ rb_grn_table_cursor_delete (VALUE self)
128
+ {
129
+ grn_ctx *context;
130
+ grn_table_cursor *cursor;
131
+
132
+ rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
133
+ NULL, NULL, NULL, NULL);
134
+ if (context && cursor) {
135
+ grn_rc rc;
136
+
137
+ rc = grn_table_cursor_delete(context, cursor);
138
+ rb_grn_rc_check(rc, self);
139
+ }
140
+
141
+ return Qnil;
142
+ }
143
+
144
+ /*
145
+ * call-seq:
146
+ * table_cursor.next -> Groonga::Record
147
+ *
148
+ * カレントレコードを一件進めてそのレコードを返す。
149
+ */
150
+ static VALUE
151
+ rb_grn_table_cursor_next (VALUE self)
152
+ {
153
+ VALUE rb_record = Qnil;
154
+ grn_ctx *context;
155
+ grn_table_cursor *cursor;
156
+
157
+ rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
158
+ NULL, NULL, NULL, NULL);
159
+ if (context && cursor) {
160
+ grn_id record_id;
161
+
162
+ record_id = grn_table_cursor_next(context, cursor);
163
+ if (record_id != GRN_ID_NIL) /* FIXME: use grn_table_cursor_table */
164
+ rb_record = rb_grn_record_new(rb_iv_get(self, "@table"),
165
+ record_id, Qnil);
166
+ }
167
+
168
+ return rb_record;
169
+ }
170
+
171
+ /*
172
+ * call-seq:
173
+ * table_cursor.each {|record| ...}
174
+ *
175
+ * カーソルの範囲内にあるレコードを順番にブロックに渡す。
176
+ */
177
+ static VALUE
178
+ rb_grn_table_cursor_each (VALUE self)
179
+ {
180
+ grn_id record_id;
181
+ grn_ctx *context;
182
+ grn_table_cursor *cursor;
183
+
184
+ rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
185
+ NULL, NULL, NULL, NULL);
186
+
187
+ if (context && cursor) {
188
+ while ((record_id = grn_table_cursor_next(context, cursor))) {
189
+ rb_yield(rb_grn_record_new(rb_iv_get(self, "@table"),
190
+ record_id, Qnil));
191
+ }
192
+ }
193
+
194
+ return Qnil;
195
+ }
196
+
197
+ /*
198
+ * Document-method: close
199
+ *
200
+ * call-seq:
201
+ * cursor.close
202
+ *
203
+ * カーソルが使用しているリソースを開放する。これ以降カーソルを
204
+ * 使うことはできない。
205
+ */
206
+
207
+ /*
208
+ * Document-method: closed?
209
+ *
210
+ * call-seq:
211
+ * cursor.closed? -> true/false
212
+ *
213
+ * カーソルが開放済みの場合は+true+を返し、そうでない場合は
214
+ * +false+を返す。
215
+ */
216
+
217
+ void
218
+ rb_grn_init_table_cursor (VALUE mGrn)
219
+ {
220
+ rb_cGrnTableCursor = rb_define_class_under(mGrn, "TableCursor", rb_cObject);
221
+ rb_define_alloc_func(rb_cGrnTableCursor, rb_grn_object_alloc);
222
+
223
+ rb_include_module(rb_cGrnTableCursor, rb_mEnumerable);
224
+
225
+ rb_define_method(rb_cGrnTableCursor, "close",
226
+ rb_grn_object_close, 0);
227
+ rb_define_method(rb_cGrnTableCursor, "closed?",
228
+ rb_grn_object_closed_p, 0);
229
+
230
+ rb_define_method(rb_cGrnTableCursor, "value",
231
+ rb_grn_table_cursor_get_value, 0);
232
+ rb_define_method(rb_cGrnTableCursor, "value=",
233
+ rb_grn_table_cursor_set_value, 1);
234
+ rb_define_method(rb_cGrnTableCursor, "delete",
235
+ rb_grn_table_cursor_delete, 0);
236
+ rb_define_method(rb_cGrnTableCursor, "next",
237
+ rb_grn_table_cursor_next, 0);
238
+
239
+ rb_define_method(rb_cGrnTableCursor, "each",
240
+ rb_grn_table_cursor_each, 0);
241
+
242
+ rb_grn_init_table_cursor_key_support(mGrn);
243
+ rb_grn_init_array_cursor(mGrn);
244
+ rb_grn_init_hash_cursor(mGrn);
245
+ rb_grn_init_patricia_trie_cursor(mGrn);
246
+ rb_grn_init_view_cursor(mGrn);
247
+ }
@@ -0,0 +1,731 @@
1
+ /* -*- c-file-style: "ruby" -*- */
2
+ /*
3
+ Copyright (C) 2009-2010 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
+ #define SELF(object) ((RbGrnTableKeySupport *)DATA_PTR(object))
22
+
23
+ VALUE rb_mGrnTableKeySupport;
24
+
25
+ /*
26
+ * Document-module: Groonga::Table::KeySupport
27
+ *
28
+ * 主キーを持つテーブルであるGroonga::Hashと
29
+ * Groonga::PatriciaTrieに主キーの機能を提供するモジュール。
30
+ */
31
+
32
+ void
33
+ rb_grn_table_key_support_deconstruct (RbGrnTableKeySupport *rb_grn_table_key_support,
34
+ grn_obj **table_key_support,
35
+ grn_ctx **context,
36
+ grn_obj **key,
37
+ grn_id *domain_id,
38
+ grn_obj **domain,
39
+ grn_obj **value,
40
+ grn_id *range_id,
41
+ grn_obj **range,
42
+ VALUE *columns)
43
+ {
44
+ RbGrnTable *rb_grn_table;
45
+
46
+ rb_grn_table = RB_GRN_TABLE(rb_grn_table_key_support);
47
+
48
+ rb_grn_table_deconstruct(rb_grn_table, table_key_support, context,
49
+ domain_id, domain,
50
+ value, range_id, range,
51
+ columns);
52
+
53
+ if (key)
54
+ *key = rb_grn_table_key_support->key;
55
+ }
56
+
57
+ void
58
+ rb_grn_table_key_support_finalizer (grn_ctx *context,
59
+ grn_obj *grn_object,
60
+ RbGrnTableKeySupport *rb_grn_table_key_support)
61
+ {
62
+ if (!context)
63
+ return;
64
+
65
+ if (rb_grn_table_key_support->key)
66
+ grn_obj_unlink(context, rb_grn_table_key_support->key);
67
+ rb_grn_table_key_support->key = NULL;
68
+
69
+ rb_grn_table_finalizer(context, grn_object,
70
+ RB_GRN_TABLE(rb_grn_table_key_support));
71
+ }
72
+
73
+ void
74
+ rb_grn_table_key_support_bind (RbGrnTableKeySupport *rb_grn_table_key_support,
75
+ grn_ctx *context,
76
+ grn_obj *table_key_support)
77
+ {
78
+ RbGrnObject *rb_grn_object;
79
+ RbGrnTable *rb_grn_table;
80
+
81
+ rb_grn_object = RB_GRN_OBJECT(rb_grn_table_key_support);
82
+
83
+ rb_grn_table = RB_GRN_TABLE(rb_grn_table_key_support);
84
+ rb_grn_table_bind(rb_grn_table, context, table_key_support);
85
+
86
+ rb_grn_table_key_support->key =
87
+ grn_obj_open(context, GRN_BULK, 0, rb_grn_object->domain_id);
88
+ }
89
+
90
+ static VALUE
91
+ rb_grn_table_key_support_initialize (int argc, VALUE *argv, VALUE self)
92
+ {
93
+ grn_ctx *context = NULL;
94
+ grn_obj *table;
95
+ VALUE rb_context;
96
+
97
+ table = rb_grn_table_open_raw(argc, argv, &context, &rb_context);
98
+ rb_grn_context_check(context, self);
99
+ rb_grn_object_assign(Qnil, self, rb_context, context, table);
100
+
101
+ return Qnil;
102
+ }
103
+
104
+ static grn_id
105
+ rb_grn_table_key_support_add_raw (VALUE self, VALUE rb_key)
106
+ {
107
+ grn_ctx *context;
108
+ grn_obj *table;
109
+ grn_id id, domain_id;
110
+ grn_obj *key, *domain;
111
+
112
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
113
+ &key, &domain_id, &domain,
114
+ NULL, NULL, NULL,
115
+ NULL);
116
+
117
+ GRN_BULK_REWIND(key);
118
+ RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);
119
+ id = grn_table_add(context, table,
120
+ GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key), NULL);
121
+ rb_grn_context_check(context, self);
122
+
123
+ return id;
124
+ }
125
+
126
+ /*
127
+ * call-seq:
128
+ * table.add(key, values=nil) -> Groonga::Recordまたはnil
129
+ *
130
+ * 主キーが_key_のレコード追加し、追加したレコードを返す。レ
131
+ * コードの追加に失敗した場合は+nil+を返す。
132
+ *
133
+ * _values_にはレコードのカラムに設定する値を指定する。省略
134
+ * した場合または+nil+を指定した場合はカラムは設定しない。カ
135
+ * ラムの値は<tt>{:カラム名1 => 値1, :カラム名2 => 値2,
136
+ * ...}</tt>と指定する。
137
+ */
138
+ static VALUE
139
+ rb_grn_table_key_support_add (int argc, VALUE *argv, VALUE self)
140
+ {
141
+ grn_id id;
142
+ VALUE key, values;
143
+
144
+ rb_scan_args(argc, argv, "11", &key, &values);
145
+ id = rb_grn_table_key_support_add_raw(self, key);
146
+ if (GRN_ID_NIL == id)
147
+ return Qnil;
148
+ else
149
+ return rb_grn_record_new(self, id, values);
150
+ }
151
+
152
+ grn_id
153
+ rb_grn_table_key_support_get (VALUE self, VALUE rb_key)
154
+ {
155
+ grn_ctx *context;
156
+ grn_obj *table, *key, *domain;
157
+ grn_id id, domain_id;
158
+
159
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
160
+ &key, &domain_id, &domain,
161
+ NULL, NULL, NULL,
162
+ NULL);
163
+
164
+ GRN_BULK_REWIND(key);
165
+ RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);
166
+ id = grn_table_get(context, table,
167
+ GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key));
168
+ rb_grn_context_check(context, self);
169
+
170
+ return id;
171
+ }
172
+
173
+ /*
174
+ * call-seq:
175
+ * table.id -> テーブルID
176
+ * table.id(key) -> レコードID
177
+ *
178
+ * _key_を指定しない場合はテーブルのIDを返す。
179
+ *
180
+ * _key_を指定した場合はテーブルの_key_に対応するレコードの
181
+ * IDを返す。
182
+ */
183
+ static VALUE
184
+ rb_grn_table_key_support_get_id (int argc, VALUE *argv, VALUE self)
185
+ {
186
+ VALUE rb_key;
187
+
188
+ rb_scan_args(argc, argv, "01", &rb_key);
189
+ if (NIL_P(rb_key)) {
190
+ return rb_grn_object_get_id(self);
191
+ } else {
192
+ grn_id id;
193
+
194
+ id = rb_grn_table_key_support_get(self, rb_key);
195
+ if (id == GRN_ID_NIL) {
196
+ return Qnil;
197
+ } else {
198
+ return UINT2NUM(id);
199
+ }
200
+ }
201
+ }
202
+
203
+ /*
204
+ * call-seq:
205
+ * table.key(id) -> 主キー
206
+ *
207
+ * テーブルの_id_に対応する主キーを返す。
208
+ */
209
+ static VALUE
210
+ rb_grn_table_key_support_get_key (VALUE self, VALUE rb_id)
211
+ {
212
+ grn_ctx *context;
213
+ grn_obj *table, *key;
214
+ grn_id id;
215
+ int key_size;
216
+ VALUE rb_key;
217
+
218
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
219
+ &key, NULL, NULL,
220
+ NULL, NULL, NULL,
221
+ NULL);
222
+
223
+ id = NUM2UINT(rb_id);
224
+ GRN_BULK_REWIND(key);
225
+ key_size = grn_table_get_key(context, table, id,
226
+ GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key));
227
+ if (key_size == 0)
228
+ return Qnil;
229
+
230
+ if (GRN_BULK_VSIZE(key) < key_size) {
231
+ grn_bulk_reserve(context, key, key_size);
232
+ grn_table_get_key(context, table, id, GRN_BULK_HEAD(key), key_size);
233
+ }
234
+
235
+ rb_key = GRNKEY2RVAL(context, GRN_BULK_HEAD(key), key_size, table, self);
236
+ return rb_key;
237
+ }
238
+
239
+ /*
240
+ * call-seq:
241
+ * table.has_key?(key) -> true/false
242
+ *
243
+ * テーブルに主キーが_key_のレコードがあるならtrueを返す。
244
+ */
245
+ static VALUE
246
+ rb_grn_table_key_support_has_key (VALUE self, VALUE rb_key)
247
+ {
248
+ grn_ctx *context;
249
+ grn_obj *table, *key, *domain;
250
+ grn_id id, domain_id;
251
+
252
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
253
+ &key, &domain_id, &domain,
254
+ NULL, NULL, NULL,
255
+ NULL);
256
+
257
+ GRN_BULK_REWIND(key);
258
+ RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);
259
+ id = grn_table_get(context, table, GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key));
260
+
261
+ return id == GRN_ID_NIL ? Qfalse : Qtrue;
262
+ }
263
+
264
+ static VALUE
265
+ rb_grn_table_key_support_delete_by_key (VALUE self, VALUE rb_key)
266
+ {
267
+ grn_ctx *context;
268
+ grn_obj *table;
269
+ grn_id domain_id;
270
+ grn_obj *key, *domain;
271
+ grn_rc rc;
272
+
273
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
274
+ &key, &domain_id, &domain,
275
+ NULL, NULL, NULL,
276
+ NULL);
277
+
278
+ GRN_BULK_REWIND(key);
279
+ RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);
280
+ rc = grn_table_delete(context, table,
281
+ GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key));
282
+ rb_grn_context_check(context, self);
283
+ rb_grn_rc_check(rc, self);
284
+
285
+ return Qnil;
286
+ }
287
+
288
+ /*
289
+ * call-seq:
290
+ * table.delete(id)
291
+ * table.delete(key)
292
+ *
293
+ * テーブルの_id_または_key_に対応するレコードを削除する。
294
+ */
295
+ static VALUE
296
+ rb_grn_table_key_support_delete (VALUE self, VALUE rb_id_or_key)
297
+ {
298
+ if (FIXNUM_P(rb_id_or_key)) {
299
+ return rb_grn_table_delete(self, rb_id_or_key);
300
+ } else {
301
+ return rb_grn_table_key_support_delete_by_key(self, rb_id_or_key);
302
+ }
303
+ }
304
+
305
+ /*
306
+ * Document-method: []
307
+ *
308
+ * call-seq:
309
+ * table[key] -> Groonga::Record
310
+ *
311
+ * _table_の_key_に対応するGroonga::Recordを返す。
312
+ *
313
+ * 0.9.0から値ではなくGroonga::Recordを返すようになった。
314
+ */
315
+ static VALUE
316
+ rb_grn_table_key_support_array_reference (VALUE self, VALUE rb_key)
317
+ {
318
+ grn_id id;
319
+
320
+ id = rb_grn_table_key_support_get(self, rb_key);
321
+ if (id == GRN_ID_NIL) {
322
+ return Qnil;
323
+ } else {
324
+ return rb_grn_record_new(self, id, Qnil);
325
+ }
326
+ }
327
+
328
+ typedef struct _SetValueData
329
+ {
330
+ VALUE self;
331
+ grn_id id;
332
+ grn_obj *table;
333
+ RbGrnObject rb_grn_object;
334
+ } SetValueData;
335
+
336
+ static VALUE
337
+ set_value (VALUE args, SetValueData *data)
338
+ {
339
+ VALUE rb_name, rb_value, rb_column;
340
+ RbGrnObject *rb_grn_object;
341
+
342
+ rb_name = rb_ary_entry(args, 0);
343
+ rb_value = rb_ary_entry(args, 1);
344
+
345
+ rb_column = rb_grn_table_get_column(data->self, rb_name);
346
+ if (NIL_P(rb_column)) {
347
+ rb_raise(rb_eGrnNoSuchColumn,
348
+ "no such column: <%s>: <%s>",
349
+ rb_grn_inspect(rb_name), rb_grn_inspect(data->self));
350
+ }
351
+
352
+ rb_grn_object = RB_GRN_OBJECT(DATA_PTR(rb_column));
353
+ return rb_grn_object_set_raw(rb_grn_object,
354
+ data->id, rb_value, GRN_OBJ_SET, data->self);
355
+ }
356
+
357
+ /*
358
+ * Document-method: []=
359
+ *
360
+ * call-seq:
361
+ * table[key] = {:column_name => value, ...}
362
+ *
363
+ * _table_の_key_に対応するカラム_column_name_の値を設定する。
364
+ * _key_に対応するレコードがない場合は新しく作成される。
365
+ *
366
+ * 0.9.0から値ではなくカラムの値を設定するようになった。
367
+ */
368
+ static VALUE
369
+ rb_grn_table_key_support_array_set (VALUE self, VALUE rb_key, VALUE rb_values)
370
+ {
371
+ grn_id id;
372
+ SetValueData data;
373
+ grn_ctx *context;
374
+ grn_obj *table;
375
+
376
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
377
+ NULL, NULL, NULL,
378
+ NULL, NULL, NULL,
379
+ NULL);
380
+
381
+ id = rb_grn_table_key_support_add_raw(self, rb_key);
382
+
383
+ if (id == GRN_ID_NIL) {
384
+ rb_raise(rb_eGrnError,
385
+ "failed to add record: %s",
386
+ rb_grn_inspect(rb_ary_new3(3, self, rb_key, rb_values)));
387
+ }
388
+
389
+ data.self = self;
390
+ data.id = id;
391
+ data.table = table;
392
+ data.rb_grn_object.context = context;
393
+ rb_iterate(rb_each, rb_values, set_value, (VALUE)&data);
394
+
395
+ return Qnil;
396
+ }
397
+
398
+ /*
399
+ * call-seq:
400
+ * table.set_column_value(key, name, value)
401
+ * table.set_column_value(id, name, value, :id => true)
402
+ *
403
+ * _table_の_key_に対応するカラム_name_の値を設定する。
404
+ * _key_に対応するレコードがない場合は新しく作成される。
405
+ */
406
+ static VALUE
407
+ rb_grn_table_key_support_set_column_value (int argc, VALUE *argv, VALUE self)
408
+ {
409
+ grn_id id;
410
+ VALUE rb_key, rb_id_or_key, rb_name, rb_value, rb_options;
411
+
412
+ rb_scan_args(argc, argv, "31",
413
+ &rb_id_or_key, &rb_name, &rb_value, &rb_options);
414
+ if (!NIL_P(rb_options)) {
415
+ VALUE rb_option_id;
416
+ rb_grn_scan_options(rb_options,
417
+ "id", &rb_option_id,
418
+ NULL);
419
+ if (RVAL2CBOOL(rb_option_id)) {
420
+ VALUE rb_id = rb_id_or_key;
421
+ return rb_grn_table_set_column_value(self, rb_id, rb_name, rb_value);
422
+ }
423
+ }
424
+
425
+ rb_key = rb_id_or_key;
426
+ id = rb_grn_table_key_support_add_raw(self, rb_key);
427
+ if (id == GRN_ID_NIL) {
428
+ rb_raise(rb_eGrnError,
429
+ "failed to add record: %s",
430
+ rb_grn_inspect(rb_ary_new3(4,
431
+ self, rb_key,
432
+ rb_name, rb_value)));
433
+ }
434
+
435
+ return rb_grn_table_set_column_value_raw(self, id, rb_name, rb_value);
436
+ }
437
+
438
+ /*
439
+ * call-seq:
440
+ * table.column_value(key, name)
441
+ * table.column_value(id, name, :id => true)
442
+ *
443
+ * _table_の_key_に対応するカラム_name_の値を設定する。
444
+ *
445
+ * TODO: _key_に対応するレコードがない場合は例外?
446
+ */
447
+ static VALUE
448
+ rb_grn_table_key_support_get_column_value (int argc, VALUE *argv, VALUE self)
449
+ {
450
+ grn_id id;
451
+ VALUE rb_key, rb_id_or_key, rb_name, rb_options;
452
+
453
+ rb_scan_args(argc, argv, "21", &rb_id_or_key, &rb_name, &rb_options);
454
+ if (!NIL_P(rb_options)) {
455
+ VALUE rb_option_id;
456
+ rb_grn_scan_options(rb_options,
457
+ "id", &rb_option_id,
458
+ NULL);
459
+ if (RVAL2CBOOL(rb_option_id)) {
460
+ VALUE rb_id = rb_id_or_key;
461
+ return rb_grn_table_get_column_value(self, rb_id, rb_name);
462
+ }
463
+ }
464
+
465
+ rb_key = rb_id_or_key;
466
+ id = rb_grn_table_key_support_get(self, rb_key);
467
+ if (id == GRN_ID_NIL) {
468
+ return Qnil;
469
+ }
470
+
471
+ return rb_grn_table_get_column_value_raw(self, id, rb_name);
472
+ }
473
+
474
+ /*
475
+ * call-seq:
476
+ * table.find(key) -> Groonga::Record
477
+ *
478
+ * テーブルの_key_に対応するレコードを返す。
479
+ *
480
+ * 0.9.0から非推奨。代わりにtable[key]を使うこと。
481
+ */
482
+ static VALUE
483
+ rb_grn_table_key_support_find (VALUE self, VALUE rb_key)
484
+ {
485
+ rb_warn("#find is deprecated. Use #[] instead: %s",
486
+ rb_grn_inspect(self));
487
+
488
+ return rb_grn_table_key_support_array_reference(self, rb_key);
489
+ }
490
+
491
+ static VALUE
492
+ rb_grn_table_key_support_get_value_by_key (VALUE self, VALUE rb_key)
493
+ {
494
+ grn_ctx *context;
495
+ grn_obj *table, *value, *range;
496
+ grn_id id;
497
+
498
+ id = rb_grn_table_key_support_get(self, rb_key);
499
+
500
+ if (id == GRN_ID_NIL)
501
+ return Qnil;
502
+
503
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
504
+ NULL, NULL, NULL,
505
+ &value, NULL, &range,
506
+ NULL);
507
+ GRN_BULK_REWIND(value);
508
+ grn_obj_get_value(context, table, id, value);
509
+ rb_grn_context_check(context, self);
510
+
511
+ return GRNBULK2RVAL(context, value, range, self);
512
+ }
513
+
514
+ /*
515
+ * call-seq:
516
+ * table.value(id, :id => true) -> 値
517
+ * table.value(key) -> 値
518
+ *
519
+ * _table_の_id_または_key_に対応する値を返す。
520
+ */
521
+ static VALUE
522
+ rb_grn_table_key_support_get_value (int argc, VALUE *argv, VALUE self)
523
+ {
524
+ VALUE rb_id_or_key, rb_options;
525
+ rb_grn_boolean use_key;
526
+
527
+ rb_scan_args(argc, argv, "11", &rb_id_or_key, &rb_options);
528
+
529
+ if (NIL_P(rb_options)) {
530
+ use_key = RB_GRN_TRUE;
531
+ } else {
532
+ VALUE rb_option_id;
533
+
534
+ rb_grn_scan_options(rb_options,
535
+ "id", &rb_option_id,
536
+ NULL);
537
+ use_key = !RVAL2CBOOL(rb_option_id);
538
+ }
539
+
540
+ if (use_key) {
541
+ return rb_grn_table_key_support_get_value_by_key(self, rb_id_or_key);
542
+ } else {
543
+ return rb_grn_table_get_value(self, rb_id_or_key);
544
+ }
545
+ }
546
+
547
+ static VALUE
548
+ rb_grn_table_key_support_set_value_by_key (VALUE self,
549
+ VALUE rb_key, VALUE rb_value)
550
+ {
551
+ grn_ctx *context;
552
+ grn_obj *table;
553
+ grn_id id;
554
+ grn_obj *value;
555
+ grn_rc rc;
556
+
557
+ if (NIL_P(rb_key)) {
558
+ rb_raise(rb_eArgError, "key should not be nil: <%s>",
559
+ rb_grn_inspect(self));
560
+ }
561
+
562
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
563
+ NULL, NULL, NULL,
564
+ &value, NULL, NULL,
565
+ NULL);
566
+
567
+ id = rb_grn_table_key_support_add_raw(self, rb_key);
568
+ if (GRN_ID_NIL == id) {
569
+ rb_raise(rb_eGrnError,
570
+ "failed to add new record with key: <%s>: <%s>",
571
+ rb_grn_inspect(rb_key),
572
+ rb_grn_inspect(self));
573
+ }
574
+
575
+ GRN_BULK_REWIND(value);
576
+ RVAL2GRNBULK(rb_value, context, value);
577
+ rc = grn_obj_set_value(context, table, id, value, GRN_OBJ_SET);
578
+ rb_grn_context_check(context, self);
579
+ rb_grn_rc_check(rc, self);
580
+
581
+ return rb_value;
582
+ }
583
+
584
+ /*
585
+ * call-seq:
586
+ * table.set_value(id, value, :id => true)
587
+ * table.set_value(key, value)
588
+ *
589
+ * _table_の_id_または_key_に対応する値を_value_に設定する。
590
+ * 既存の値は上書きされる。
591
+ */
592
+ static VALUE
593
+ rb_grn_table_key_support_set_value (int argc, VALUE *argv, VALUE self)
594
+ {
595
+ VALUE rb_id_or_key, rb_value, rb_options;
596
+ rb_grn_boolean use_key;
597
+
598
+ rb_scan_args(argc, argv, "21", &rb_id_or_key, &rb_value, &rb_options);
599
+
600
+ if (NIL_P(rb_options)) {
601
+ use_key = RB_GRN_TRUE;
602
+ } else {
603
+ VALUE rb_option_id;
604
+
605
+ rb_grn_scan_options(rb_options,
606
+ "id", &rb_option_id,
607
+ NULL);
608
+ use_key = !RVAL2CBOOL(rb_option_id);
609
+ }
610
+
611
+ if (use_key) {
612
+ return rb_grn_table_key_support_set_value_by_key(self,
613
+ rb_id_or_key,
614
+ rb_value);
615
+ } else {
616
+ return rb_grn_table_set_value(self, rb_id_or_key, rb_value);
617
+ }
618
+ }
619
+
620
+ /*
621
+ * call-seq:
622
+ * table.default_tokenizer -> nilまたはGroonga::Procedure
623
+ *
624
+ * Groonga::IndexColumnで使用するトークナイザを返す。
625
+ */
626
+ static VALUE
627
+ rb_grn_table_key_support_get_default_tokenizer (VALUE self)
628
+ {
629
+ grn_ctx *context = NULL;
630
+ grn_obj *table;
631
+ grn_obj *tokenizer = NULL;
632
+
633
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
634
+ NULL, NULL, NULL,
635
+ NULL, NULL, NULL,
636
+ NULL);
637
+
638
+ tokenizer = grn_obj_get_info(context, table, GRN_INFO_DEFAULT_TOKENIZER,
639
+ NULL);
640
+ rb_grn_context_check(context, self);
641
+
642
+ return GRNOBJECT2RVAL(Qnil, context, tokenizer, RB_GRN_FALSE);
643
+ }
644
+
645
+ /*
646
+ * call-seq:
647
+ * table.default_tokenizer = トークナイザ
648
+ *
649
+ * Groonga::IndexColumnで使用するトークナイザを設定する。
650
+ *
651
+ * 例:
652
+ * # 2-gramを使用。
653
+ * table.default_tokenizer = "TokenBigram"
654
+ * # オブジェクトで指定
655
+ * table.default_tokenizer = Groonga::Context.default["TokenBigram"]
656
+ * # オブジェクトIDで指定
657
+ * table.default_tokenizer = Groonga::Type::BIGRAM
658
+ * # N-gram用のトークナイザを使うときはGroonga::IndexColumn
659
+ * # には自動的に:with_section => trueが指定される。
660
+ * index = table.define_index_column("blog_content", "Blogs",
661
+ * :source => "content")
662
+ * p index # -> #<Groonga::IndexColumn ... flags: <WITH_POSITION|...>>
663
+ *
664
+ * # MeCabを使用
665
+ * table.default_tokenizer = "TokenMecab"
666
+ */
667
+ static VALUE
668
+ rb_grn_table_key_support_set_default_tokenizer (VALUE self, VALUE rb_tokenizer)
669
+ {
670
+ grn_ctx *context;
671
+ grn_obj *table;
672
+ grn_obj *tokenizer;
673
+ grn_rc rc;
674
+
675
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
676
+ NULL, NULL, NULL,
677
+ NULL, NULL, NULL,
678
+ NULL);
679
+
680
+ tokenizer = RVAL2GRNOBJECT(rb_tokenizer, &context);
681
+ rc = grn_obj_set_info(context, table,
682
+ GRN_INFO_DEFAULT_TOKENIZER, tokenizer);
683
+ rb_grn_context_check(context, self);
684
+ rb_grn_rc_check(rc, self);
685
+
686
+ return Qnil;
687
+ }
688
+
689
+ void
690
+ rb_grn_init_table_key_support (VALUE mGrn)
691
+ {
692
+ rb_mGrnTableKeySupport = rb_define_module_under(rb_cGrnTable, "KeySupport");
693
+ rb_include_module(rb_mGrnTableKeySupport, rb_mGrnEncodingSupport);
694
+
695
+ rb_define_method(rb_mGrnTableKeySupport, "initialize",
696
+ rb_grn_table_key_support_initialize, -1);
697
+
698
+ rb_define_method(rb_mGrnTableKeySupport, "add",
699
+ rb_grn_table_key_support_add, -1);
700
+ rb_define_method(rb_mGrnTableKeySupport, "id",
701
+ rb_grn_table_key_support_get_id, -1);
702
+ rb_define_method(rb_mGrnTableKeySupport, "key",
703
+ rb_grn_table_key_support_get_key, 1);
704
+ rb_define_method(rb_mGrnTableKeySupport, "has_key?",
705
+ rb_grn_table_key_support_has_key, 1);
706
+
707
+ rb_define_method(rb_mGrnTableKeySupport, "delete",
708
+ rb_grn_table_key_support_delete, 1);
709
+
710
+ rb_define_method(rb_mGrnTableKeySupport, "find",
711
+ rb_grn_table_key_support_find, 1);
712
+ rb_define_method(rb_mGrnTableKeySupport, "[]",
713
+ rb_grn_table_key_support_array_reference, 1);
714
+ rb_define_method(rb_mGrnTableKeySupport, "[]=",
715
+ rb_grn_table_key_support_array_set, 2);
716
+
717
+ rb_define_method(rb_mGrnTableKeySupport, "column_value",
718
+ rb_grn_table_key_support_get_column_value, -1);
719
+ rb_define_method(rb_mGrnTableKeySupport, "set_column_value",
720
+ rb_grn_table_key_support_set_column_value, -1);
721
+
722
+ rb_define_method(rb_mGrnTableKeySupport, "value",
723
+ rb_grn_table_key_support_get_value, -1);
724
+ rb_define_method(rb_mGrnTableKeySupport, "set_value",
725
+ rb_grn_table_key_support_set_value, -1);
726
+
727
+ rb_define_method(rb_mGrnTableKeySupport, "default_tokenizer",
728
+ rb_grn_table_key_support_get_default_tokenizer, 0);
729
+ rb_define_method(rb_mGrnTableKeySupport, "default_tokenizer=",
730
+ rb_grn_table_key_support_set_default_tokenizer, 1);
731
+ }