groonga 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. metadata +38 -227
  2. data/AUTHORS +0 -5
  3. data/NEWS.ja.rdoc +0 -114
  4. data/NEWS.rdoc +0 -116
  5. data/README.ja.rdoc +0 -63
  6. data/README.rdoc +0 -64
  7. data/Rakefile +0 -216
  8. data/benchmark/common.rb +0 -49
  9. data/benchmark/read-write-many-small-items.rb +0 -144
  10. data/benchmark/write-many-small-items.rb +0 -135
  11. data/example/bookmark.rb +0 -161
  12. data/example/index-html.rb +0 -89
  13. data/example/search/config.ru +0 -211
  14. data/example/search/public/css/groonga.css +0 -122
  15. data/ext/.gitignore +0 -2
  16. data/ext/rb-grn-accessor.c +0 -52
  17. data/ext/rb-grn-array-cursor.c +0 -36
  18. data/ext/rb-grn-array.c +0 -210
  19. data/ext/rb-grn-column.c +0 -570
  20. data/ext/rb-grn-context.c +0 -655
  21. data/ext/rb-grn-database.c +0 -415
  22. data/ext/rb-grn-encoding-support.c +0 -64
  23. data/ext/rb-grn-encoding.c +0 -257
  24. data/ext/rb-grn-exception.c +0 -1110
  25. data/ext/rb-grn-expression-builder.c +0 -75
  26. data/ext/rb-grn-expression.c +0 -732
  27. data/ext/rb-grn-fix-size-column.c +0 -166
  28. data/ext/rb-grn-hash-cursor.c +0 -38
  29. data/ext/rb-grn-hash.c +0 -294
  30. data/ext/rb-grn-index-column.c +0 -488
  31. data/ext/rb-grn-logger.c +0 -325
  32. data/ext/rb-grn-object.c +0 -1335
  33. data/ext/rb-grn-operation.c +0 -198
  34. data/ext/rb-grn-patricia-trie-cursor.c +0 -39
  35. data/ext/rb-grn-patricia-trie.c +0 -488
  36. data/ext/rb-grn-procedure.c +0 -52
  37. data/ext/rb-grn-query.c +0 -260
  38. data/ext/rb-grn-record.c +0 -40
  39. data/ext/rb-grn-snippet.c +0 -328
  40. data/ext/rb-grn-table-cursor-key-support.c +0 -69
  41. data/ext/rb-grn-table-cursor.c +0 -246
  42. data/ext/rb-grn-table-key-support.c +0 -731
  43. data/ext/rb-grn-table.c +0 -2038
  44. data/ext/rb-grn-type.c +0 -181
  45. data/ext/rb-grn-utils.c +0 -769
  46. data/ext/rb-grn-variable-size-column.c +0 -36
  47. data/ext/rb-grn-variable.c +0 -108
  48. data/ext/rb-grn.h +0 -684
  49. data/ext/rb-groonga.c +0 -113
  50. data/extconf.rb +0 -216
  51. data/html/bar.svg +0 -153
  52. data/html/developer.html +0 -121
  53. data/html/developer.svg +0 -469
  54. data/html/download.svg +0 -253
  55. data/html/favicon.ico +0 -0
  56. data/html/favicon.xcf +0 -0
  57. data/html/footer.html.erb +0 -28
  58. data/html/head.html.erb +0 -4
  59. data/html/header.html.erb +0 -17
  60. data/html/index.html +0 -147
  61. data/html/install.svg +0 -636
  62. data/html/logo.xcf +0 -0
  63. data/html/ranguba.css +0 -248
  64. data/html/tutorial.svg +0 -559
  65. data/lib/groonga.rb +0 -83
  66. data/lib/groonga/expression-builder.rb +0 -285
  67. data/lib/groonga/patricia-trie.rb +0 -53
  68. data/lib/groonga/record.rb +0 -276
  69. data/lib/groonga/schema.rb +0 -916
  70. data/license/GPL +0 -340
  71. data/license/LGPL +0 -504
  72. data/license/RUBY +0 -59
  73. data/misc/grnop2ruby.rb +0 -49
  74. data/pkg-config.rb +0 -333
  75. data/src/rb-grn-table-cursor.c +0 -296
  76. data/test-unit/Rakefile +0 -40
  77. data/test-unit/TODO +0 -5
  78. data/test-unit/bin/testrb +0 -5
  79. data/test-unit/html/classic.html +0 -15
  80. data/test-unit/html/index.html +0 -25
  81. data/test-unit/html/index.html.ja +0 -27
  82. data/test-unit/lib/test/unit.rb +0 -323
  83. data/test-unit/lib/test/unit/assertionfailederror.rb +0 -25
  84. data/test-unit/lib/test/unit/assertions.rb +0 -1230
  85. data/test-unit/lib/test/unit/attribute.rb +0 -125
  86. data/test-unit/lib/test/unit/autorunner.rb +0 -353
  87. data/test-unit/lib/test/unit/collector.rb +0 -36
  88. data/test-unit/lib/test/unit/collector/descendant.rb +0 -23
  89. data/test-unit/lib/test/unit/collector/dir.rb +0 -108
  90. data/test-unit/lib/test/unit/collector/load.rb +0 -136
  91. data/test-unit/lib/test/unit/collector/objectspace.rb +0 -34
  92. data/test-unit/lib/test/unit/color-scheme.rb +0 -102
  93. data/test-unit/lib/test/unit/color.rb +0 -96
  94. data/test-unit/lib/test/unit/diff.rb +0 -724
  95. data/test-unit/lib/test/unit/error.rb +0 -130
  96. data/test-unit/lib/test/unit/exceptionhandler.rb +0 -39
  97. data/test-unit/lib/test/unit/failure.rb +0 -136
  98. data/test-unit/lib/test/unit/fixture.rb +0 -176
  99. data/test-unit/lib/test/unit/notification.rb +0 -129
  100. data/test-unit/lib/test/unit/omission.rb +0 -191
  101. data/test-unit/lib/test/unit/pending.rb +0 -150
  102. data/test-unit/lib/test/unit/priority.rb +0 -181
  103. data/test-unit/lib/test/unit/runner/console.rb +0 -52
  104. data/test-unit/lib/test/unit/runner/emacs.rb +0 -8
  105. data/test-unit/lib/test/unit/runner/tap.rb +0 -8
  106. data/test-unit/lib/test/unit/testcase.rb +0 -476
  107. data/test-unit/lib/test/unit/testresult.rb +0 -89
  108. data/test-unit/lib/test/unit/testsuite.rb +0 -110
  109. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +0 -14
  110. data/test-unit/lib/test/unit/ui/console/testrunner.rb +0 -464
  111. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +0 -63
  112. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +0 -92
  113. data/test-unit/lib/test/unit/ui/testrunner.rb +0 -28
  114. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +0 -77
  115. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +0 -41
  116. data/test-unit/lib/test/unit/util/backtracefilter.rb +0 -41
  117. data/test-unit/lib/test/unit/util/method-owner-finder.rb +0 -28
  118. data/test-unit/lib/test/unit/util/observable.rb +0 -90
  119. data/test-unit/lib/test/unit/util/procwrapper.rb +0 -48
  120. data/test-unit/lib/test/unit/version.rb +0 -7
  121. data/test-unit/sample/adder.rb +0 -13
  122. data/test-unit/sample/subtracter.rb +0 -12
  123. data/test-unit/sample/test_adder.rb +0 -20
  124. data/test-unit/sample/test_subtracter.rb +0 -20
  125. data/test-unit/sample/test_user.rb +0 -23
  126. data/test-unit/test/collector/test-descendant.rb +0 -133
  127. data/test-unit/test/collector/test-load.rb +0 -329
  128. data/test-unit/test/collector/test_dir.rb +0 -406
  129. data/test-unit/test/collector/test_objectspace.rb +0 -100
  130. data/test-unit/test/run-test.rb +0 -15
  131. data/test-unit/test/test-attribute.rb +0 -86
  132. data/test-unit/test/test-color-scheme.rb +0 -67
  133. data/test-unit/test/test-color.rb +0 -47
  134. data/test-unit/test/test-diff.rb +0 -518
  135. data/test-unit/test/test-emacs-runner.rb +0 -60
  136. data/test-unit/test/test-fixture.rb +0 -287
  137. data/test-unit/test/test-notification.rb +0 -33
  138. data/test-unit/test/test-omission.rb +0 -81
  139. data/test-unit/test/test-pending.rb +0 -70
  140. data/test-unit/test/test-priority.rb +0 -119
  141. data/test-unit/test/test-testcase.rb +0 -554
  142. data/test-unit/test/test_assertions.rb +0 -1151
  143. data/test-unit/test/test_error.rb +0 -26
  144. data/test-unit/test/test_failure.rb +0 -33
  145. data/test-unit/test/test_testresult.rb +0 -113
  146. data/test-unit/test/test_testsuite.rb +0 -129
  147. data/test-unit/test/testunit-test-util.rb +0 -14
  148. data/test-unit/test/ui/test_testrunmediator.rb +0 -20
  149. data/test-unit/test/util/test-method-owner-finder.rb +0 -38
  150. data/test-unit/test/util/test_backtracefilter.rb +0 -41
  151. data/test-unit/test/util/test_observable.rb +0 -102
  152. data/test-unit/test/util/test_procwrapper.rb +0 -36
  153. data/test/.gitignore +0 -1
  154. data/test/groonga-test-utils.rb +0 -106
  155. data/test/run-test.rb +0 -58
  156. data/test/test-array.rb +0 -97
  157. data/test/test-column.rb +0 -298
  158. data/test/test-context.rb +0 -73
  159. data/test/test-database.rb +0 -113
  160. data/test/test-encoding.rb +0 -33
  161. data/test/test-exception.rb +0 -93
  162. data/test/test-expression-builder.rb +0 -156
  163. data/test/test-expression.rb +0 -133
  164. data/test/test-fix-size-column.rb +0 -65
  165. data/test/test-gqtp.rb +0 -70
  166. data/test/test-hash.rb +0 -312
  167. data/test/test-index-column.rb +0 -81
  168. data/test/test-patricia-trie.rb +0 -189
  169. data/test/test-procedure.rb +0 -37
  170. data/test/test-query.rb +0 -22
  171. data/test/test-record.rb +0 -268
  172. data/test/test-remote.rb +0 -53
  173. data/test/test-schema.rb +0 -416
  174. data/test/test-snippet.rb +0 -121
  175. data/test/test-table-cursor.rb +0 -153
  176. data/test/test-table-offset-and-limit.rb +0 -102
  177. data/test/test-table-select-normalize.rb +0 -48
  178. data/test/test-table-select.rb +0 -145
  179. data/test/test-table.rb +0 -642
  180. data/test/test-type.rb +0 -61
  181. data/test/test-variable-size-column.rb +0 -98
  182. data/test/test-variable.rb +0 -28
  183. data/test/test-vector-column.rb +0 -76
  184. data/test/test-version.rb +0 -31
  185. data/text/TUTORIAL.ja.rdoc +0 -392
  186. data/text/expression.rdoc +0 -284
