groonga 0.0.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/NEWS.ja.rdoc +56 -0
  2. data/NEWS.rdoc +58 -0
  3. data/Rakefile +2 -3
  4. data/benchmark/read-write-many-small-items.rb +16 -32
  5. data/benchmark/write-many-small-items.rb +14 -28
  6. data/example/bookmark.rb +19 -17
  7. data/example/index-html.rb +11 -1
  8. data/example/search/config.ru +14 -9
  9. data/ext/rb-grn-array.c +6 -6
  10. data/ext/rb-grn-column.c +348 -18
  11. data/ext/rb-grn-context.c +8 -4
  12. data/ext/rb-grn-database.c +6 -7
  13. data/ext/rb-grn-exception.c +101 -5
  14. data/ext/rb-grn-expression.c +206 -23
  15. data/ext/rb-grn-fix-size-column.c +6 -39
  16. data/ext/rb-grn-hash.c +24 -24
  17. data/ext/rb-grn-index-column.c +74 -19
  18. data/ext/rb-grn-logger.c +48 -0
  19. data/ext/rb-grn-object.c +281 -67
  20. data/ext/rb-grn-operation.c +1 -1
  21. data/ext/rb-grn-patricia-trie-cursor.c +10 -1
  22. data/ext/rb-grn-patricia-trie.c +268 -7
  23. data/ext/rb-grn-query.c +52 -1
  24. data/ext/rb-grn-record.c +8 -2
  25. data/ext/rb-grn-snippet.c +63 -1
  26. data/ext/rb-grn-table-cursor-key-support.c +15 -1
  27. data/ext/rb-grn-table-cursor.c +57 -0
  28. data/ext/rb-grn-table-key-support.c +382 -46
  29. data/ext/rb-grn-table.c +729 -192
  30. data/ext/rb-grn-type.c +63 -12
  31. data/ext/rb-grn-utils.c +156 -158
  32. data/ext/rb-grn-variable.c +18 -0
  33. data/ext/rb-grn.h +85 -21
  34. data/ext/rb-groonga.c +13 -3
  35. data/extconf.rb +19 -4
  36. data/html/developer.html +1 -1
  37. data/html/header.html.erb +1 -1
  38. data/html/index.html +4 -4
  39. data/lib/groonga.rb +10 -0
  40. data/lib/groonga/expression-builder.rb +81 -42
  41. data/lib/groonga/patricia-trie.rb +13 -0
  42. data/lib/groonga/record.rb +158 -13
  43. data/lib/groonga/schema.rb +339 -33
  44. data/pkg-config.rb +6 -1
  45. data/test-unit/lib/test/unit.rb +23 -42
  46. data/test-unit/lib/test/unit/assertionfailederror.rb +11 -0
  47. data/test-unit/lib/test/unit/assertions.rb +87 -9
  48. data/test-unit/lib/test/unit/autorunner.rb +20 -11
  49. data/test-unit/lib/test/unit/collector.rb +1 -8
  50. data/test-unit/lib/test/unit/collector/load.rb +2 -3
  51. data/test-unit/lib/test/unit/color-scheme.rb +13 -1
  52. data/test-unit/lib/test/unit/diff.rb +223 -37
  53. data/test-unit/lib/test/unit/error.rb +4 -0
  54. data/test-unit/lib/test/unit/failure.rb +31 -5
  55. data/test-unit/lib/test/unit/notification.rb +8 -4
  56. data/test-unit/lib/test/unit/omission.rb +51 -3
  57. data/test-unit/lib/test/unit/pending.rb +4 -0
  58. data/test-unit/lib/test/unit/testcase.rb +55 -4
  59. data/test-unit/lib/test/unit/ui/console/testrunner.rb +190 -4
  60. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +14 -0
  61. data/test-unit/lib/test/unit/ui/testrunner.rb +8 -0
  62. data/test-unit/lib/test/unit/version.rb +1 -1
  63. data/test-unit/sample/{tc_adder.rb → test_adder.rb} +3 -1
  64. data/test-unit/sample/{tc_subtracter.rb → test_subtracter.rb} +3 -1
  65. data/test-unit/sample/test_user.rb +1 -0
  66. data/test-unit/test/collector/test-descendant.rb +2 -4
  67. data/test-unit/test/collector/test_objectspace.rb +7 -5
  68. data/test-unit/test/run-test.rb +2 -0
  69. data/test-unit/test/test-color-scheme.rb +7 -0
  70. data/test-unit/test/test-diff.rb +48 -7
  71. data/test-unit/test/test-omission.rb +1 -1
  72. data/test-unit/test/test-testcase.rb +47 -0
  73. data/test-unit/test/test_assertions.rb +79 -10
  74. data/test/groonga-test-utils.rb +6 -1
  75. data/test/test-array.rb +29 -14
  76. data/test/test-column.rb +107 -55
  77. data/test/test-context.rb +5 -0
  78. data/test/test-database.rb +2 -37
  79. data/test/test-exception.rb +9 -1
  80. data/test/test-expression-builder.rb +23 -5
  81. data/test/test-expression.rb +44 -8
  82. data/test/test-fix-size-column.rb +16 -5
  83. data/test/test-gqtp.rb +70 -0
  84. data/test/test-hash.rb +142 -43
  85. data/test/test-index-column.rb +9 -9
  86. data/test/test-patricia-trie.rb +79 -20
  87. data/test/test-procedure.rb +4 -2
  88. data/test/test-record.rb +32 -20
  89. data/test/test-remote.rb +3 -2
  90. data/test/test-schema.rb +226 -92
  91. data/test/test-table-cursor.rb +103 -1
  92. data/test/test-table-offset-and-limit.rb +102 -0
  93. data/test/test-table-select-normalize.rb +4 -4
  94. data/test/test-table-select.rb +52 -8
  95. data/test/test-table.rb +235 -116
  96. data/test/test-type.rb +2 -2
  97. data/test/test-variable-size-column.rb +21 -5
  98. data/test/test-vector-column.rb +76 -0
  99. data/{TUTORIAL.ja.rdoc → text/TUTORIAL.ja.rdoc} +52 -52
  100. data/text/expression.rdoc +284 -0
  101. metadata +11 -7
  102. data/test-unit/sample/ts_examples.rb +0 -7
