rroonga 1.2.9 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/Gemfile +1 -0
  2. data/Rakefile +1 -0
  3. data/bin/grntest-log-analyze +123 -0
  4. data/bin/groonga-query-log-extract +117 -0
  5. data/ext/groonga/rb-grn-accessor.c +7 -5
  6. data/ext/groonga/rb-grn-array-cursor.c +1 -1
  7. data/ext/groonga/rb-grn-array.c +34 -44
  8. data/ext/groonga/rb-grn-column.c +74 -38
  9. data/ext/groonga/rb-grn-context.c +19 -15
  10. data/ext/groonga/rb-grn-database.c +47 -42
  11. data/ext/groonga/rb-grn-double-array-trie-cursor.c +40 -0
  12. data/ext/groonga/rb-grn-double-array-trie.c +530 -0
  13. data/ext/groonga/rb-grn-encoding-support.c +1 -1
  14. data/ext/groonga/rb-grn-encoding.c +1 -1
  15. data/ext/groonga/rb-grn-exception.c +1 -1
  16. data/ext/groonga/rb-grn-expression-builder.c +1 -1
  17. data/ext/groonga/rb-grn-expression.c +63 -51
  18. data/ext/groonga/rb-grn-fix-size-column.c +7 -7
  19. data/ext/groonga/rb-grn-hash-cursor.c +1 -1
  20. data/ext/groonga/rb-grn-hash.c +42 -39
  21. data/ext/groonga/rb-grn-index-column.c +35 -31
  22. data/ext/groonga/rb-grn-index-cursor.c +1 -1
  23. data/ext/groonga/rb-grn-logger.c +23 -18
  24. data/ext/groonga/rb-grn-object.c +40 -27
  25. data/ext/groonga/rb-grn-operator.c +1 -1
  26. data/ext/groonga/rb-grn-patricia-trie-cursor.c +1 -1
  27. data/ext/groonga/rb-grn-patricia-trie.c +122 -90
  28. data/ext/groonga/rb-grn-plugin.c +8 -7
  29. data/ext/groonga/rb-grn-posting.c +1 -1
  30. data/ext/groonga/rb-grn-procedure.c +1 -1
  31. data/ext/groonga/rb-grn-query.c +12 -12
  32. data/ext/groonga/rb-grn-record.c +1 -1
  33. data/ext/groonga/rb-grn-snippet.c +26 -19
  34. data/ext/groonga/rb-grn-table-cursor-key-support.c +1 -1
  35. data/ext/groonga/rb-grn-table-cursor.c +4 -3
  36. data/ext/groonga/rb-grn-table-key-support.c +23 -23
  37. data/ext/groonga/rb-grn-table.c +268 -153
  38. data/ext/groonga/rb-grn-type.c +11 -7
  39. data/ext/groonga/rb-grn-utils.c +4 -1
  40. data/ext/groonga/rb-grn-variable-size-column.c +1 -1
  41. data/ext/groonga/rb-grn-variable.c +2 -2
  42. data/ext/groonga/rb-grn-view-accessor.c +1 -1
  43. data/ext/groonga/rb-grn-view-cursor.c +1 -1
  44. data/ext/groonga/rb-grn-view-record.c +1 -1
  45. data/ext/groonga/rb-grn-view.c +43 -34
  46. data/ext/groonga/rb-grn.h +6 -2
  47. data/ext/groonga/rb-groonga.c +1 -1
  48. data/lib/groonga.rb +4 -2
  49. data/lib/groonga/context.rb +16 -41
  50. data/lib/groonga/dumper.rb +6 -4
  51. data/lib/groonga/expression-builder.rb +52 -26
  52. data/lib/groonga/grntest-log.rb +206 -0
  53. data/lib/groonga/pagination.rb +21 -19
  54. data/lib/groonga/patricia-trie.rb +7 -10
  55. data/lib/groonga/posting.rb +1 -1
  56. data/lib/groonga/query-log.rb +348 -0
  57. data/lib/groonga/record.rb +47 -143
  58. data/lib/groonga/schema.rb +679 -406
  59. data/lib/groonga/view-record.rb +4 -10
  60. data/rroonga-build.rb +1 -1
  61. data/test/test-array.rb +25 -4
  62. data/test/test-column.rb +8 -8
  63. data/test/test-database.rb +2 -3
  64. data/test/test-double-array-trie.rb +164 -0
  65. data/test/test-expression-builder.rb +2 -2
  66. data/test/test-expression.rb +10 -9
  67. data/test/test-gqtp.rb +2 -2
  68. data/test/test-hash.rb +32 -8
  69. data/test/test-patricia-trie.rb +34 -10
  70. data/test/test-query-log.rb +258 -0
  71. data/test/test-record.rb +6 -5
  72. data/test/test-schema-create-table.rb +8 -0
  73. data/test/test-schema.rb +491 -234
  74. data/test/test-table.rb +17 -24
  75. metadata +123 -100
  76. data/ext/groonga/Makefile +0 -233
