rroonga 2.0.8 → 2.1.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/README.textile +2 -2
- data/bin/groonga-index-dump +47 -0
- data/doc/text/news.textile +733 -0
- data/doc/text/tutorial.textile +535 -0
- data/example/bookmark.rb +1 -1
- data/ext/groonga/rb-grn-database.c +21 -24
- data/ext/groonga/rb-grn-double-array-trie.c +50 -58
- data/ext/groonga/rb-grn-exception.c +18 -1
- data/ext/groonga/rb-grn-hash.c +18 -3
- data/ext/groonga/rb-grn-index-column.c +50 -2
- data/ext/groonga/rb-grn-normalizer.c +83 -0
- data/ext/groonga/rb-grn-object.c +18 -14
- data/ext/groonga/rb-grn-patricia-trie.c +17 -2
- data/ext/groonga/rb-grn-query-logger.c +263 -0
- data/ext/groonga/rb-grn-snippet.c +6 -0
- data/ext/groonga/rb-grn-table-key-support.c +204 -13
- data/ext/groonga/rb-grn-table.c +124 -46
- data/ext/groonga/rb-grn.h +14 -3
- data/ext/groonga/rb-groonga.c +2 -0
- data/lib/groonga/database.rb +7 -0
- data/lib/groonga/dumper.rb +21 -2
- data/lib/groonga/index-column.rb +170 -0
- data/lib/groonga/query-logger.rb +129 -0
- data/lib/groonga/record.rb +32 -8
- data/lib/groonga/schema.rb +231 -288
- data/lib/groonga.rb +2 -1
- data/rroonga-build.rb +2 -2
- data/rroonga.gemspec +11 -7
- data/test/groonga-test-utils.rb +18 -6
- data/test/test-hash.rb +49 -20
- data/test/test-index-cursor.rb +4 -4
- data/{Gemfile → test/test-normalizer.rb} +9 -5
- data/test/test-pagination.rb +1 -1
- data/test/test-patricia-trie.rb +8 -0
- data/test/test-schema.rb +16 -13
- data/test/test-snippet.rb +5 -0
- data/test/test-table.rb +24 -12
- data/test/test-view.rb +0 -1
- metadata +154 -136
- data/AUTHORS +0 -5
- data/Rakefile +0 -203
- data/bin/groonga-query-log-extract +0 -117
@@ -112,8 +112,12 @@ VALUE rb_cGrnDoubleArrayTrie;
|
|
112
112
|
* 場合は自動的にパスが付加される。 +:context+ で指定した
|
113
113
|
* {Groonga::Context} に結びついているデータベースが一時デー
|
114
114
|
* タベースの場合は例外が発生する。
|
115
|
-
*
|
116
|
-
*
|
115
|
+
*
|
116
|
+
* @option options :key_normalize (false) Keys are normalized
|
117
|
+
* if this value is @true@.
|
118
|
+
*
|
119
|
+
* @deprecated Use @:normalizer => "NormalizerAuto"@ instead.
|
120
|
+
*
|
117
121
|
* @option options :key_with_sis
|
118
122
|
* +true+ を指定するとキーの文字列の全suffixが自動的に登
|
119
123
|
* 録される。
|
@@ -145,10 +149,17 @@ VALUE rb_cGrnDoubleArrayTrie;
|
|
145
149
|
* デフォルトでは何も設定されていないので、テーブルに
|
146
150
|
* {Groonga::IndexColumn} を定義する場合は
|
147
151
|
* @"TokenBigram"@ などを指定する必要がある。
|
152
|
+
*
|
148
153
|
* @option options :sub_records
|
149
154
|
* +true+ を指定すると {#group} でグループ化したときに、
|
150
155
|
* {Groonga::Record#n_sub_records} でグループに含まれるレコー
|
151
156
|
* ドの件数を取得できる。
|
157
|
+
*
|
158
|
+
* @option options [String, Groonga::Procedure, nil] :normalizer
|
159
|
+
* The normalizer that is used by {Groonga::IndexColumn}. You
|
160
|
+
* can specify this by normalizer name as String such as
|
161
|
+
* @"NormalizerAuto"@ or normalizer object.
|
162
|
+
*
|
152
163
|
* @!macro double-array-trie.create.options
|
153
164
|
* @overload create(options={})
|
154
165
|
* @yield [table]
|
@@ -167,6 +178,7 @@ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
|
|
167
178
|
VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
|
168
179
|
VALUE rb_value_type;
|
169
180
|
VALUE rb_default_tokenizer, rb_sub_records;
|
181
|
+
VALUE rb_normalizer;
|
170
182
|
|
171
183
|
rb_scan_args(argc, argv, "01", &options);
|
172
184
|
|
@@ -181,6 +193,7 @@ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
|
|
181
193
|
"value_type", &rb_value_type,
|
182
194
|
"default_tokenizer", &rb_default_tokenizer,
|
183
195
|
"sub_records", &rb_sub_records,
|
196
|
+
"normalizer", &rb_normalizer,
|
184
197
|
NULL);
|
185
198
|
|
186
199
|
context = rb_grn_context_ensure(&rb_context);
|
@@ -227,6 +240,10 @@ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
|
|
227
240
|
rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
|
228
241
|
rb_default_tokenizer);
|
229
242
|
|
243
|
+
if (!NIL_P(rb_normalizer))
|
244
|
+
rb_funcall(rb_table, rb_intern("normalizer="), 1,
|
245
|
+
rb_normalizer);
|
246
|
+
|
230
247
|
if (rb_block_given_p())
|
231
248
|
return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table);
|
232
249
|
else
|
@@ -427,64 +444,39 @@ rb_grn_double_array_trie_open_grn_prefix_cursor (int argc, VALUE *argv,
|
|
427
444
|
*
|
428
445
|
* @overload open_prefix_cursor(prefix, options={})
|
429
446
|
* @return [Groonga::DoubleArrayTrieCursor]
|
430
|
-
*
|
431
|
-
*
|
432
|
-
*
|
433
|
-
*
|
434
|
-
*
|
435
|
-
*
|
436
|
-
*
|
437
|
-
*
|
438
|
-
*
|
439
|
-
*
|
440
|
-
*
|
441
|
-
*
|
442
|
-
*
|
443
|
-
*
|
444
|
-
*
|
445
|
-
*
|
446
|
-
*
|
447
|
-
*
|
448
|
-
*
|
449
|
-
*
|
450
|
-
*
|
451
|
-
*
|
452
|
-
*
|
453
|
-
*
|
454
|
-
*
|
455
|
-
*
|
456
|
-
*
|
457
|
-
*
|
447
|
+
* @!macro [new] double_array_trie.open_prefix_cursor.arguments
|
448
|
+
* @param [String] prefix 前方一致させる値
|
449
|
+
* @param options [::Hash] The name and value
|
450
|
+
* pairs. Omitted names are initialized as the default value.
|
451
|
+
* @option options :key_bytes
|
452
|
+
* _prefix_ のサイズ(byte)
|
453
|
+
* @option options :key_bits
|
454
|
+
* _prefix_ のサイズ(bit)
|
455
|
+
* @option options :offset
|
456
|
+
* 該当する範囲のレコードのうち、(0ベースで) _:offset_ 番目
|
457
|
+
* からレコードを取り出す。
|
458
|
+
* @option options :limit
|
459
|
+
* 該当する範囲のレコードのうち、 _:limit_ 件のみを取り出す。
|
460
|
+
* 省略された場合または-1が指定された場合は、全件が指定され
|
461
|
+
* たものとみなす。
|
462
|
+
* @option options :order
|
463
|
+
* +:asc+ または +:ascending+ を指定すると昇順にレコードを取
|
464
|
+
* り出す。
|
465
|
+
* +:desc+ または +:descending+ を指定すると降順にレコードを
|
466
|
+
* 取り出す。
|
467
|
+
* @option options :order_by (:id)
|
468
|
+
* +:id+ を指定するとID順にレコードを取り出す。(デフォルト)
|
469
|
+
* +:key+指定するとキー順にレコードを取り出す。
|
470
|
+
* @option options :greater_than
|
471
|
+
* +true+ を指定すると _prefix_ で指定した値に一致した [ +key+ ] を
|
472
|
+
* 範囲に含まない。
|
473
|
+
* @option options :less_than
|
474
|
+
* +true+ を指定すると _prefix_ で指定した値に一致した [ +key+ ] を
|
475
|
+
* 範囲に含まない。
|
476
|
+
* @!macro double_array_trie.open_prefix_cursor.arguments
|
458
477
|
* @overload open_prefix_cursor(prefix, options={})
|
459
478
|
* @yield [cursor]
|
460
|
-
*
|
461
|
-
* @param options [::Hash] The name and value
|
462
|
-
* pairs. Omitted names are initialized as the default value.
|
463
|
-
* @option options :key_bytes
|
464
|
-
* _prefix_ のサイズ(byte)
|
465
|
-
* @option options :key_bits
|
466
|
-
* _prefix_ のサイズ(bit)
|
467
|
-
* @option options :offset
|
468
|
-
* 該当する範囲のレコードのうち、(0ベースで) _:offset_ 番目
|
469
|
-
* からレコードを取り出す。
|
470
|
-
* @option options :limit
|
471
|
-
* 該当する範囲のレコードのうち、 _:limit_ 件のみを取り出す。
|
472
|
-
* 省略された場合または-1が指定された場合は、全件が指定され
|
473
|
-
* たものとみなす。
|
474
|
-
* @option options :order
|
475
|
-
* +:asc+ または +:ascending+ を指定すると昇順にレコードを取
|
476
|
-
* り出す。
|
477
|
-
* +:desc+ または +:descending+ を指定すると降順にレコードを
|
478
|
-
* 取り出す。
|
479
|
-
* @option options :order_by (:id)
|
480
|
-
* +:id+ を指定するとID順にレコードを取り出す。(デフォルト)
|
481
|
-
* +:key+指定するとキー順にレコードを取り出す。
|
482
|
-
* @option options :greater_than
|
483
|
-
* +true+ を指定すると _prefix_ で指定した値に一致した [ +key+ ] を
|
484
|
-
* 範囲に含まない。
|
485
|
-
* @option options :less_than
|
486
|
-
* +true+ を指定すると _prefix_ で指定した値に一致した [ +key+ ] を
|
487
|
-
* 範囲に含まない。
|
479
|
+
* @!macro double_array_trie.open_prefix_cursor.arguments
|
488
480
|
*/
|
489
481
|
static VALUE
|
490
482
|
rb_grn_double_array_trie_open_prefix_cursor (int argc, VALUE *argv, VALUE self)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- coding: utf-8; c-file-style: "ruby" -*- */
|
2
2
|
/*
|
3
|
-
Copyright (C) 2009-
|
3
|
+
Copyright (C) 2009-2012 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
|
@@ -94,6 +94,7 @@ static VALUE eGrnTooLargeOffset;
|
|
94
94
|
static VALUE eGrnTooSmallLimit;
|
95
95
|
static VALUE eGrnCASError;
|
96
96
|
static VALUE eGrnUnsupportedCommandVersion;
|
97
|
+
static VALUE eGrnNormalizerError;
|
97
98
|
|
98
99
|
VALUE
|
99
100
|
rb_grn_rc_to_exception (grn_rc rc)
|
@@ -320,6 +321,9 @@ rb_grn_rc_to_exception (grn_rc rc)
|
|
320
321
|
case GRN_UNSUPPORTED_COMMAND_VERSION:
|
321
322
|
exception = eGrnUnsupportedCommandVersion;
|
322
323
|
break;
|
324
|
+
case GRN_NORMALIZER_ERROR:
|
325
|
+
exception = eGrnNormalizerError;
|
326
|
+
break;
|
323
327
|
}
|
324
328
|
|
325
329
|
if (NIL_P(exception))
|
@@ -553,6 +557,9 @@ rb_grn_rc_to_message (grn_rc rc)
|
|
553
557
|
case GRN_UNSUPPORTED_COMMAND_VERSION:
|
554
558
|
message = "unsupported command version";
|
555
559
|
break;
|
560
|
+
case GRN_NORMALIZER_ERROR:
|
561
|
+
message = "normalizer error";
|
562
|
+
break;
|
556
563
|
}
|
557
564
|
|
558
565
|
if (!message)
|
@@ -1192,4 +1199,14 @@ rb_grn_init_exception (VALUE mGrn)
|
|
1192
1199
|
*/
|
1193
1200
|
eGrnUnsupportedCommandVersion =
|
1194
1201
|
rb_define_class_under(mGrn, "UnsupportedCommandVersion", rb_eGrnError);
|
1202
|
+
|
1203
|
+
/*
|
1204
|
+
* Document-class: Groonga::NormalizerError
|
1205
|
+
*
|
1206
|
+
* It is used when a normalizer causes an error.
|
1207
|
+
*
|
1208
|
+
* @since 2.1.0
|
1209
|
+
*/
|
1210
|
+
eGrnNormalizerError =
|
1211
|
+
rb_define_class_under(mGrn, "NormalizerError", rb_eGrnError);
|
1195
1212
|
}
|
data/ext/groonga/rb-grn-hash.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- coding: utf-8; c-file-style: "ruby" -*- */
|
2
2
|
/*
|
3
|
-
Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
Copyright (C) 2009-2012 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
|
@@ -97,8 +97,12 @@ VALUE rb_cGrnHash;
|
|
97
97
|
* 場合は自動的にパスが付加される。 +:context+ で指定した
|
98
98
|
* {Groonga::Context} に結びついているデータベースが一時デー
|
99
99
|
* タベースの場合は例外が発生する。
|
100
|
-
*
|
101
|
-
*
|
100
|
+
*
|
101
|
+
* @option options :key_normalize (false) Keys are normalized
|
102
|
+
* if this value is @true@.
|
103
|
+
*
|
104
|
+
* @deprecated Use @:normalizer => "NormalizerAuto"@ instead.
|
105
|
+
*
|
102
106
|
* @option options :key_type
|
103
107
|
* キーの種類を示すオブジェクトを指定する。キーの種類には型
|
104
108
|
* 名("Int32"や"ShortText"など)または {Groonga::Type} または
|
@@ -131,6 +135,12 @@ VALUE rb_cGrnHash;
|
|
131
135
|
* +true+ を指定すると {#group} でグループ化したときに、
|
132
136
|
* {Groonga::Record#n_sub_records} でグループに含まれるレコー
|
133
137
|
* ドの件数を取得できる。
|
138
|
+
*
|
139
|
+
* @option options [String, Groonga::Procedure, nil] :normalizer
|
140
|
+
* The normalizer that is used by {Groonga::IndexColumn}. You
|
141
|
+
* can specify this by normalizer name as String such as
|
142
|
+
* @"NormalizerAuto"@ or normalizer object.
|
143
|
+
*
|
134
144
|
* @!macro hash.create.options
|
135
145
|
* @overload create(options={})
|
136
146
|
* @yield [table]
|
@@ -148,6 +158,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
|
|
148
158
|
VALUE options, rb_context, rb_name, rb_path, rb_persistent;
|
149
159
|
VALUE rb_key_normalize, rb_key_type, rb_value_type, rb_default_tokenizer;
|
150
160
|
VALUE rb_sub_records;
|
161
|
+
VALUE rb_normalizer;
|
151
162
|
|
152
163
|
rb_scan_args(argc, argv, "01", &options);
|
153
164
|
|
@@ -161,6 +172,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
|
|
161
172
|
"value_type", &rb_value_type,
|
162
173
|
"default_tokenizer", &rb_default_tokenizer,
|
163
174
|
"sub_records", &rb_sub_records,
|
175
|
+
"normalizer", &rb_normalizer,
|
164
176
|
NULL);
|
165
177
|
|
166
178
|
context = rb_grn_context_ensure(&rb_context);
|
@@ -203,6 +215,9 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
|
|
203
215
|
if (!NIL_P(rb_default_tokenizer))
|
204
216
|
rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
|
205
217
|
rb_default_tokenizer);
|
218
|
+
if (!NIL_P(rb_normalizer))
|
219
|
+
rb_funcall(rb_table, rb_intern("normalizer="), 1,
|
220
|
+
rb_normalizer);
|
206
221
|
|
207
222
|
if (rb_block_given_p())
|
208
223
|
return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table);
|
@@ -535,8 +535,27 @@ rb_grn_index_column_with_position_p (VALUE self)
|
|
535
535
|
return CBOOL2RVAL(column->header.flags & GRN_OBJ_WITH_POSITION);
|
536
536
|
}
|
537
537
|
|
538
|
+
/*
|
539
|
+
* Opens cursor to iterate posting in the index column.
|
540
|
+
*
|
541
|
+
* @example
|
542
|
+
* # TODO
|
543
|
+
*
|
544
|
+
* @overload open_cursor(table_cursor, options={})
|
545
|
+
* @param [TableCursor] The table cursor for table of the index column.
|
546
|
+
* @param [::Hash] options
|
547
|
+
* @option options [Boolean] :with_section (nil)
|
548
|
+
* Includes section info the posting. It is enabled by default if
|
549
|
+
* the index column is created with @:with_section@ flag.
|
550
|
+
* @option options [Boolean] :with_weight (nil)
|
551
|
+
* Includes weight info the posting. It is enabled by default if
|
552
|
+
* the index column is created with @:with_weight@ flag.
|
553
|
+
* @option options [Boolean] :with_position (nil)
|
554
|
+
* Includes position info the posting. It is enabled by default if
|
555
|
+
* the index column is created with @:with_position@ flag.
|
556
|
+
*/
|
538
557
|
static VALUE
|
539
|
-
rb_grn_index_column_open_cursor (VALUE
|
558
|
+
rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self)
|
540
559
|
{
|
541
560
|
grn_ctx *context;
|
542
561
|
grn_obj *column;
|
@@ -546,6 +565,9 @@ rb_grn_index_column_open_cursor (VALUE self, VALUE rb_table_cursor)
|
|
546
565
|
grn_id rid_max = GRN_ID_MAX;
|
547
566
|
int flags = 0;
|
548
567
|
grn_obj *index_cursor;
|
568
|
+
VALUE rb_table_cursor;
|
569
|
+
VALUE options;
|
570
|
+
VALUE rb_with_section, rb_with_weight, rb_with_position;
|
549
571
|
VALUE rb_table;
|
550
572
|
VALUE rb_lexicon;
|
551
573
|
VALUE rb_cursor;
|
@@ -555,10 +577,36 @@ rb_grn_index_column_open_cursor (VALUE self, VALUE rb_table_cursor)
|
|
555
577
|
NULL, NULL,
|
556
578
|
NULL, &range_object,
|
557
579
|
NULL, NULL);
|
580
|
+
|
581
|
+
rb_scan_args(argc, argv, "11", &rb_table_cursor, &options);
|
582
|
+
rb_grn_scan_options(options,
|
583
|
+
"with_section", &rb_with_section,
|
584
|
+
"with_weight", &rb_with_weight,
|
585
|
+
"with_position", &rb_with_position,
|
586
|
+
NULL);
|
587
|
+
|
558
588
|
table_cursor = RVAL2GRNTABLECURSOR(rb_table_cursor, NULL);
|
559
589
|
rb_table = GRNOBJECT2RVAL(Qnil, context, range_object, GRN_FALSE);
|
560
590
|
rb_lexicon = rb_iv_get(rb_table_cursor, "@table");
|
561
591
|
|
592
|
+
if (NIL_P(rb_with_section)) {
|
593
|
+
flags |= column->header.flags & GRN_OBJ_WITH_SECTION;
|
594
|
+
} else if (RVAL2CBOOL(rb_with_section)) {
|
595
|
+
flags |= GRN_OBJ_WITH_SECTION;
|
596
|
+
}
|
597
|
+
|
598
|
+
if (NIL_P(rb_with_weight)) {
|
599
|
+
flags |= column->header.flags & GRN_OBJ_WITH_WEIGHT;
|
600
|
+
} else if (RVAL2CBOOL(rb_with_weight)) {
|
601
|
+
flags |= GRN_OBJ_WITH_WEIGHT;
|
602
|
+
}
|
603
|
+
|
604
|
+
if (NIL_P(rb_with_position)) {
|
605
|
+
flags |= column->header.flags & GRN_OBJ_WITH_POSITION;
|
606
|
+
} else if (RVAL2CBOOL(rb_with_position)) {
|
607
|
+
flags |= GRN_OBJ_WITH_POSITION;
|
608
|
+
}
|
609
|
+
|
562
610
|
index_cursor = grn_index_cursor_open(context, table_cursor,
|
563
611
|
column, rid_min, rid_max, flags);
|
564
612
|
|
@@ -596,5 +644,5 @@ rb_grn_init_index_column (VALUE mGrn)
|
|
596
644
|
rb_define_method(rb_cGrnIndexColumn, "with_position?",
|
597
645
|
rb_grn_index_column_with_position_p, 0);
|
598
646
|
rb_define_method(rb_cGrnIndexColumn, "open_cursor",
|
599
|
-
rb_grn_index_column_open_cursor, 1);
|
647
|
+
rb_grn_index_column_open_cursor, -1);
|
600
648
|
}
|
@@ -0,0 +1,83 @@
|
|
1
|
+
/* -*- coding: utf-8; c-file-style: "ruby" -*- */
|
2
|
+
/*
|
3
|
+
Copyright (C) 2012 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
|
+
#define SELF(object, context) (RVAL2GRNNORMALIZER(object, context))
|
22
|
+
|
23
|
+
VALUE rb_cGrnNormalizer;
|
24
|
+
|
25
|
+
/*
|
26
|
+
* Document-class: Groonga::Normalizer < Groonga::Object
|
27
|
+
*
|
28
|
+
* It normalizes string.
|
29
|
+
*/
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Normalizes the @string@.
|
33
|
+
*
|
34
|
+
* @example
|
35
|
+
* # Normalizes "ABC" with the default normalizer
|
36
|
+
* Groonga::Normalizer.normalize("AbC") # => "abc"
|
37
|
+
*
|
38
|
+
* @overload normalize(string)
|
39
|
+
* @return [String] The normalized string
|
40
|
+
* @param [String] string The original string
|
41
|
+
*/
|
42
|
+
static VALUE
|
43
|
+
rb_grn_normalizer_s_normalize (VALUE klass, VALUE rb_string)
|
44
|
+
{
|
45
|
+
VALUE rb_context = Qnil;
|
46
|
+
VALUE rb_encoded_string;
|
47
|
+
VALUE rb_normalized_string;
|
48
|
+
grn_ctx *context = NULL;
|
49
|
+
grn_obj *grn_string;
|
50
|
+
grn_obj *normalizer = GRN_NORMALIZER_AUTO;
|
51
|
+
/* TODO: make customizable */
|
52
|
+
int flags = GRN_STRING_REMOVE_BLANK;
|
53
|
+
const char *normalized_string;
|
54
|
+
unsigned int normalized_string_length;
|
55
|
+
|
56
|
+
context = rb_grn_context_ensure(&rb_context);
|
57
|
+
rb_encoded_string = rb_grn_context_rb_string_encode(context, rb_string);
|
58
|
+
grn_string = grn_string_open(context,
|
59
|
+
RSTRING_PTR(rb_encoded_string),
|
60
|
+
RSTRING_LEN(rb_encoded_string),
|
61
|
+
normalizer,
|
62
|
+
flags);
|
63
|
+
rb_grn_context_check(context, rb_string);
|
64
|
+
grn_string_get_normalized(context, grn_string,
|
65
|
+
&normalized_string, &normalized_string_length,
|
66
|
+
NULL);
|
67
|
+
rb_normalized_string =
|
68
|
+
rb_grn_context_rb_string_new(context,
|
69
|
+
normalized_string,
|
70
|
+
normalized_string_length);
|
71
|
+
grn_obj_close(context, grn_string);
|
72
|
+
|
73
|
+
return rb_normalized_string;
|
74
|
+
}
|
75
|
+
|
76
|
+
void
|
77
|
+
rb_grn_init_normalizer (VALUE mGrn)
|
78
|
+
{
|
79
|
+
rb_cGrnNormalizer = rb_define_class_under(mGrn, "Normalizer", rb_cObject);
|
80
|
+
|
81
|
+
rb_define_singleton_method(rb_cGrnNormalizer, "normalize",
|
82
|
+
rb_grn_normalizer_s_normalize, 1);
|
83
|
+
}
|
data/ext/groonga/rb-grn-object.c
CHANGED
@@ -663,9 +663,9 @@ rb_grn_object_inspect_content_id_with_label (VALUE inspected,
|
|
663
663
|
return inspected;
|
664
664
|
}
|
665
665
|
|
666
|
-
|
667
|
-
|
668
|
-
|
666
|
+
VALUE
|
667
|
+
rb_grn_object_inspect_object_content_name (VALUE inspected,
|
668
|
+
grn_ctx *context, grn_obj *object)
|
669
669
|
{
|
670
670
|
int name_size;
|
671
671
|
|
@@ -694,7 +694,7 @@ rb_grn_object_inspect_content_name_with_label (VALUE inspected,
|
|
694
694
|
{
|
695
695
|
|
696
696
|
rb_str_cat2(inspected, "name: ");
|
697
|
-
|
697
|
+
rb_grn_object_inspect_object_content_name(inspected, context, object);
|
698
698
|
return inspected;
|
699
699
|
}
|
700
700
|
|
@@ -736,8 +736,9 @@ rb_grn_object_inspect_content_domain_with_label (VALUE inspected,
|
|
736
736
|
if (domain_object == object) {
|
737
737
|
rb_str_cat2(inspected, "(self)");
|
738
738
|
} else {
|
739
|
-
|
740
|
-
|
739
|
+
rb_grn_object_inspect_object_content_name(inspected,
|
740
|
+
context,
|
741
|
+
domain_object);
|
741
742
|
}
|
742
743
|
} else {
|
743
744
|
rb_str_cat2(inspected, "(");
|
@@ -776,8 +777,9 @@ rb_grn_object_inspect_content_range_with_label (VALUE inspected,
|
|
776
777
|
if (range_object == object) {
|
777
778
|
rb_str_cat2(inspected, "(self)");
|
778
779
|
} else {
|
779
|
-
|
780
|
-
|
780
|
+
rb_grn_object_inspect_object_content_name(inspected,
|
781
|
+
context,
|
782
|
+
range_object);
|
781
783
|
}
|
782
784
|
} else {
|
783
785
|
rb_str_cat2(inspected, "(");
|
@@ -876,16 +878,18 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
|
|
876
878
|
if (flags & GRN_OBJ_COMPRESS_LZO)
|
877
879
|
rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_LZO"));
|
878
880
|
break;
|
881
|
+
case GRN_COLUMN_INDEX:
|
882
|
+
if (flags & GRN_OBJ_WITH_SECTION)
|
883
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_SECTION"));
|
884
|
+
if (flags & GRN_OBJ_WITH_WEIGHT)
|
885
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_WEIGHT"));
|
886
|
+
if (flags & GRN_OBJ_WITH_POSITION)
|
887
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_POSITION"));
|
888
|
+
break;
|
879
889
|
default:
|
880
890
|
break;
|
881
891
|
}
|
882
892
|
|
883
|
-
if (flags & GRN_OBJ_WITH_SECTION)
|
884
|
-
rb_ary_push(inspected_flags, rb_str_new2("WITH_SECTION"));
|
885
|
-
if (flags & GRN_OBJ_WITH_WEIGHT)
|
886
|
-
rb_ary_push(inspected_flags, rb_str_new2("WITH_WEIGHT"));
|
887
|
-
if (flags & GRN_OBJ_WITH_POSITION)
|
888
|
-
rb_ary_push(inspected_flags, rb_str_new2("WITH_POSITION"));
|
889
893
|
if (flags & GRN_OBJ_RING_BUFFER)
|
890
894
|
rb_ary_push(inspected_flags, rb_str_new2("RING_BUFFER"));
|
891
895
|
|
@@ -104,8 +104,12 @@ VALUE rb_cGrnPatriciaTrie;
|
|
104
104
|
* 場合は自動的にパスが付加される。 +:context+ で指定した
|
105
105
|
* {Groonga::Context} に結びついているデータベースが一時デー
|
106
106
|
* タベースの場合は例外が発生する。
|
107
|
-
*
|
108
|
-
*
|
107
|
+
*
|
108
|
+
* @option options :key_normalize (false) Keys are normalized
|
109
|
+
* if this value is @true@.
|
110
|
+
*
|
111
|
+
* @deprecated Use @:normalizer => "NormalizerAuto"@ instead.
|
112
|
+
*
|
109
113
|
* @option options :key_with_sis
|
110
114
|
* +true+ を指定するとキーの文字列の全suffixが自動的に登
|
111
115
|
* 録される。
|
@@ -141,6 +145,12 @@ VALUE rb_cGrnPatriciaTrie;
|
|
141
145
|
* +true+ を指定すると {#group} でグループ化したときに、
|
142
146
|
* {Groonga::Record#n_sub_records} でグループに含まれるレコー
|
143
147
|
* ドの件数を取得できる。
|
148
|
+
*
|
149
|
+
* @option options [String, Groonga::Procedure, nil] :normalizer
|
150
|
+
* The normalizer that is used by {Groonga::IndexColumn}. You
|
151
|
+
* can specify this by normalizer name as String such as
|
152
|
+
* @"NormalizerAuto"@ or normalizer object.
|
153
|
+
*
|
144
154
|
* @!macro patricia_trie.create.options
|
145
155
|
* @overload create(options={})
|
146
156
|
* @yield [table]
|
@@ -159,6 +169,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
|
|
159
169
|
VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
|
160
170
|
VALUE rb_value_type;
|
161
171
|
VALUE rb_default_tokenizer, rb_sub_records;
|
172
|
+
VALUE rb_normalizer;
|
162
173
|
|
163
174
|
rb_scan_args(argc, argv, "01", &options);
|
164
175
|
|
@@ -173,6 +184,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
|
|
173
184
|
"value_type", &rb_value_type,
|
174
185
|
"default_tokenizer", &rb_default_tokenizer,
|
175
186
|
"sub_records", &rb_sub_records,
|
187
|
+
"normalizer", &rb_normalizer,
|
176
188
|
NULL);
|
177
189
|
|
178
190
|
context = rb_grn_context_ensure(&rb_context);
|
@@ -218,6 +230,9 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
|
|
218
230
|
if (!NIL_P(rb_default_tokenizer))
|
219
231
|
rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
|
220
232
|
rb_default_tokenizer);
|
233
|
+
if (!NIL_P(rb_normalizer))
|
234
|
+
rb_funcall(rb_table, rb_intern("normalizer="), 1,
|
235
|
+
rb_normalizer);
|
221
236
|
|
222
237
|
if (rb_block_given_p())
|
223
238
|
return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table);
|