@@ -60,7 +60,7 @@ rb_grn_init_operation (VALUE mGrn)
60
60
  rb_define_const(rb_mGrnOperation, "SHIFTL_ASSIGN",
61
61
  UINT2NUM(GRN_OP_SHIFTL_ASSIGN));
62
62
  rb_define_const(rb_mGrnOperation, "SHIRTR_ASSIGN",
63
- UINT2NUM(GRN_OP_SHIRTR_ASSIGN));
63
+ UINT2NUM(GRN_OP_SHIFTR_ASSIGN));
64
64
  rb_define_const(rb_mGrnOperation, "SHIFTRR_ASSIGN",
65
65
  UINT2NUM(GRN_OP_SHIFTRR_ASSIGN));
66
66
  rb_define_const(rb_mGrnOperation, "AND_ASSIGN",
@@ -20,11 +20,20 @@
20
20
 
21
21
  VALUE rb_cGrnPatriciaTrieCursor;
22
22
 
23
+ /*
24
+ * Document-class: Groonga::PatriciaTrieCursor < Groonga::TableCursor
25
+ *
26
+ * Groonga::PatriciaTrieに登録されているレコードを順番に取り
27
+ * 出すためのオブジェクト。利用できるメソッドは
28
+ * Groonga::TableCursorとGroonga::TableCursor::KeySupportを
29
+ * 参照。
30
+ */
31
+
23
32
  void
24
33
  rb_grn_init_patricia_trie_cursor (VALUE mGrn)
25
34
  {
26
35
  rb_cGrnPatriciaTrieCursor =
27
36
  rb_define_class_under(mGrn, "PatriciaTrieCursor", rb_cGrnTableCursor);
28
37
 
29
- rb_include_module(rb_cGrnHashCursor, rb_mGrnTableCursorKeySupport);
38
+ rb_include_module(rb_cGrnPatriciaTrieCursor, rb_mGrnTableCursorKeySupport);
30
39
  }
@@ -1,4 +1,5 @@
1
1
  /* -*- c-file-style: "ruby" -*- */
2
+ /* vim: set sts=4 sw=4 ts=8 noet: */
2
3
  /*
3
4
  Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
4
5
 
@@ -22,8 +23,137 @@
22
23
 
23
24
  VALUE rb_cGrnPatriciaTrie;
24
25
 
26
+ /*
27
+ * Document-class: Groonga::PatriciaTrie < Groonga::Table
28
+ *
29
+ * 各レコードをパトリシアトライで管理するテーブル。ハッシュ
30
+ * テーブルに比べて完全一致検索の速度がやや遅いが、前方一致
31
+ * 検索・共通接頭辞探索などの検索ができる。またカーソルを用
32
+ * いてキーの昇降順にレコードを取り出すことができる。
33
+ */
34
+
35
+ /*
36
+ * call-seq:
37
+ * Groonga::PatriciaTrie.create(options={}) -> Groonga::PatriciaTrie
38
+ * Groonga::PatriciaTrie.create(options={}) {|table| ... }
39
+ *
40
+ * 各レコードをパトリシアトライで管理するテーブルを生成する。
41
+ * ブロックを指定すると、そのブロックに生成したテーブルが渡さ
42
+ * れ、ブロックを抜けると自動的にテーブルが破棄される。
43
+ *
44
+ * _options_に指定可能な値は以下の通り。
45
+ *
46
+ * [+:context+]
47
+ * テーブルが利用するGroonga::Context。省略すると
48
+ * Groonga::Context.defaultを用いる。
49
+ *
50
+ * [+:name+]
51
+ * テーブルの名前。名前をつけると、Groonga::Context#[]に名
52
+ * 前を指定してテーブルを取得することができる。省略すると
53
+ * 無名テーブルになり、テーブルIDでのみ取得できる。
54
+ *
55
+ * [+:path+]
56
+ * テーブルを保存するパス。パスを指定すると永続テーブルとな
57
+ * り、プロセス終了後もレコードは保持される。次回起動時に
58
+ * Groonga::PatriciaTrie.openで保存されたレコードを利用する
59
+ * ことができる。省略すると一時テーブルになり、プロセスが終
60
+ * 了するとレコードは破棄される。
61
+ *
62
+ * [+:persistent+]
63
+ * +true+を指定すると永続テーブルとなる。+path+を省略した
64
+ * 場合は自動的にパスが付加される。+:context+で指定した
65
+ * Groonga::Contextに結びついているデータベースが一時デー
66
+ * タベースの場合は例外が発生する。
67
+ *
68
+ * [+:key_normalize+]
69
+ * +true+を指定するとキーを正規化する。
70
+ *
71
+ * [+:key_with_sis+]
72
+ * +true+を指定するとキーの文字列の全suffixが自動的に登
73
+ * 録される。
74
+ *
75
+ * [+:key_type+]
76
+ * キーの種類を示すオブジェクトを指定する。キーの種類には型
77
+ * 名("Int32"や"ShortText"など)またはGroonga::Typeまたは
78
+ * テーブル(Groonga::Array、Groonga::Hash、
79
+ * Groonga::PatriciaTrieのどれか)を指定する。
80
+ *
81
+ * Groonga::Typeを指定した場合は、その型が示す範囲の値をキー
82
+ * として使用する。ただし、キーの最大サイズは4096バイトで
83
+ * あるため、Groonga::Type::TEXTやGroonga::Type::LONG_TEXT
84
+ * は使用できない。
85
+ *
86
+ * テーブルを指定した場合はレコードIDをキーとして使用する。
87
+ * 指定したテーブルのGroonga::Recordをキーとして使用するこ
88
+ * ともでき、その場合は自動的にGroonga::Recordからレコード
89
+ * IDを取得する。
90
+ *
91
+ * 省略した場合は文字列をキーとして使用する。この場合、
92
+ * 4096バイトまで使用可能である。
93
+ *
94
+ * [+:value_type+]
95
+ * 値の型を指定する。省略すると値のための領域を確保しない。
96
+ * 値を保存したい場合は必ず指定すること。
97
+ *
98
+ * 参考: Groonga::Type.new
99
+ *
100
+ * [+:default_tokenizer+]
101
+ * Groonga::IndexColumnで使用するトークナイザを指定する。
102
+ * デフォルトでは何も設定されていないので、テーブルに
103
+ * Groonga::IndexColumnを定義する場合は
104
+ * <tt>"TokenBigram"</tt>などを指定する必要がある。
105
+ *
106
+ * [+:sub_records+]
107
+ * +true+を指定すると#groupでグループ化したときに、
108
+ * Groonga::Record#n_sub_recordsでグループに含まれるレコー
109
+ * ドの件数を取得できる。
110
+ *
111
+ * 使用例:
112
+ *
113
+ * 無名一時テーブルを生成する。
114
+ * Groonga::PatriciaTrie.create
115
+ *
116
+ * 無名永続テーブルを生成する。
117
+ * Groonga::PatriciaTrie.create(:path => "/tmp/hash.grn")
118
+ *
119
+ * 名前付き永続テーブルを生成する。ただし、ファイル名は気に
120
+ * しない。
121
+ * Groonga::PatriciaTrie.create(:name => "Bookmarks",
122
+ * :persistent => true)
123
+ *
124
+ * それぞれのレコードに512バイトの値を格納できる無名一時テー
125
+ * ブルを生成する。
126
+ * Groonga::PatriciaTrie.create(:value => 512)
127
+ *
128
+ * キーとして文字列を使用する無名一時テーブルを生成する。
129
+ * Groonga::PatriciaTrie.create(:key_type => Groonga::Type::SHORT_TEXT)
130
+ *
131
+ * キーとして文字列を使用する無名一時テーブルを生成する。
132
+ * (キーの種類を表すオブジェクトは文字列で指定。)
133
+ * Groonga::PatriciaTrie.create(:key_type => "ShortText")
134
+ *
135
+ * キーとして<tt>Bookmarks</tt>テーブルのレコードを使用す
136
+ * る無名一時テーブルを生成する。
137
+ * bookmarks = Groonga::PatriciaTrie.create(:name => "Bookmarks")
138
+ * Groonga::PatriciaTrie.create(:key_type => bookmarks)
139
+ *
140
+ * キーとして<tt>Bookmarks</tt>テーブルのレコードを使用す
141
+ * る無名一時テーブルを生成する。
142
+ * (テーブルは文字列で指定。)
143
+ * Groonga::PatriciaTrie.create(:name => "Bookmarks")
144
+ * Groonga::PatriciaTrie.create(:key_type => "Bookmarks")
145
+ *
146
+ * 全文検索用のトークンをバイグラムで切り出す無名一時テーブ
147
+ * ルを生成する。
148
+ * bookmarks = Groonga::PatriciaTrie.create(:name => "Bookmarks")
149
+ * bookmarks.define_column("comment", "Text")
150
+ * terms = Groonga::PatriciaTrie.create(:name => "Terms",
151
+ * :default_tokenizer => "TokenBigram")
152
+ * terms.define_index_column("content", bookmarks,
153
+ * :source => "Bookmarks.comment")
154
+ */
25
155
  static VALUE
26
- rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
156
+ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
27
157
  {
28
158
  grn_ctx *context;
29
159
  grn_obj *key_type = NULL, *value_type = NULL, *table;
@@ -89,9 +219,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
89
219
  flags, key_type, value_type);
90
220
  if (!table)
91
221
  rb_grn_context_check(context, rb_ary_new4(argc, argv));
92
- rb_table = rb_grn_object_alloc(self);
93
- rb_grn_object_assign(Qnil, rb_table, rb_context, context, table);
94
- rb_grn_context_check(context, rb_table);
222
+ rb_table = GRNOBJECT2RVAL(klass, context, table, RB_GRN_TRUE);
95
223
 
96
224
  if (!NIL_P(rb_default_tokenizer))
97
225
  rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
@@ -103,6 +231,52 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
103
231
  return rb_table;
104
232
  }