@@ -1,488 +0,0 @@
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
- #include <string.h>
22
-
23
- #define SELF(object) ((RbGrnIndexColumn *)DATA_PTR(object))
24
-
25
- VALUE rb_cGrnIndexColumn;
26
-
27
- /*
28
- * Document-class: Groonga::IndexColumn < Groonga::Column
29
- *
30
- * 転置索引エントリを格納するカラム。このカラムを利用するこ
31
- * とにより高速な全文検索を実現できる。
32
- *
33
- * テーブルにGroonga::IndexColumnを定義する方法は
34
- * Groonga::Table#define_index_columnを参照。
35
- */
36
-
37
- void
38
- rb_grn_index_column_finalizer (grn_ctx *context, grn_obj *object,
39
- RbGrnIndexColumn *rb_grn_index_column)
40
- {
41
- if (!context)
42
- return;
43
-
44
- grn_obj_close(context, rb_grn_index_column->id_query);
45
- grn_obj_close(context, rb_grn_index_column->string_query);
46
- grn_obj_close(context, rb_grn_index_column->old_value);
47
-
48
- rb_grn_column_finalizer(context, object, RB_GRN_COLUMN(rb_grn_index_column));
49
- }
50
-
51
- void
52
- rb_grn_index_column_bind (RbGrnIndexColumn *rb_grn_index_column,
53
- grn_ctx *context, grn_obj *column)
54
- {
55
- RbGrnObject *rb_grn_object;
56
-
57
- rb_grn_column_bind(RB_GRN_COLUMN(rb_grn_index_column), context, column);
58
- rb_grn_object = RB_GRN_OBJECT(rb_grn_index_column);
59
-
60
- rb_grn_index_column->old_value = grn_obj_open(context, GRN_BULK, 0,
61
- rb_grn_object->range_id);
62
-
63
- rb_grn_index_column->id_query = grn_obj_open(context, GRN_BULK, 0,
64
- rb_grn_object->domain_id);
65
- rb_grn_index_column->string_query = grn_obj_open(context, GRN_BULK,
66
- GRN_OBJ_DO_SHALLOW_COPY,
67
- GRN_ID_NIL);
68
- }
69
-
70
- void
71
- rb_grn_index_column_deconstruct (RbGrnIndexColumn *rb_grn_index_column,
72
- grn_obj **column,
73
- grn_ctx **context,
74
- grn_id *domain_id,
75
- grn_obj **domain,
76
- grn_obj **value,
77
- grn_obj **old_value,
78
- grn_id *range_id,
79
- grn_obj **range,
80
- grn_obj **id_query,
81
- grn_obj **string_query)
82
- {
83
- RbGrnObject *rb_grn_object;
84
-
85
- rb_grn_object = RB_GRN_OBJECT(rb_grn_index_column);
86
- rb_grn_column_deconstruct(RB_GRN_COLUMN(rb_grn_object), column, context,
87
- domain_id, domain, value,
88
- range_id, range);
89
-
90
- if (old_value)
91
- *old_value = rb_grn_index_column->old_value;
92
- if (id_query)
93
- *id_query = rb_grn_index_column->id_query;
94
- if (string_query)
95
- *string_query = rb_grn_index_column->string_query;
96
- }
97
-
98
- /*
99
- * call-seq:
100
- * column[id] = value
101
- * column[id] = options
102
- *
103
- * IDが_id_であるレコードを高速に全文検索するため転置索引を作
104
- * 成する。多くの場合、Groonga::Table#define_index_columnで
105
- * +:source+オプションを指定することにより、自動的に全文検索
106
- * 用の索引は更新されるので、明示的にこのメソッドを使うこと
107
- * は少ない。
108
- *
109
- * _value_には文字列を指定する。
110
- *
111
- * _options_を指定することにより、より索引の作成を制御できる。
112
- * _options_に指定可能な値は以下の通り。
113
- *
114
- * [+:section+]
115
- * 段落番号を指定する。省略した場合は1を指定したとみなされ
116
- * る。
117
- *
118
- * Groonga::Table#define_index_columnで
119
- * <tt>{:with_section => true}</tt>を指定していなければい
120
- * けない。
121
- *
122
- * [+:old_value+]
123
- * 以前の値を指定する。省略した場合は現在の値が用いられる。
124
- * 通常は指定する必要はない。
125
- *
126
- * [+:value+]
127
- * 新しい値を指定する。_value_を指定した場合と_options_で
128
- * <tt>{:value => value}</tt>を指定した場合は同じ動作とな
129
- * る。
130
- *
131
- * 記事の段落毎に索引を作成する。
132
- * articles = Groonga::Array.create(:name => "<articles>")
133
- * articles.define_column("title", "ShortText")
134
- * articles.define_column("content", "Text")
135
- *
136
- * terms = Groonga::Hash.create(:name => "<terms>",
137
- * :default_tokenizer => "TokenBigram")
138
- * content_index = terms.define_index_column("content", articles,
139
- * :with_section => true)
140
- *
141
- * content = <<-EOC
142
- * groonga は組み込み型の全文検索エンジンライブラリです。
143
- * DBMSやスクリプト言語処理系等に組み込むことによって、その
144
- * 全文検索機能を強化することができます。また、リレーショナ
145
- * ルモデルに基づくデータストア機能を内包しており、groonga
146
- * 単体でも高速なデータストアサーバとして使用することができ
147
- * ます。
148
- *
149
- * ■全文検索方式
150
- * 転置索引型の全文検索エンジンです。転置索引は圧縮されてファ
151
- * イルに格納され、検索時のディスク読み出し量を小さく、かつ
152
- * 局所的に抑えるように設計されています。用途に応じて以下の
153
- * 索引タイプを選択できます。
154
- * EOC
155
- *
156
- * groonga = articles.add(:title => "groonga", :content => content)
157
- *
158
- * content.split(/\n{2,}/).each_with_index do |sentence, i|
159
- * content_index[groonga] = {:value => sentence, :section => i + 1}
160
- * end
161
- *
162
- * content_index.search("エンジン").collect do |record|
163
- * p record.key["title"] # -> "groonga"
164
- * end
165
- */
166
- static VALUE
167
- rb_grn_index_column_array_set (VALUE self, VALUE rb_id, VALUE rb_value)
168
- {
169
- grn_ctx *context = NULL;
170
- grn_obj *column, *range;
171
- grn_rc rc;
172
- grn_id id;
173
- unsigned int section;
174
- grn_obj *old_value, *new_value;
175
- VALUE original_rb_value, rb_section, rb_old_value, rb_new_value;
176
-
177
- original_rb_value = rb_value;
178
-
179
- rb_grn_index_column_deconstruct(SELF(self), &column, &context,
180
- NULL, NULL,
181
- &new_value, &old_value,
182
- NULL, &range,
183
- NULL, NULL);
184
-
185
- id = RVAL2GRNID(rb_id, context, range, self);
186
-
187
- if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_value, rb_cHash))) {
188
- VALUE hash_value;
189
- hash_value = rb_hash_new();
190
- rb_hash_aset(hash_value, RB_GRN_INTERN("value"), rb_value);
191
- rb_value = hash_value;
192
- }
193
-
194
- rb_grn_scan_options(rb_value,
195
- "section", &rb_section,
196
- "old_value", &rb_old_value,
197
- "value", &rb_new_value,
198
- NULL);
199
-
200
- if (NIL_P(rb_section))
201
- section = 1;
202
- else
203
- section = NUM2UINT(rb_section);
204
-
205
- if (NIL_P(rb_old_value)) {
206
- old_value = NULL;
207
- } else {
208
- GRN_BULK_REWIND(old_value);
209
- RVAL2GRNBULK(rb_old_value, context, old_value);
210
- }
211
-
212
- if (NIL_P(rb_new_value)) {
213
- new_value = NULL;
214
- } else {
215
- GRN_BULK_REWIND(new_value);
216
- RVAL2GRNBULK(rb_new_value, context, new_value);
217
- }
218
-
219
- rc = grn_column_index_update(context, column,
220
- id, section, old_value, new_value);
221
- rb_grn_context_check(context, self);
222
- rb_grn_rc_check(rc, self);
223
-
224
- return original_rb_value;
225
- }
226
-
227
- /*
228
- * call-seq:
229
- * column.sources -> Groonga::Columnの配列
230
- *
231
- * インデックス対象となっているカラムの配列を返す。
232
- */
233
- static VALUE
234
- rb_grn_index_column_get_sources (VALUE self)
235
- {
236
- grn_ctx *context = NULL;
237
- grn_obj *column;
238
- grn_obj sources;
239
- grn_id *source_ids;
240
- VALUE rb_sources;
241
- int i, n;
242
-
243
- rb_grn_index_column_deconstruct(SELF(self), &column, &context,
244
- NULL, NULL,
245
- NULL, NULL, NULL, NULL,
246
- NULL, NULL);
247
-
248
- GRN_OBJ_INIT(&sources, GRN_BULK, 0, GRN_ID_NIL);
249
- grn_obj_get_info(context, column, GRN_INFO_SOURCE, &sources);
250
- rb_grn_context_check(context, self);
251
-
252
- n = GRN_BULK_VSIZE(&sources) / sizeof(grn_id);
253
- source_ids = (grn_id *)GRN_BULK_HEAD(&sources);
254
- rb_sources = rb_ary_new2(n);
255
- for (i = 0; i < n; i++) {
256
- grn_obj *source;
257
- VALUE rb_source;
258
-
259
- source = grn_ctx_at(context, *source_ids);
260
- rb_source = GRNOBJECT2RVAL(Qnil, context, source, RB_GRN_FALSE);
261
- rb_ary_push(rb_sources, rb_source);
262
- source_ids++;
263
- }
264
- grn_obj_close(context, &sources);
265
-
266
- return rb_sources;
267
- }
268
-
269
- static grn_id
270
- resolve_source_id (grn_ctx *context, grn_obj *column, VALUE rb_source)
271
- {
272
- grn_id source_id;
273
-
274
- if (CBOOL2RVAL(rb_obj_is_kind_of(rb_source, rb_cInteger))) {
275
- source_id = NUM2UINT(rb_source);
276
- } else {
277
- grn_obj *source;
278
-
279
- if (TYPE(rb_source) == T_STRING) {
280
- grn_obj *table;
281
- const char *name;
282
- const char *dot_point;
283
- int length;
284
-
285
- table = grn_ctx_at(context, grn_obj_get_range(context, column));
286
- name = StringValueCStr(rb_source);
287
- length = RSTRING_LEN(rb_source);
288
- dot_point = strstr(name, ".");
289
- if (dot_point) {
290
- char table_name[4096];
291
- int table_name_length;
292
-
293
- table_name_length = grn_obj_name(context, table,
294
- table_name, sizeof(table_name));
295
- table_name[table_name_length] = '\0';
296
- if (strncmp(table_name, name, dot_point - name) != 0) {
297
- rb_raise(rb_eArgError,
298
- "wrong table's column: <%s>: "
299
- "expected table: <%s>",
300
- name, table_name);
301
- }
302
- length -= (dot_point - name) + 1;
303
- name = dot_point + 1;
304
- }
305
- source = grn_obj_column(context, table, name, length);
306
- } else {
307
- source = RVAL2GRNOBJECT(rb_source, &context);
308
- }
309
- rb_grn_context_check(context, rb_source);
310
- source_id = grn_obj_id(context, source);
311
- }
312
-
313
- return source_id;
314
- }
315
-
316
- /*
317
- * call-seq:
318
- * column.sources = Groonga::Columnの配列
319
- *
320
- * インデックス対象となる複数のカラムを配列で設定する。
321
- */
322
- static VALUE
323
- rb_grn_index_column_set_sources (VALUE self, VALUE rb_sources)
324
- {
325
- VALUE exception;
326
- grn_ctx *context = NULL;
327
- grn_obj *column;
328
- int i, n;
329
- VALUE *rb_source_values;
330
- grn_id *sources;
331
- grn_rc rc;
332
-
333
- rb_grn_index_column_deconstruct(SELF(self), &column, &context,
334
- NULL, NULL,
335
- NULL, NULL, NULL, NULL,
336
- NULL, NULL);
337
-
338
- n = RARRAY_LEN(rb_sources);
339
- rb_source_values = RARRAY_PTR(rb_sources);
340
- sources = ALLOCA_N(grn_id, n);
341
- for (i = 0; i < n; i++) {
342
- sources[i] = resolve_source_id(context, column, rb_source_values[i]);
343
- }
344
-
345
- {
346
- grn_obj bulk_sources;
347
- GRN_OBJ_INIT(&bulk_sources, GRN_BULK, 0, GRN_ID_NIL);
348
- GRN_TEXT_SET(context, &bulk_sources, sources, n * sizeof(grn_id));
349
- rc = grn_obj_set_info(context, column, GRN_INFO_SOURCE, &bulk_sources);
350
- exception = rb_grn_context_to_exception(context, self);
351
- grn_obj_close(context, &bulk_sources);
352
- }
353
-
354
- if (!NIL_P(exception))
355
- rb_exc_raise(exception);
356
- rb_grn_rc_check(rc, self);
357
-
358
- return Qnil;
359
- }
360
-
361
- /*
362
- * call-seq:
363
- * column.source = Groonga::Column
364
- *
365
- * インデックス対象となるカラムを設定する。
366
- */
367
- static VALUE
368
- rb_grn_index_column_set_source (VALUE self, VALUE rb_source)
369
- {
370
- if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_source, rb_cArray)))
371
- rb_source = rb_ary_new3(1, rb_source);
372
-
373
- return rb_grn_index_column_set_sources(self, rb_source);
374
- }
375
-
376
- /*
377
- * Document-method: search
378
- *
379
- * call-seq:
380
- * column.search(query, options={}) -> Groonga::Hash
381
- *
382
- * _object_から_query_に対応するオブジェクトを検索し、見つかっ
383
- * たオブジェクトのIDがキーになっているGroonga::Hashを返す。
384
- *
385
- * 利用可能なオプションは以下の通り。
386
- *
387
- * [_:result_]
388
- * 結果を格納するGroonga::Hash。指定しない場合は新しく
389
- * Groonga::Hashを生成し、それに結果を格納して返す。
390
- * [_:operator_]
391
- * 以下のどれかの値を指定する。+nil+, <tt>"or"</tt>, <tt>"||"</tt>,
392
- * <tt>"and"</tt>, <tt>"+"</tt>, <tt>"&&"</tt>, <tt>"but"</tt>,
393
- * <tt>"not"</tt>, <tt>"-"</tt>, <tt>"adjust"</tt>, <tt>">"</tt>。
394
- * それぞれ以下のようになる。(FIXME: 「以下」)
395
- * [_:exact_]
396
- * +true+を指定すると完全一致で検索する
397
- * [_:longest_common_prefix_]
398
- * +true+を指定すると_query_と同じ接頭辞をもつエントリのう
399
- * ち、もっとも長いエントリを検索する
400
- * [_:suffix_]
401
- * +true+を指定すると_query_が後方一致するエントリを検索す
402
- * る
403
- * [_:prefix_]
404
- * +true+を指定すると_query_が前方一致するレコードを検索す
405
- * る
406
- * [_:near_]
407
- * +true+を指定すると_query_に指定した複数の語が近傍に含ま
408
- * れるレコードを検索する
409
- * [...]
410
- * ...
411
- */
412
- static VALUE
413
- rb_grn_index_column_search (int argc, VALUE *argv, VALUE self)
414
- {
415
- grn_ctx *context;
416
- grn_obj *column;
417
- grn_obj *range;
418
- grn_obj *query = NULL, *id_query = NULL, *string_query = NULL;
419
- grn_obj *result;
420
- grn_operator operator;
421
- grn_rc rc;
422
- VALUE rb_query, options, rb_result, rb_operator;
423
-
424
- rb_grn_index_column_deconstruct(SELF(self), &column, &context,
425
- NULL, NULL,
426
- NULL, NULL, NULL, &range,
427
- &id_query, &string_query);
428
-
429
- rb_scan_args(argc, argv, "11", &rb_query, &options);
430
-
431
- if (CBOOL2RVAL(rb_obj_is_kind_of(rb_query, rb_cGrnQuery))) {
432
- grn_query *_query;
433
- _query = RVAL2GRNQUERY(rb_query);
434
- query = (grn_obj *)_query;
435
- } else if (CBOOL2RVAL(rb_obj_is_kind_of(rb_query, rb_cInteger))) {
436
- grn_id id;
437
- id = NUM2UINT(rb_query);
438
- GRN_TEXT_SET(context, id_query, &id, sizeof(grn_id));
439
- query = id_query;
440
- } else {
441
- const char *_query;
442
- _query = StringValuePtr(rb_query);
443
- GRN_TEXT_SET(context, string_query, _query, RSTRING_LEN(rb_query));
444
- query = string_query;
445
- }
446
-
447
- rb_grn_scan_options(options,
448
- "result", &rb_result,
449
- "operator", &rb_operator,
450
- NULL);
451
-
452
- if (NIL_P(rb_result)) {
453
- result = grn_table_create(context, NULL, 0, NULL,
454
- GRN_OBJ_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC,
455
- range, 0);
456
- rb_grn_context_check(context, self);
457
- rb_result = GRNOBJECT2RVAL(Qnil, context, result, RB_GRN_TRUE);
458
- } else {
459
- result = RVAL2GRNOBJECT(rb_result, &context);
460
- }
461
-
462
- operator = RVAL2GRNOPERATOR(rb_operator);
463
-
464
- rc = grn_obj_search(context, column, query, result, operator, NULL);
465
- rb_grn_rc_check(rc, self);
466
-
467
- return rb_result;
468
- }
469
-
470
- void
471
- rb_grn_init_index_column (VALUE mGrn)
472
- {
473
- rb_cGrnIndexColumn =
474
- rb_define_class_under(mGrn, "IndexColumn", rb_cGrnColumn);
475
-
476
- rb_define_method(rb_cGrnIndexColumn, "[]=",
477
- rb_grn_index_column_array_set, 2);
478
-
479
- rb_define_method(rb_cGrnIndexColumn, "sources",
480
- rb_grn_index_column_get_sources, 0);
481
- rb_define_method(rb_cGrnIndexColumn, "sources=",
482
- rb_grn_index_column_set_sources, 1);
483
- rb_define_method(rb_cGrnIndexColumn, "source=",
484
- rb_grn_index_column_set_source, 1);
485
-
486
- rb_define_method(rb_cGrnIndexColumn, "search",
487
- rb_grn_index_column_search, -1);
488
- }