groonga 0.0.7 → 0.9.0

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 (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