105
233
 
234
+ /*
235
+ * call-seq:
236
+ * patricia_trie.search(key, options=nil) -> Groonga::Hash
237
+ *
238
+ * _key_にマッチするレコードのIDがキーに入っている
239
+ * Groonga::Hashを返す。マッチするレコードがない場合は空の
240
+ * Groonga::Hashが返る。
241
+ *
242
+ * _options_で+:result+を指定することにより、そのテーブルにマッ
243
+ * チしたレコードIDがキーのレコードを追加することができる。
244
+ * +:result+にテーブルを指定した場合は、そのテーブルが返る。
245
+ *
246
+ * _options_に指定可能な値は以下の通り。
247
+ *
248
+ * [+:result+]
249
+ * 結果を格納するテーブル。
250
+ *
251
+ * [+:operator+]
252
+ * マッチしたレコードをどのように扱うか。指定可能な値は以
253
+ * 下の通り。省略した場合はGroonga::Operation::OR。
254
+ *
255
+ * [Groonga::Operation::OR]
256
+ * マッチしたレコードを追加。すでにレコードが追加され
257
+ * ている場合は何もしない。
258
+ * [Groonga::Operation::AND]
259
+ * マッチしたレコードのスコアを増加。マッチしなかった
260
+ * レコードを削除。
261
+ * [Groonga::Operation::BUT]
262
+ * マッチしたレコードを削除。
263
+ * [Groonga::Operation::ADJUST]
264
+ * マッチしたレコードのスコアを増加。
265
+ *
266
+ * [+:type+]
267
+ * ?????
268
+ *
269
+ * 複数のキーで検索し、結果を1つのテーブルに集める。
270
+ * result = nil
271
+ * keys = ["morita", "gunyara-kun", "yu"]
272
+ * keys.each do |key|
273
+ * result = users.search(key, :result => result)
274
+ * end
275
+ * result.each do |record|
276
+ * user = record.key
277
+ * p user.key # -> "morita"または"gunyara-kun"または"yu"
278
+ * end
279
+ */
106
280
  static VALUE