@@ -1,4 +1,4 @@
1
- /* -*- c-file-style: "ruby" -*- */
1
+ /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
2
  /*
3
3
  Copyright (C) 2010-2011 Kouhei Sutou <kou@clear-code.com>
4
4
 
@@ -31,7 +31,7 @@ static VALUE cGrnContext;
31
31
  *
32
32
  * デフォルトで使用されるコンテキストは
33
33
  * Groonga::Context#defaultでアクセスできる。コンテキストを
34
- * 指定できる箇所でコンテキストの指定を省略したり+nil+を指定
34
+ * 指定できる箇所でコンテキストの指定を省略したり +nil+ を指定
35
35
  * した場合はGroonga::Context.defaultが利用される。
36
36
  *
37
37
  * また、デフォルトのコンテキストは必要になると暗黙のうちに
@@ -263,8 +263,8 @@ rb_grn_context_get_default (void)
263
263
  * call-seq:
264
264
  * Groonga::Context.default=(context)
265
265
  *
266
- * デフォルトのコンテキストを設定する。+nil+を指定すると、デ
267
- * フォルトのコンテキストをリセットする。リセットすると、次
266
+ * デフォルトのコンテキストを設定する。 +nil+ を指定すると、
267
+ * デフォルトのコンテキストをリセットする。リセットすると、次
268
268
  * 回Groonga::Context.defaultを呼び出したときに新しくコンテ
269
269
  * キストが作成される。
270
270
  */
@@ -307,10 +307,12 @@ rb_grn_context_s_set_default_options (VALUE self, VALUE options)
307
307
  * call-seq:
308
308
  * Groonga::Context.new(options=nil)
309
309
  *
310
- * コンテキストを作成する。_options_に指定可能な値は以下の通
310
+ * コンテキストを作成する。 _options_ に指定可能な値は以下の通
311
311
  * り。
312
+ * @param [::Hash] options The name and value
313
+ * pairs. Omitted names are initialized as the default value.
314
+ * @option options :encoding The encoding
312
315
  *
313
- * [+:encoding+]
314
316
  * エンコーディングを指定する。エンコーディングの指定方法
315
317
  * はGroonga::Encodingを参照。
316
318
  */
@@ -510,8 +512,8 @@ rb_grn_context_set_match_escalation_threshold (VALUE self, VALUE threshold)
510
512
  * call-seq:
511
513
  * context.support_zlib?
512
514
  *
513
- * groongaがZlibサポート付きでビルドされていれば+true+、そう
514
- * でなければ+false+を返す。
515
+ * groongaがZlibサポート付きでビルドされていれば +true+ 、そう
516
+ * でなければ +false+ を返す。
515
517
  */
516
518
  static VALUE
517
519
  rb_grn_context_support_zlib_p (VALUE self)
@@ -533,8 +535,8 @@ rb_grn_context_support_zlib_p (VALUE self)
533
535
  * call-seq:
534
536
  * context.support_lzo?
535
537
  *
536
- * groongaがLZOサポート付きでビルドされていれば+true+、そう
537
- * でなければ+false+を返す。
538
+ * groongaがLZOサポート付きでビルドされていれば +true+ 、そう
539
+ * でなければ +false+ を返す。
538
540
  */
539
541
  static VALUE
540
542
  rb_grn_context_support_lzo_p (VALUE self)
@@ -571,14 +573,16 @@ rb_grn_context_get_database (VALUE self)
571
573
  * call-seq:
572
574
  * context.connect(options=nil)
573
575
  *
574
- * groongaサーバに接続する。_options_に指定可能な値は以下の通
576
+ * groongaサーバに接続する。 _options_ に指定可能な値は以下の通
575
577
  * り。
578
+ * @param [::Hash] options The name and value
579
+ * pairs. Omitted names are initialized as the default value.
580
+ * @option options :host (localhost) The groonga server host name
576
581
  *
577
- * [+:host+]
578
582
  * groongaサーバのホスト名。またはIPアドレス。省略すると
579
583
  * "localhost"に接続する。
584
+ * @option options :port (10041) The port number
580
585
  *
581
- * [+:port+]
582
586
  * groongaサーバのポート番号。省略すると10041番ポートに接
583
587
  * 続する。
584
588
  */
