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.
- data/NEWS.ja.rdoc +56 -0
- data/NEWS.rdoc +58 -0
- data/Rakefile +2 -3
- data/benchmark/read-write-many-small-items.rb +16 -32
- data/benchmark/write-many-small-items.rb +14 -28
- data/example/bookmark.rb +19 -17
- data/example/index-html.rb +11 -1
- data/example/search/config.ru +14 -9
- data/ext/rb-grn-array.c +6 -6
- data/ext/rb-grn-column.c +348 -18
- data/ext/rb-grn-context.c +8 -4
- data/ext/rb-grn-database.c +6 -7
- data/ext/rb-grn-exception.c +101 -5
- data/ext/rb-grn-expression.c +206 -23
- data/ext/rb-grn-fix-size-column.c +6 -39
- data/ext/rb-grn-hash.c +24 -24
- data/ext/rb-grn-index-column.c +74 -19
- data/ext/rb-grn-logger.c +48 -0
- data/ext/rb-grn-object.c +281 -67
- data/ext/rb-grn-operation.c +1 -1
- data/ext/rb-grn-patricia-trie-cursor.c +10 -1
- data/ext/rb-grn-patricia-trie.c +268 -7
- data/ext/rb-grn-query.c +52 -1
- data/ext/rb-grn-record.c +8 -2
- data/ext/rb-grn-snippet.c +63 -1
- data/ext/rb-grn-table-cursor-key-support.c +15 -1
- data/ext/rb-grn-table-cursor.c +57 -0
- data/ext/rb-grn-table-key-support.c +382 -46
- data/ext/rb-grn-table.c +729 -192
- data/ext/rb-grn-type.c +63 -12
- data/ext/rb-grn-utils.c +156 -158
- data/ext/rb-grn-variable.c +18 -0
- data/ext/rb-grn.h +85 -21
- data/ext/rb-groonga.c +13 -3
- data/extconf.rb +19 -4
- data/html/developer.html +1 -1
- data/html/header.html.erb +1 -1
- data/html/index.html +4 -4
- data/lib/groonga.rb +10 -0
- data/lib/groonga/expression-builder.rb +81 -42
- data/lib/groonga/patricia-trie.rb +13 -0
- data/lib/groonga/record.rb +158 -13
- data/lib/groonga/schema.rb +339 -33
- data/pkg-config.rb +6 -1
- data/test-unit/lib/test/unit.rb +23 -42
- data/test-unit/lib/test/unit/assertionfailederror.rb +11 -0
- data/test-unit/lib/test/unit/assertions.rb +87 -9
- data/test-unit/lib/test/unit/autorunner.rb +20 -11
- data/test-unit/lib/test/unit/collector.rb +1 -8
- data/test-unit/lib/test/unit/collector/load.rb +2 -3
- data/test-unit/lib/test/unit/color-scheme.rb +13 -1
- data/test-unit/lib/test/unit/diff.rb +223 -37
- data/test-unit/lib/test/unit/error.rb +4 -0
- data/test-unit/lib/test/unit/failure.rb +31 -5
- data/test-unit/lib/test/unit/notification.rb +8 -4
- data/test-unit/lib/test/unit/omission.rb +51 -3
- data/test-unit/lib/test/unit/pending.rb +4 -0
- data/test-unit/lib/test/unit/testcase.rb +55 -4
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +190 -4
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +14 -0
- data/test-unit/lib/test/unit/ui/testrunner.rb +8 -0
- data/test-unit/lib/test/unit/version.rb +1 -1
- data/test-unit/sample/{tc_adder.rb → test_adder.rb} +3 -1
- data/test-unit/sample/{tc_subtracter.rb → test_subtracter.rb} +3 -1
- data/test-unit/sample/test_user.rb +1 -0
- data/test-unit/test/collector/test-descendant.rb +2 -4
- data/test-unit/test/collector/test_objectspace.rb +7 -5
- data/test-unit/test/run-test.rb +2 -0
- data/test-unit/test/test-color-scheme.rb +7 -0
- data/test-unit/test/test-diff.rb +48 -7
- data/test-unit/test/test-omission.rb +1 -1
- data/test-unit/test/test-testcase.rb +47 -0
- data/test-unit/test/test_assertions.rb +79 -10
- data/test/groonga-test-utils.rb +6 -1
- data/test/test-array.rb +29 -14
- data/test/test-column.rb +107 -55
- data/test/test-context.rb +5 -0
- data/test/test-database.rb +2 -37
- data/test/test-exception.rb +9 -1
- data/test/test-expression-builder.rb +23 -5
- data/test/test-expression.rb +44 -8
- data/test/test-fix-size-column.rb +16 -5
- data/test/test-gqtp.rb +70 -0
- data/test/test-hash.rb +142 -43
- data/test/test-index-column.rb +9 -9
- data/test/test-patricia-trie.rb +79 -20
- data/test/test-procedure.rb +4 -2
- data/test/test-record.rb +32 -20
- data/test/test-remote.rb +3 -2
- data/test/test-schema.rb +226 -92
- data/test/test-table-cursor.rb +103 -1
- data/test/test-table-offset-and-limit.rb +102 -0
- data/test/test-table-select-normalize.rb +4 -4
- data/test/test-table-select.rb +52 -8
- data/test/test-table.rb +235 -116
- data/test/test-type.rb +2 -2
- data/test/test-variable-size-column.rb +21 -5
- data/test/test-vector-column.rb +76 -0
- data/{TUTORIAL.ja.rdoc → text/TUTORIAL.ja.rdoc} +52 -52
- data/text/expression.rdoc +284 -0
- metadata +11 -7
- data/test-unit/sample/ts_examples.rb +0 -7
data/ext/rb-grn-operation.c
CHANGED
|
@@ -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(
|
|
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(
|
|
38
|
+
rb_include_module(rb_cGrnPatriciaTrieCursor, rb_mGrnTableCursorKeySupport);
|
|
30
39
|
}
|
data/ext/rb-grn-patricia-trie.c
CHANGED
|
@@ -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
|
|
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 =
|
|
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 =
|
|
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
|
}
|
data/ext/rb-grn-query.c
CHANGED
|
@@ -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
|
{
|
data/ext/rb-grn-record.c
CHANGED
|
@@ -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,
|
|
33
|
+
table, rb_id, values);
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
void
|