107
281
  rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
108
282
  {
@@ -113,12 +287,13 @@ rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
113
287
  grn_obj *key, *domain, *result;
114
288
  grn_operator operator;
115
289
  grn_search_optarg search_options;
116
- rb_grn_boolean search_options_is_set = RB_GRN_TRUE;
290
+ rb_grn_boolean search_options_is_set = RB_GRN_FALSE;
117
291
  VALUE rb_key, options, rb_result, rb_operator, rb_type;
118
292
 
119
293
  rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
120
294
  &key, &domain_id, &domain,
121
- NULL, NULL, NULL);
295
+ NULL, NULL, NULL,
296
+ NULL);
122
297
 
123
298
  rb_scan_args(argc, argv, "11", &rb_key, &options);
124
299
 
@@ -150,6 +325,51 @@ rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
150
325
  return rb_result;
151
326
  }
152
327
 
328
+ /*
329
+ * call-seq:
330
+ * patricia_trie.scan(string) -> Array
331
+ * patricia_trie.scan(string) {|record, word, start, length| ... }
332
+ *
333
+ * _string_を走査し、_patricia_trie_内に格納されているキーに
334
+ * マッチした部分文字列の情報をブロックに渡す。複数のキーが
335
+ * マッチする場合は最長一致するキーを優先する。
336
+ *
337
+ * [_record_]
338
+ * マッチしたキーのGroonga::Record。
339
+ *
340
+ * [_word_]
341
+ * マッチした部分文字列。
342
+ *
343
+ * [_start_]
344
+ * _string_内での_word_の出現位置。(バイト単位)
345
+ *
346
+ * [_length_]
347
+ * _word_の長さ。(バイト探知)
348
+ *
349
+ * ブロックを指定しない場合は、マッチした部分文字列の情報を
350
+ * まとめて配列として返す。
351
+ *
352
+ * words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
353
+ * :key_normalize => true)
354
+ * words.add("リンク")
355
+ * adventure_of_link = words.add('リンクの冒険')
356
+ * words.add('冒険')
357
+ * gaxtu = words.add('ガッ')
358
+ * muteki = words.add('MUTEKI')
359
+ *
360
+ * text = 'muTEki リンクの冒険 ミリバール ガッ'
361
+ * words.scan(text).each do |record, word, start, length|
362
+ * p [record.key, word, start, length]
363
+ * # -> ["MUTEKI", "muTEki", 0, 6]
364
+ * # -> ["リンクの冒険", "リンクの冒険", 7, 18]
365
+ * # -> ["ガッ", "ガッ", 42, 6]
366
+ * end
367
+ *
368
+ * words.scan(text)
369
+ * # -> [[muteki, "muTEki", 0, 6],
370
+ * # [adventure_of_link, "リンクの冒険", 7, 18],
371
+ * # [gaxtu, "ガッ", 42, 6]]
372
+ */
153
373
  static VALUE