@@ -749,10 +753,10 @@ rb_grn_context_get_backward_compatibility (grn_ctx *context,
749
753
  *
750
754
  * コンテキスト管理下にあるオブジェクトを返す。
751
755
  *
752
- * _name_として文字列を指定した場合はオブジェクト名でオブジェ
756
+ * _name_ として文字列を指定した場合はオブジェクト名でオブジェ
753
757
  * クトを検索する。
754
758
  *
755
- * _id_として数値を指定した場合はオブジェクトIDでオブジェク
759
+ * _id_ として数値を指定した場合はオブジェクトIDでオブジェク
756
760
  * トを検索する。
757
761
  */
758
762
  static VALUE
@@ -1,4 +1,4 @@
1
- /* -*- c-file-style: "ruby" -*- */
1
+ /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
2
  /*
3
3
  Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
4
4
 
@@ -125,7 +125,7 @@ rb_grn_database_deconstruct (RbGrnObject *rb_grn_database,
125
125
  * call-seq:
126
126
  * database.close
127
127
  *
128
- * _database_が使用しているリソースを開放する。これ以降_database_を
128
+ * _database_ が使用しているリソースを開放する。これ以降 _database_
129
129
  * 使うことはできない。
130
130
  */
131
131
  static VALUE
@@ -146,23 +146,24 @@ rb_grn_database_close (VALUE self)
146
146
  *
147
147
  * 新しくデータベースを作成する。
148
148
  *
149
- * _options_にはハッシュでオプションを指定する。指定できるオ
149
+ * _options_ にはハッシュでオプションを指定する。指定できるオ
150
150
  * プションは以下の通り。
151
+ * @param option [::Hash] options The name and value
152
+ * pairs. Omitted names are initialized as the default value.
153
+ * @option options :path The path
151
154
  *
152
- * [+:path+]
153
155
  * データベースを保存するパス。省略すると一時データベース
154
156
  * となる。
157
+ * @option options :context (Groonga::Context.default) The context
155
158
  *
156
- * [+:context+]
157
159
  * データベースを結びつけるコンテキスト。省略すると
158
160
  * Groonga::Context.defaultを利用する。
159
161
  *
160
- * 使用例は以下の通り。
161
- *
162
- * 一時データベースを作成:
162
+ * @example
163
+ * 一時データベースを作成:
163
164
  * Groonga::Database.create
164
165
  *
165
- * 永続データベースを作成:
166
+ * 永続データベースを作成:
166
167
  * Groonga::Database.create(:path => "/tmp/db.groonga")
167
168
  */
168
169
  static VALUE
@@ -219,10 +220,12 @@ rb_grn_database_s_create (int argc, VALUE *argv, VALUE klass)
219
220
  * クに開いたデータベースを渡し、ブロックを抜けるときに閉じ
220
221
  * る。
221
222
  *
222
- * _options_にはハッシュでオプションを指定する。指定できるオ
223
+ * _options_ にはハッシュでオプションを指定する。指定できるオ
223
224
  * プションは以下の通り。
225
+ * @param options [::Hash] The name and value
226
+ * pairs. Omitted names are initialized as the default value.
227
+ * @option options :context (Groonga::Context.default) The context
224
228
  *
225
- * [+:context+]
226
229
  * データベースを結びつけるコンテキスト。省略すると
227
230
  * Groonga::Context.defaultを利用する。
228
231
  */
@@ -266,12 +269,13 @@ rb_grn_database_initialize (int argc, VALUE *argv, VALUE self)
266
269
  * クに開いたデータベースを渡し、ブロックを抜けるときに閉じ
267
270
  * る。
268
271
  *
269
- * _options_にはハッシュでオプションを指定する。指定できるオ
272
+ * _options_ にはハッシュでオプションを指定する。指定できるオ
270
273
  * プションは以下の通り。
274
+ * @param options [::Hash] The name and value
275
+ * pairs. Omitted names are initialized as the default value.
276
+ * @option options :context (Groonga::Context.default) The context
271
277
  *
272
- * [+:context+]
273
- * データベースを結びつけるコンテキスト。省略すると
274
- * Groonga::Context.defaultを利用する。
278
+ * データベースを結びつけるコンテキスト。
275
279
  */
276
280
  static VALUE
277
281
  rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
@@ -293,36 +297,35 @@ rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
293
297
  *
294
298
  * データベース内のオブジェクトを順番にブロックに渡す。
295
299
  *
296
- * _options_にはハッシュでオプションを指定する。指定できるオ
297
- * プションは以下の通り。
298
- *
299
- * [+:order+]
300
- * +:asc+または+:ascending+を指定すると昇順にレコードを取
301
- * り出す。(デフォルト)
302
- *
303
- * +:desc+または+:descending+を指定すると降順にレコードを
304
- * 取り出す。
305
- *
306
- * [+:order_by+]
307
- * +:id+を指定するとID順にレコードを取り出す。
308
- *
309
- * +:key+指定するとキー順にレコードを取り出す。(デフォル
310
- * ト)
311
- *
312
- * すべてのオブジェクトの名前を表示する:
300
+ * @example すべてのオブジェクトの名前を表示する:
313
301
  * database.each do |object|
314
302
  * p object.name
315
303
  * end
316
304
  *
317
- * すべてのオブジェクトの名前をID順で表示する:
305
+ * @example すべてのオブジェクトの名前をID順で表示する:
318
306
  * database.each(:order_by => :id) do |object|
319
307
  * p object.name
320
308
  * end
321
309
  *
322
- * すべてのオブジェクトの名前をキー名の降順で表示する:
310
+ * @example すべてのオブジェクトの名前をキー名の降順で表示する:
323
311
  * database.each(:order_by => :key, :order => :desc) do |object|
324
312
  * p object.name
325
313
  * end
314
+ *
315
+ * @param options [::Hash]
316
+ * @option options :order The order
317
+ * +:asc+ または +:ascending+ を指定すると昇順にレコードを取
318
+ * り出す。(デフォルト)
319
+ *
320
+ * +:desc+ または +:descending+ を指定すると降順にレコードを
321
+ * 取り出す。
322
+ *
323
+ * @option options :order_by (:key) The ordef by
324
+ * +:id+ を指定するとID順にレコードを取り出す。
325
+ *
326
+ * +:key+ 指定するとキー順にレコードを取り出す。(デフォル
327
+ * ト)
328
+ *
326
329
  */
327
330
  static VALUE
328
331
  rb_grn_database_each (int argc, VALUE *argv, VALUE self)
@@ -373,7 +376,7 @@ rb_grn_database_each (int argc, VALUE *argv, VALUE self)
373
376
  * call-seq:
374
377
  * database.unlock
375
378
  *
376
- * _database_のロックを解除する。
379
+ * _database_ のロックを解除する。
377
380
  */
378
381
  static VALUE
379
382
  rb_grn_database_unlock (VALUE self)
@@ -399,16 +402,18 @@ rb_grn_database_unlock (VALUE self)
399
402
  * database.lock(options={})
400
403
  * database.lock(options={}) {...}
401
404
  *
402
- * _database_をロックする。ロックに失敗した場合は
405
+ * _database_ をロックする。ロックに失敗した場合は
403
406
  * Groonga::ResourceDeadlockAvoided例外が発生する。
404
407
  *
405
408
  * ブロックを指定した場合はブロックを抜けたときにunlockする。
406
409
  *
407
410
  * 利用可能なオプションは以下の通り。
411
+ * @param [::Hash] options The name and value
412
+ * pairs. Omitted names are initialized as the default value
413
+ * @option options :timeout The timeout
408
414
  *
409
- * [_:timeout_]
410
- * ロックを獲得できなかった場合は_:timeout_秒間ロックの獲
411
- * 得を試みる。_:timeout_秒以内にロックを獲得できなかった
415
+ * ロックを獲得できなかった場合は _:timeout_ 秒間ロックの獲
416
+ * 得を試みる。 _:timeout_ 秒以内にロックを獲得できなかった
412
417
  * 場合は例外が発生する。
413
418
  */
414
419
  static VALUE
@@ -449,7 +454,7 @@ rb_grn_database_lock (int argc, VALUE *argv, VALUE self)
449
454
  * call-seq:
450
455
  * database.clear_lock
451
456
  *
452
- * _database_のロックを強制的に解除する。
457
+ * _database_ のロックを強制的に解除する。
453
458
  */
454
459
  static VALUE
455
460
  rb_grn_database_clear_lock (VALUE self)
@@ -471,7 +476,7 @@ rb_grn_database_clear_lock (VALUE self)
471
476
  * call-seq:
472
477
  * database.locked?
473
478
  *
474
- * _database_がロックされていれば+true+を返す。
479
+ * _database_ がロックされていれば +true+ を返す。
475
480
  */
476
481
  static VALUE
477
482
  rb_grn_database_is_locked (VALUE self)
@@ -491,7 +496,7 @@ rb_grn_database_is_locked (VALUE self)
491
496
  * call-seq:
492
497
  * database.touch
493
498
  *
494
- * _database_の最終更新時刻を現在時刻にする。
499
+ * _database_ の最終更新時刻を現在時刻にする。
495
500
  */
496
501
  static VALUE
497
502
  rb_grn_database_touch (VALUE self)
@@ -0,0 +1,40 @@
1
+ /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
+ /*
3
+ Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Lesser General Public
7
+ License version 2.1 as published by the Free Software Foundation.
8
+
9
+ This library is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ Lesser General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Lesser General Public
15
+ License along with this library; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+ */
18
+
19
+ #include "rb-grn.h"
20
+
21
+ VALUE rb_cGrnDoubleArrayTrieCursor;
22
+
23
+ /*
24
+ * Document-class: Groonga::DoubleArrayCursor < Groonga::TableCursor
25
+ *
26
+ * Groonga::DoubleArrayに登録されているレコードを順番に取り
27
+ * 出すためのオブジェクト。利用できるメソッドは
28
+ * Groonga::TableCursorとGroonga::TableCursor::KeySupportを
29
+ * 参照。
30
+ */
31
+
32
+ void
33
+ rb_grn_init_double_array_trie_cursor (VALUE mGrn)
34
+ {
35
+ rb_cGrnDoubleArrayTrieCursor =
36
+ rb_define_class_under(mGrn, "DoubleArrayTrieCursor", rb_cGrnTableCursor);
37
+
38
+ rb_include_module(rb_cGrnDoubleArrayTrieCursor,
39
+ rb_mGrnTableCursorKeySupport);
40
+ }
@@ -0,0 +1,530 @@
1
+ /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
+ /* vim: set sts=4 sw=4 ts=8 noet: */
3
+ /*
4
+ Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
5
+
6
+ This library is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU Lesser General Public
8
+ License version 2.1 as published by the Free Software Foundation.
9
+
10
+ This library is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ Lesser General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Lesser General Public
16
+ License along with this library; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
+ */
19
+
20
+ #include "rb-grn.h"
21
+
22
+ #define SELF(object) ((RbGrnTableKeySupport *)DATA_PTR(object))
23
+
24
+ VALUE rb_cGrnDoubleArrayTrie;
25
+
26
+ /*
27
+ * Document-class: Groonga::DoubleArrayTrie < Groonga::Table
28
+ *
29
+ * It's a table that manages records by double array
30
+ * trie. It can change key without ID change. This feature
31
+ * is supported by only Groonga::DoubleArrayTrie. But it
32
+ * requires large spaces rather than other tables. It is
33
+ * used by Groonga::Database for key management
34
+ * internally. It's reasonable choice because number of
35
+ * tables and columns in Groonga::Database (number of their
36
+ * names equals to number of keys to be managed by
37
+ * Groonga::DoubleArrayTrie) will be less than number of
38
+ * records of user defined tables.
39
+ *
40
+ * Groonga::DoubleArrayTrie supports exact match search,
41
+ * predictive search and common prefix search like
42
+ * Groonga::PatriciaTrie. It also supports cursor API.
43
+ */
44
+
45
+ /*
46
+ * call-seq:
47
+ * Groonga::DoubleArrayTrie.create(options={}) -> Groonga::DoubleArrayTrie
48
+ * Groonga::DoubleArrayTrie.create(options={}) {|table| ... }
49
+ *
50
+ * It creates a table that manages records by double array trie.
51
+ * ブロックを指定すると、そのブロックに生成したテーブルが渡さ
52
+ * れ、ブロックを抜けると自動的にテーブルが破棄される。
53
+ *
54
+ * _options_ に指定可能な値は以下の通り。
55
+ * @param options [::Hash] The name and value
56
+ * pairs. Omitted names are initialized as the default value.
57
+ * @option options [Groonga::Context] :context (Groonga::Context.default)
58
+ *
59
+ * テーブルが利用するGroonga::Context。
60
+ *
61
+ * @option options :name The table name
62
+ *
63
+ * テーブルの名前。名前をつけると、Groonga::Context#[]に名
64
+ * 前を指定してテーブルを取得することができる。省略すると
65
+ * 無名テーブルになり、テーブルIDでのみ取得できる。
66
+ *
67
+ * @option options :path The path
68
+ *
69
+ * テーブルを保存するパス。パスを指定すると永続テーブルとな
70
+ * り、プロセス終了後もレコードは保持される。次回起動時に
71
+ * Groonga::Context#[]で保存されたレコードを利用する
72
+ * ことができる。省略すると一時テーブルになり、プロセスが終
73
+ * 了するとレコードは破棄される。
74
+ *
75
+ * @option options :persistent The persistent
76
+ *
77
+ * +true+ を指定すると永続テーブルとなる。 +path+ を省略した
78
+ * 場合は自動的にパスが付加される。 +:context+ で指定した
79
+ * Groonga::Contextに結びついているデータベースが一時デー
80
+ * タベースの場合は例外が発生する。
81
+ *
82
+ * @option options :key_normalize The key_normalize
83
+ *
84
+ * +true+ を指定するとキーを正規化する。
85
+ *
86
+ * @option options :key_with_sis The key_with_sis
87
+ *
88
+ * +true+ を指定するとキーの文字列の全suffixが自動的に登
89
+ * 録される。
90
+ *
91
+ * @option options :key_type The key_type
92
+ *
93
+ * キーの種類を示すオブジェクトを指定する。キーの種類には型
94
+ * 名("Int32"や"ShortText"など)またはGroonga::Typeまたは
95
+ * テーブル(Groonga::Array、Groonga::Hash、
96
+ * Groonga::DoubleArrayTrieのどれか)を指定する。
97
+ *
98
+ * Groonga::Typeを指定した場合は、その型が示す範囲の値をキー
99
+ * として使用する。ただし、キーの最大サイズは4096バイトで
100
+ * あるため、Groonga::Type::TEXTやGroonga::Type::LONG_TEXT
101
+ * は使用できない。
102
+ *
103
+ * テーブルを指定した場合はレコードIDをキーとして使用する。
104
+ * 指定したテーブルのGroonga::Recordをキーとして使用するこ
105
+ * ともでき、その場合は自動的にGroonga::Recordからレコード
106
+ * IDを取得する。
107
+ *
108
+ * 省略した場合はShortText型をキーとして使用する。この場合、
109
+ * 4096バイトまで使用可能である。
110
+ *
111
+ * @option options :value_type The value_type
112
+ *
113
+ * 値の型を指定する。省略すると値のための領域を確保しない。
114
+ * 値を保存したい場合は必ず指定すること。
115
+ *
116
+ * 参考: Groonga::Type.new
117
+ *
118
+ * @option options :default_tokenizer The default_tokenizer
119
+ *
120
+ * Groonga::IndexColumnで使用するトークナイザを指定する。
121
+ * デフォルトでは何も設定されていないので、テーブルに
122
+ * Groonga::IndexColumnを定義する場合は
123
+ * <tt>"TokenBigram"</tt>などを指定する必要がある。
124
+ *
125
+ * @option options :sub_records The sub_records
126
+ *
127
+ * +true+ を指定すると#groupでグループ化したときに、
128
+ * Groonga::Record#n_sub_recordsでグループに含まれるレコー
129
+ * ドの件数を取得できる。
130
+ *
131
+ * @example
132
+ * #無名一時テーブルを生成する。
133
+ * Groonga::DoubleArrayTrie.create
134
+ *
135
+ * #無名永続テーブルを生成する。
136
+ * Groonga::DoubleArrayTrie.create(:path => "/tmp/hash.grn")
137
+ *
138
+ * #名前付き永続テーブルを生成する。ただし、ファイル名は気に
139
+ * #しない。
140
+ * Groonga::DoubleArrayTrie.create(:name => "Bookmarks",
141
+ * :persistent => true)
142
+ *
143
+ * #それぞれのレコードに512バイトの値を格納できる無名一時テー
144
+ * #ブルを生成する。
145
+ * Groonga::DoubleArrayTrie.create(:value => 512)
146
+ *
147
+ * #キーとして文字列を使用する無名一時テーブルを生成する。
148
+ * Groonga::DoubleArrayTrie.create(:key_type => Groonga::Type::SHORT_TEXT)
149
+ *
150
+ * #キーとして文字列を使用する無名一時テーブルを生成する。
151
+ * #(キーの種類を表すオブジェクトは文字列で指定。)
152
+ * Groonga::DoubleArrayTrie.create(:key_type => "ShortText")
153
+ *
154
+ * #キーとして<tt>Bookmarks</tt>テーブルのレコードを使用す
155
+ * #る無名一時テーブルを生成する。
156
+ * bookmarks = Groonga::DoubleArrayTrie.create(:name => "Bookmarks")
157
+ * Groonga::DoubleArrayTrie.create(:key_type => bookmarks)
158
+ *
159
+ * #キーとして<tt>Bookmarks</tt>テーブルのレコードを使用す
160
+ * #る無名一時テーブルを生成する。
161
+ * #(テーブルは文字列で指定。)
162
+ * Groonga::DoubleArrayTrie.create(:name => "Bookmarks")
163
+ * Groonga::DoubleArrayTrie.create(:key_type => "Bookmarks")
164
+ *
165
+ * #全文検索用のトークンをバイグラムで切り出す無名一時テーブ
166
+ * #ルを生成する。
167
+ * bookmarks = Groonga::DoubleArrayTrie.create(:name => "Bookmarks")
168
+ * bookmarks.define_column("comment", "Text")
169
+ * terms = Groonga::DoubleArrayTrie.create(:name => "Terms",
170
+ * :default_tokenizer => "TokenBigram")
171
+ * terms.define_index_column("content", bookmarks,
172
+ * :source => "Bookmarks.comment")
173
+ */
174
+ static VALUE
175
+ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
176
+ {
177
+ grn_ctx *context;
178
+ grn_obj *key_type = NULL, *value_type = NULL, *table;
179
+ const char *name = NULL, *path = NULL;
180
+ unsigned name_size = 0;
181
+ grn_obj_flags flags = GRN_OBJ_TABLE_DAT_KEY;
182
+ VALUE rb_table;
183
+ VALUE options, rb_context, rb_name, rb_path, rb_persistent;
184
+ VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
185
+ VALUE rb_value_type;
186
+ VALUE rb_default_tokenizer, rb_sub_records;
187
+
188
+ rb_scan_args(argc, argv, "01", &options);
189
+
190
+ rb_grn_scan_options(options,
191
+ "context", &rb_context,
192
+ "name", &rb_name,
193
+ "path", &rb_path,
194
+ "persistent", &rb_persistent,
195
+ "key_normalize", &rb_key_normalize,
196
+ "key_with_sis", &rb_key_with_sis,
197
+ "key_type", &rb_key_type,
198
+ "value_type", &rb_value_type,
199
+ "default_tokenizer", &rb_default_tokenizer,
200
+ "sub_records", &rb_sub_records,
201
+ NULL);
202
+
203
+ context = rb_grn_context_ensure(&rb_context);
204
+
205
+ if (!NIL_P(rb_name)) {
206
+ name = StringValuePtr(rb_name);
207
+ name_size = RSTRING_LEN(rb_name);
208
+ flags |= GRN_OBJ_PERSISTENT;
209
+ }
210
+
211
+ if (!NIL_P(rb_path)) {
212
+ path = StringValueCStr(rb_path);
213
+ flags |= GRN_OBJ_PERSISTENT;
214
+ }
215
+
216
+ if (RVAL2CBOOL(rb_persistent))
217
+ flags |= GRN_OBJ_PERSISTENT;
218
+
219
+ if (RVAL2CBOOL(rb_key_normalize))
220
+ flags |= GRN_OBJ_KEY_NORMALIZE;
221
+
222
+ if (RVAL2CBOOL(rb_key_with_sis))
223
+ flags |= GRN_OBJ_KEY_WITH_SIS;
224
+
225
+ if (NIL_P(rb_key_type)) {
226
+ key_type = grn_ctx_at(context, GRN_DB_SHORT_TEXT);
227
+ } else {
228
+ key_type = RVAL2GRNOBJECT(rb_key_type, &context);
229
+ }
230
+
231
+ if (!NIL_P(rb_value_type))
232
+ value_type = RVAL2GRNOBJECT(rb_value_type, &context);
233
+
234
+ if (RVAL2CBOOL(rb_sub_records))
235
+ flags |= GRN_OBJ_WITH_SUBREC;
236
+
237
+ table = grn_table_create(context, name, name_size, path,
238
+ flags, key_type, value_type);
239
+ if (!table)
240
+ rb_grn_context_check(context, rb_ary_new4(argc, argv));
241
+ rb_table = GRNOBJECT2RVAL(klass, context, table, GRN_TRUE);
242
+
243
+ if (!NIL_P(rb_default_tokenizer))
244
+ rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
245
+ rb_default_tokenizer);
246
+
247
+ if (rb_block_given_p())
248
+ return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table);
249
+ else
250
+ return rb_table;
251
+ }
252
+
253
+ /*
254
+ * call-seq:
255
+ * double_array_trie.search(key, options=nil) -> Groonga::Hash
256
+ *
257
+ * _key_ にマッチするレコードのIDがキーに入っている
258
+ * Groonga::Hashを返す。マッチするレコードがない場合は空の
259
+ * Groonga::Hashが返る。
260
+ *
261
+ * _options_ で +:result+ を指定することにより、そのテーブルにマッ
262
+ * チしたレコードIDがキーのレコードを追加することができる。
263
+ * +:result+ にテーブルを指定した場合は、そのテーブルが返る。
264
+ *
265
+ * _options_ に指定可能な値は以下の通り。
266
+ * @param options [::Hash] The name and value
267
+ * pairs. Omitted names are initialized as the default value.
268
+ * @option options :result The result
269
+ *
270
+ * 結果を格納するテーブル。
271
+ * @option options :operator (Groonga::Operator::OR)
272
+ *
273
+ * マッチしたレコードをどのように扱うか。指定可能な値は以
274
+ * 下の通り。
275
+ *
276
+ * [Groonga::Operator::OR]
277
+ * マッチしたレコードを追加。すでにレコードが追加され
278
+ * ている場合は何もしない。
279
+ * [Groonga::Operator::AND]
280
+ * マッチしたレコードのスコアを増加。マッチしなかった
281
+ * レコードを削除。
282
+ * [Groonga::Operator::BUT]
283
+ * マッチしたレコードを削除。
284
+ * [Groonga::Operator::ADJUST]
285
+ * マッチしたレコードのスコアを増加。
286
+ *
287
+ * [+:type+]
288
+ * ?????
289
+ *
290
+ * 複数のキーで検索し、結果を1つのテーブルに集める。
291
+ * result = nil
292
+ * keys = ["morita", "gunyara-kun", "yu"]
293
+ * keys.each do |key|
294
+ * result = users.search(key, :result => result)
295
+ * end
296
+ * result.each do |record|
297
+ * user = record.key
298
+ * p user.key # -> "morita"または"gunyara-kun"または"yu"
299
+ * end
300
+ */
301
+ static VALUE
302
+ rb_grn_double_array_trie_search (int argc, VALUE *argv, VALUE self)
303
+ {
304
+ grn_rc rc;
305
+ grn_ctx *context;
306
+ grn_obj *table;
307
+ grn_id domain_id;
308
+ grn_obj *key, *domain, *result;
309
+ grn_operator operator;
310
+ grn_search_optarg search_options;
311
+ grn_bool search_options_is_set = GRN_FALSE;
312
+ VALUE rb_key, options, rb_result, rb_operator, rb_type;
313
+
314
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
315
+ &key, &domain_id, &domain,
316
+ NULL, NULL, NULL,
317
+ NULL);
318
+
319
+ rb_scan_args(argc, argv, "11", &rb_key, &options);
320
+
321
+ RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);
322
+
323
+ rb_grn_scan_options(options,
324
+ "result", &rb_result,
325
+ "operator", &rb_operator,
326
+ "type", &rb_type,
327
+ NULL);
328
+
329
+ if (NIL_P(rb_result)) {
330
+ result = grn_table_create(context, NULL, 0, NULL,
331
+ GRN_OBJ_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC,
332
+ table, 0);
333
+ rb_grn_context_check(context, self);
334
+ rb_result = GRNOBJECT2RVAL(Qnil, context, result, GRN_TRUE);
335
+ } else {
336
+ result = RVAL2GRNOBJECT(rb_result, &context);
337
+ }
338
+
339
+ operator = RVAL2GRNOPERATOR(rb_operator);
340
+
341
+ rc = grn_obj_search(context, table, key,
342
+ result, operator,
343
+ search_options_is_set ? &search_options : NULL);
344
+ rb_grn_rc_check(rc, self);
345
+
346
+ return rb_result;
347
+ }
348
+
349
+ static grn_table_cursor *
350
+ rb_grn_double_array_trie_open_grn_prefix_cursor (int argc, VALUE *argv,
351
+ VALUE self, grn_ctx **context)
352
+ {
353
+ grn_obj *table;
354
+ grn_table_cursor *cursor;
355
+ void *prefix = NULL;
356
+ unsigned prefix_size = 0;
357
+ int offset = 0, limit = -1;
358
+ int flags = GRN_CURSOR_PREFIX;
359
+ VALUE options, rb_prefix, rb_key_bytes, rb_key_bits;
360
+ VALUE rb_order, rb_order_by;
361
+ VALUE rb_greater_than, rb_less_than, rb_offset, rb_limit;
362
+
363
+ rb_grn_table_deconstruct((RbGrnTable *)SELF(self), &table, context,
364
+ NULL, NULL,
365
+ NULL, NULL, NULL,
366
+ NULL);
367
+
368
+ rb_scan_args(argc, argv, "11", &rb_prefix, &options);
369
+
370
+ rb_grn_scan_options(options,
371
+ "key_bytes", &rb_key_bytes,
372
+ "key_bites", &rb_key_bits,
373
+ "offset", &rb_offset,
374
+ "limit", &rb_limit,
375
+ "order", &rb_order,
376
+ "order_by", &rb_order_by,
377
+ "greater_than", &rb_greater_than,
378
+ "less_than", &rb_less_than,
379
+ NULL);
380
+
381
+ prefix = StringValuePtr(rb_prefix);
382
+ if (!NIL_P(rb_key_bytes) && !NIL_P(rb_key_bits)) {
383
+ rb_raise(rb_eArgError,
384
+ "should not specify both :key_bytes and :key_bits once: %s",
385
+ rb_grn_inspect(rb_ary_new4(argc, argv)));
386
+ } else if (!NIL_P(rb_key_bytes)) {
387
+ prefix_size = NUM2UINT(rb_key_bytes);
388
+ } else if (!NIL_P(rb_key_bits)) {
389
+ prefix_size = NUM2UINT(rb_key_bits);
390
+ flags |= GRN_CURSOR_SIZE_BY_BIT;
391
+ } else {
392
+ prefix_size = RSTRING_LEN(rb_prefix);
393
+ }
394
+ if (!NIL_P(rb_offset))
395
+ offset = NUM2INT(rb_offset);
396
+ if (!NIL_P(rb_limit))
397
+ limit = NUM2INT(rb_limit);
398
+
399
+ if (NIL_P(rb_order)) {
400
+ } else if (rb_grn_equal_option(rb_order, "asc") ||
401
+ rb_grn_equal_option(rb_order, "ascending")) {
402
+ flags |= GRN_CURSOR_ASCENDING;
403
+ } else if (rb_grn_equal_option(rb_order, "desc") ||
404
+ rb_grn_equal_option(rb_order, "descending")) {
405
+ flags |= GRN_CURSOR_DESCENDING;
406
+ } else {
407
+ rb_raise(rb_eArgError,
408
+ "order should be one of "
409
+ "[:asc, :ascending, :desc, :descending]: %s",
410
+ rb_grn_inspect(rb_order));
411
+ }
412
+ if (NIL_P(rb_order_by)) {
413
+ } else if (rb_grn_equal_option(rb_order_by, "id")) {
414
+ flags |= GRN_CURSOR_BY_ID;
415
+ } else if (rb_grn_equal_option(rb_order_by, "key")) {
416
+ if (table->header.type != GRN_TABLE_PAT_KEY) {
417
+ rb_raise(rb_eArgError,
418
+ "order_by => :key is available "
419
+ "only for Groonga::DoubleArrayTrie: %s",
420
+ rb_grn_inspect(self));
421
+ }
422
+ flags |= GRN_CURSOR_BY_KEY;
423
+ } else {
424
+ rb_raise(rb_eArgError,
425
+ "order_by should be one of [:id%s]: %s",
426
+ table->header.type == GRN_TABLE_PAT_KEY ? ", :key" : "",
427
+ rb_grn_inspect(rb_order_by));
428
+ }
429
+
430
+ if (RVAL2CBOOL(rb_greater_than))
431
+ flags |= GRN_CURSOR_GT;
432
+ if (RVAL2CBOOL(rb_less_than))
433
+ flags |= GRN_CURSOR_LT;
434
+
435
+ cursor = grn_table_cursor_open(*context, table,
436
+ prefix, prefix_size,
437
+ NULL, 0,
438
+ offset, limit, flags);
439
+ rb_grn_context_check(*context, self);
440
+
441
+ return cursor;
442
+ }
443
+
444
+
445
+ /*
446
+ * call-seq:
447
+ * table.open_prefix_cursor(prefix, options={}) -> Groonga::DoubleArrayTrieCursor
448
+ * table.open_prefix_cursor(prefix, options={}) {|cursor| ... }
449
+ *
450
+ * _prefix_ に前方一致検索をするカーソルを生成して返す。ブロッ
451
+ * クを指定すると、そのブロックに生成したカーソルが渡され、ブ
452
+ * ロックを抜けると自動的にカーソルが破棄される。
453
+ *
454
+ * _options_ に指定可能な値は以下の通り。
455
+ * @param options [::Hash] The name and value
456
+ * pairs. Omitted names are initialized as the default value.
457
+ * @option options :key_bytes The key_bytes
458
+ *
459
+ * _prefix_ のサイズ(byte)
460
+ *
461
+ * @option options :key_bits The key_bits
462
+ *
463
+ * _prefix_ のサイズ(bit)
464
+ *
465
+ * @option options :offset The offset
466
+ *
467
+ * 該当する範囲のレコードのうち、(0ベースで) _:offset_ 番目
468
+ * からレコードを取り出す。
469
+ *
470
+ * @option options :limit The limit
471
+ *
472
+ * 該当する範囲のレコードのうち、 _:limit_ 件のみを取り出す。
473
+ * 省略された場合または-1が指定された場合は、全件が指定され
474
+ * たものとみなす。
475
+ *
476
+ * @option options :order The order
477
+ *
478
+ * +:asc+ または +:ascending+ を指定すると昇順にレコードを取
479
+ * り出す。
480
+ * +:desc+ または +:descending+ を指定すると降順にレコードを
481
+ * 取り出す。
482
+ *
483
+ * @option options :order_by (:id) The order_by
484
+ *
485
+ * +:id+ を指定するとID順にレコードを取り出す。(デフォルト)
486
+ * +:key+指定するとキー順にレコードを取り出す。
487
+ *
488
+ * @option options :greater_than The greater_than
489
+ *
490
+ * +true+ を指定すると _prefix_ で指定した値に一致した [ +key+ ] を
491
+ * 範囲に含まない。
492
+ *
493
+ * @option options :less_than The less_than
494
+ *
495
+ * +true+ を指定すると _prefix_ で指定した値に一致した [ +key+ ] を
496
+ * 範囲に含まない。
497
+ */
498
+ static VALUE
499
+ rb_grn_double_array_trie_open_prefix_cursor (int argc, VALUE *argv, VALUE self)
500
+ {
501
+ grn_ctx *context = NULL;
502
+ grn_table_cursor *cursor;
503
+ VALUE rb_cursor;
504
+
505
+ cursor = rb_grn_double_array_trie_open_grn_prefix_cursor(argc, argv,
506
+ self, &context);
507
+ rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
508
+ rb_iv_set(rb_cursor, "@table", self); /* FIXME: cursor should mark table */
509
+ if (rb_block_given_p())
510
+ return rb_ensure(rb_yield, rb_cursor, rb_grn_object_close, rb_cursor);
511
+ else
512
+ return rb_cursor;
513
+ }
514
+
515
+ void
516
+ rb_grn_init_double_array_trie (VALUE mGrn)
517
+ {
518
+ rb_cGrnDoubleArrayTrie =
519
+ rb_define_class_under(mGrn, "DoubleArrayTrie", rb_cGrnTable);
520
+
521
+ rb_include_module(rb_cGrnDoubleArrayTrie, rb_mGrnTableKeySupport);
522
+ rb_define_singleton_method(rb_cGrnDoubleArrayTrie, "create",
523
+ rb_grn_double_array_trie_s_create, -1);
524
+
525
+ rb_define_method(rb_cGrnDoubleArrayTrie, "search",
526
+ rb_grn_double_array_trie_search, -1);
527
+
528
+ rb_define_method(rb_cGrnDoubleArrayTrie, "open_prefix_cursor",
529
+ rb_grn_double_array_trie_open_prefix_cursor, -1);
530
+ }