154
374
  rb_grn_patricia_trie_scan (VALUE self, VALUE rb_string)
155
375
  {
@@ -166,7 +386,8 @@ rb_grn_patricia_trie_scan (VALUE self, VALUE rb_string)
166
386
 
167
387
  rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
168
388
  NULL, NULL, NULL,
169
- NULL, NULL, NULL);
389
+ NULL, NULL, NULL,
390
+ NULL);
170
391
 
171
392
  block_given = rb_block_given_p();
172
393
  if (!block_given)
@@ -210,6 +431,44 @@ rb_grn_patricia_trie_scan (VALUE self, VALUE rb_string)
210
431
  return rb_result;
211
432
  }
212
433
 
434
+ /*
435
+ * call-seq:
436
+ * patricia_trie.prefix_search(prefix) -> Groonga::Hash
437
+ *
438
+ * キーが_prefix_に前方一致するレコードのIDがキーに入っている
439
+ * Groonga::Hashを返す。マッチするレコードがない場合は空の
440
+ * Groonga::Hashが返る。
441
+ *
442
+ */
443
+ static VALUE
444
+ rb_grn_patricia_trie_prefix_search (VALUE self, VALUE rb_prefix)
445
+ {
446
+ grn_ctx *context;
447
+ grn_obj *table, *key, *domain, *result;
448
+ grn_id domain_id;
449
+ VALUE rb_result;
450
+
451
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
452
+ &key, &domain_id, &domain,
453
+ NULL, NULL, NULL,
454
+ NULL);
455
+
456
+ result = grn_table_create(context, NULL, 0, NULL,
457
+ GRN_OBJ_TABLE_HASH_KEY,
458
+ table, 0);
459
+ rb_grn_context_check(context, self);
460
+ rb_result = GRNOBJECT2RVAL(Qnil, context, result, RB_GRN_TRUE);
461
+
462
+ GRN_BULK_REWIND(key);
463
+ RVAL2GRNKEY(rb_prefix, context, key, domain_id, domain, self);
464
+ grn_pat_prefix_search(context, (grn_pat *)table,
465
+ GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key),
466
+ (grn_hash *)result);
467
+ rb_grn_context_check(context, self);
468
+
469
+ return rb_result;
470
+ }
471
+
213
472
  void
214
473
  rb_grn_init_patricia_trie (VALUE mGrn)
215
474
  {
@@ -224,4 +483,6 @@ rb_grn_init_patricia_trie (VALUE mGrn)
224
483
  rb_grn_patricia_trie_search, -1);
225
484
  rb_define_method(rb_cGrnPatriciaTrie, "scan",
226
485
  rb_grn_patricia_trie_scan, 1);
486
+ rb_define_method(rb_cGrnPatriciaTrie, "prefix_search",
487
+ rb_grn_patricia_trie_prefix_search, 1);
227
488
  }
@@ -18,6 +18,15 @@
18
18
 
19
19
  #include "rb-grn.h"
20
20
 
21
+ /*
22
+ * Document-class: Groonga::Query
23
+ *
24
+ * インデックスを用いた検索用のクエリのためのオブジェクト。
25
+ * Groonga::IndexColumn#searchに渡すことができる。(このクラ
26
+ * スは非推奨で、代わりにGroonga::Expressionを使用すること)
27
+ *
28
+ */
29
+
21
30
  #define SELF(object) (rb_rb_grn_query_from_ruby_object(object))
22
31
 
23
32
  typedef struct _RbGrnQuery RbGrnQuery;
@@ -119,6 +128,34 @@ rb_grn_operator_from_ruby_object (VALUE rb_operator)
119
128
  return operator;
120
129
  }
121
130
 
131
+ /*
132
+ * call-seq:
133
+ * query.new(string, options={})
134
+ *
135
+ * _string_をパースした上で、クエリを作成する。作成されたオ
136
+ * ブジェクトはGroonga::IndexColumn#searchに渡すことで使用す
137
+ * ることができる。
138
+ *
139
+ * _options_に指定可能な値は以下の通り。
140
+ *
141
+ * [+:context+]
142
+ * クエリが利用するGroonga::Context。省略すると
143
+ * Groonga::Context.defaultを用いる。
144
+ *
145
+ * [+:default_operator+]
146
+ * 演算子の既定値(演算子を省略した場合にどの演算を行うか)
147
+ * を指定する。
148
+ *
149
+ * [Groonga::Operation::OR]
150
+ * [Groonga::Operation::AND]
151
+ * [Groonga::Operation::BUT]
152
+ * [Groonga::Operation::ADJUST]
153
+ * (FIXME: 挙動の違いを検証する必要性あり?
154
+ * Groonga::Expressionとの関連性は?)
155
+ *
156
+ * [+:max_expressions+]
157
+ * 検索クエリに指定する式の最大値を指定する。
158
+ */
122
159
  static VALUE
123
160
  rb_grn_query_initialize (int argc, VALUE *argv, VALUE self)
124
161
  {
@@ -160,11 +197,18 @@ rb_grn_query_initialize (int argc, VALUE *argv, VALUE self)
160
197
  rb_grn_query->query = query;
161
198
  rb_grn_query->owner = RB_GRN_TRUE;
162
199
 
163
- rb_iv_set(self, "context", rb_context);
200
+ rb_iv_set(self, "@context", rb_context);
164
201
 
165
202
  return Qnil;
166
203
  }
167
204
 
205
+ /*
206
+ * call-seq:
207
+ * query.close
208
+ *
209
+ * _query_が使用しているリソースを開放する。これ以降_query_を
210
+ * 使うことはできない。
211
+ */
168
212
  static VALUE
169
213
  rb_grn_query_close (VALUE self)
170
214
  {
@@ -182,6 +226,13 @@ rb_grn_query_close (VALUE self)
182
226
  return Qnil;
183
227
  }
184
228
 
229
+ /*
230
+ * call-seq:
231
+ * query.closed? -> true/false
232
+ *
233
+ * _query_が開放済みの場合は+true+を返し、そうでない場合は
234
+ * +false+を返す。
235
+ */
185
236
  static VALUE
186
237
  rb_grn_query_closed_p (VALUE self)
187
238
  {
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -22,9 +22,15 @@ VALUE rb_cGrnRecord;
22
22
 
23
23
  VALUE
24
24
  rb_grn_record_new (VALUE table, grn_id id, VALUE values)
25
+ {
26
+ return rb_grn_record_new_raw(table, UINT2NUM(id), values);
27
+ }
28
+
29
+ VALUE
30
+ rb_grn_record_new_raw (VALUE table, VALUE rb_id, VALUE values)
25
31
  {
26
32
  return rb_funcall(rb_cGrnRecord, rb_intern("new"), 3,
27
- table, UINT2NUM(id), values);
33
+ table, rb_id, values);
28
34
  }
29
35
 
30
36
  void