rroonga 4.0.5 → 4.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/benchmark/common.rb +4 -4
  4. data/benchmark/create-wikipedia-database.rb +5 -5
  5. data/benchmark/read-write-many-small-items.rb +8 -8
  6. data/benchmark/repeat-load.rb +4 -4
  7. data/benchmark/select.rb +9 -9
  8. data/benchmark/write-many-small-items.rb +8 -8
  9. data/doc/images/sample-schema.png +0 -0
  10. data/doc/text/install.textile +2 -2
  11. data/doc/text/news.textile +41 -0
  12. data/doc/text/tutorial.textile +4 -4
  13. data/example/bookmark.rb +6 -7
  14. data/example/index-html.rb +6 -6
  15. data/ext/groonga/extconf.rb +23 -1
  16. data/ext/groonga/rb-grn-column.c +3 -2
  17. data/ext/groonga/rb-grn-context.c +20 -3
  18. data/ext/groonga/rb-grn-double-array-trie.c +11 -2
  19. data/ext/groonga/rb-grn-exception.c +28 -10
  20. data/ext/groonga/rb-grn-expression.c +78 -0
  21. data/ext/groonga/rb-grn-hash.c +10 -0
  22. data/ext/groonga/rb-grn-logger.c +7 -3
  23. data/ext/groonga/rb-grn-object.c +3 -2
  24. data/ext/groonga/rb-grn-patricia-trie.c +23 -20
  25. data/ext/groonga/rb-grn-table-key-support.c +92 -1
  26. data/ext/groonga/rb-grn-table.c +60 -17
  27. data/ext/groonga/rb-grn-utils.c +51 -2
  28. data/ext/groonga/rb-grn-variable-size-column.c +11 -7
  29. data/ext/groonga/rb-grn.h +11 -1
  30. data/lib/groonga/dumper.rb +23 -1
  31. data/lib/groonga/patricia-trie.rb +1 -1
  32. data/lib/groonga/schema.rb +190 -205
  33. data/misc/grnop2ruby.rb +1 -1
  34. data/rroonga-build.rb +3 -3
  35. data/rroonga.gemspec +1 -0
  36. data/test/groonga-test-utils.rb +2 -2
  37. data/test/test-column.rb +19 -0
  38. data/test/test-context.rb +5 -1
  39. data/test/test-double-array-trie.rb +19 -0
  40. data/test/test-exception.rb +7 -2
  41. data/test/test-expression.rb +19 -0
  42. data/test/test-fix-size-column.rb +49 -36
  43. data/test/test-hash.rb +22 -0
  44. data/test/test-patricia-trie.rb +26 -7
  45. data/test/test-schema-dumper.rb +65 -1
  46. data/test/test-schema.rb +13 -2
  47. data/test/test-variable-size-column.rb +6 -5
  48. metadata +47 -46
@@ -758,7 +758,7 @@ rb_grn_column_get_indexes (int argc, VALUE *argv, VALUE self)
758
758
  }
759
759
 
760
760
  /*
761
- * Renames the table to name.
761
+ * Renames the column to name.
762
762
  * @since 1.3.0
763
763
  * @overload rename(name)
764
764
  * @param name [String] the new name
@@ -782,7 +782,8 @@ rb_grn_column_rename (VALUE self, VALUE rb_name)
782
782
  rc = grn_column_rename(context, column, name, name_size);
783
783
  rb_grn_context_check(context, self);
784
784
  rb_grn_rc_check(rc, self);
785
-
785
+ rb_grn_named_object_set_name(RB_GRN_NAMED_OBJECT(DATA_PTR(self)),
786
+ name, name_size);
786
787
  return self;
787
788
  }
788
789
 
@@ -670,13 +670,28 @@ rb_grn_context_support_zlib_p (VALUE self)
670
670
  }
671
671
 
672
672
  /*
673
- * groongaがLZOサポート付きでビルドされていれば +true+ 、そう
674
- * でなければ +false+ を返す。
673
+ * If Groonga supports LZO compression, it returns +true+,
674
+ * otherwise it returns +false+.
675
+ *
676
+ * Groonga does not support LZO compression 4.0.7 or later.
677
+ * This method always returns +false+.
675
678
  *
676
679
  * @overload support_lzo?
677
680
  */
678
681
  static VALUE
679
682
  rb_grn_context_support_lzo_p (VALUE self)
683
+ {
684
+ return Qfalse;
685
+ }
686
+
687
+ /*
688
+ * If Groonga supports LZ4 compression, it returns +true+,
689
+ * otherwise it returns +false+.
690
+ *
691
+ * @overload support_lz4?
692
+ */
693
+ static VALUE
694
+ rb_grn_context_support_lz4_p (VALUE self)
680
695
  {
681
696
  VALUE rb_support_p;
682
697
  grn_ctx *context;
@@ -684,7 +699,7 @@ rb_grn_context_support_lzo_p (VALUE self)
684
699
 
685
700
  context = SELF(self);
686
701
  GRN_BOOL_INIT(&support_p, 0);
687
- grn_obj_get_info(context, NULL, GRN_INFO_SUPPORT_LZO, &support_p);
702
+ grn_obj_get_info(context, NULL, GRN_INFO_SUPPORT_LZ4, &support_p);
688
703
  rb_support_p = CBOOL2RVAL(GRN_BOOL_VALUE(&support_p));
689
704
  GRN_OBJ_FIN(context, &support_p);
690
705
 
@@ -974,6 +989,8 @@ rb_grn_init_context (VALUE mGrn)
974
989
  rb_grn_context_support_zlib_p, 0);
975
990
  rb_define_method(cGrnContext, "support_lzo?",
976
991
  rb_grn_context_support_lzo_p, 0);
992
+ rb_define_method(cGrnContext, "support_lz4?",
993
+ rb_grn_context_support_lz4_p, 0);
977
994
 
978
995
  rb_define_method(cGrnContext, "database", rb_grn_context_get_database, 0);
979
996
 
@@ -219,6 +219,10 @@ rb_grn_double_array_trie_bind (RbGrnDoubleArrayTrie *rb_grn_double_array_trie,
219
219
  * {Groonga::IndexColumn} を定義する場合は
220
220
  * @"TokenBigram"@ などを指定する必要がある。
221
221
  *
222
+ * @option options [::Array<String, Groonga::Procedure>, nil]
223
+ * :token_filters (nil) The token filters to be used in the
224
+ * table.
225
+ *
222
226
  * @option options :sub_records
223
227
  * +true+ を指定すると {#group} でグループ化したときに、
224
228
  * {Groonga::Record#n_sub_records} でグループに含まれるレコー
@@ -246,7 +250,9 @@ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
246
250
  VALUE options, rb_context, rb_name, rb_path, rb_persistent;
247
251
  VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
248
252
  VALUE rb_value_type;
249
- VALUE rb_default_tokenizer, rb_sub_records;
253
+ VALUE rb_default_tokenizer;
254
+ VALUE rb_token_filters;
255
+ VALUE rb_sub_records;
250
256
  VALUE rb_normalizer;
251
257
 
252
258
  rb_scan_args(argc, argv, "01", &options);
@@ -261,6 +267,7 @@ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
261
267
  "key_type", &rb_key_type,
262
268
  "value_type", &rb_value_type,
263
269
  "default_tokenizer", &rb_default_tokenizer,
270
+ "token_filters", &rb_token_filters,
264
271
  "sub_records", &rb_sub_records,
265
272
  "normalizer", &rb_normalizer,
266
273
  NULL);
@@ -308,7 +315,9 @@ rb_grn_double_array_trie_s_create (int argc, VALUE *argv, VALUE klass)
308
315
  if (!NIL_P(rb_default_tokenizer))
309
316
  rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
310
317
  rb_default_tokenizer);
311
-
318
+ if (!NIL_P(rb_token_filters))
319
+ rb_funcall(rb_table, rb_intern("token_filters="), 1,
320
+ rb_token_filters);
312
321
  if (!NIL_P(rb_normalizer))
313
322
  rb_funcall(rb_table, rb_intern("normalizer="), 1,
314
323
  rb_normalizer);
@@ -1,6 +1,7 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
- Copyright (C) 2009-2012 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
4
+ Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
4
5
 
5
6
  This library is free software; you can redistribute it and/or
6
7
  modify it under the terms of the GNU Lesser General Public
@@ -83,7 +84,7 @@ static VALUE eGrnNotSocket;
83
84
  static VALUE eGrnOperationNotSupported;
84
85
  static VALUE eGrnAddressIsInUse;
85
86
  static VALUE eGrnZLibError;
86
- static VALUE eGrnLZOError;
87
+ static VALUE eGrnLZ4Error;
87
88
  static VALUE eGrnStackOverFlow;
88
89
  static VALUE eGrnSyntaxError;
89
90
  static VALUE eGrnRetryMax;
@@ -95,6 +96,7 @@ static VALUE eGrnTooSmallLimit;
95
96
  static VALUE eGrnCASError;
96
97
  static VALUE eGrnUnsupportedCommandVersion;
97
98
  static VALUE eGrnNormalizerError;
99
+ static VALUE eGrnTokenFilterError;
98
100
 
99
101
  VALUE
100
102
  rb_grn_rc_to_exception (grn_rc rc)
@@ -288,8 +290,8 @@ rb_grn_rc_to_exception (grn_rc rc)
288
290
  case GRN_ZLIB_ERROR:
289
291
  exception = eGrnZLibError;
290
292
  break;
291
- case GRN_LZO_ERROR:
292
- exception = eGrnLZOError;
293
+ case GRN_LZ4_ERROR:
294
+ exception = eGrnLZ4Error;
293
295
  break;
294
296
  case GRN_STACK_OVER_FLOW:
295
297
  exception = eGrnStackOverFlow;
@@ -324,6 +326,9 @@ rb_grn_rc_to_exception (grn_rc rc)
324
326
  case GRN_NORMALIZER_ERROR:
325
327
  exception = eGrnNormalizerError;
326
328
  break;
329
+ case GRN_TOKEN_FILTER_ERROR:
330
+ exception = eGrnTokenFilterError;
331
+ break;
327
332
  }
328
333
 
329
334
  if (NIL_P(exception))
@@ -524,8 +529,8 @@ rb_grn_rc_to_message (grn_rc rc)
524
529
  case GRN_ZLIB_ERROR:
525
530
  message = "ZLib error";
526
531
  break;
527
- case GRN_LZO_ERROR:
528
- message = "LZO error";
532
+ case GRN_LZ4_ERROR:
533
+ message = "LZ4 error";
529
534
  break;
530
535
  case GRN_STACK_OVER_FLOW:
531
536
  message = "stack over flow";
@@ -560,6 +565,9 @@ rb_grn_rc_to_message (grn_rc rc)
560
565
  case GRN_NORMALIZER_ERROR:
561
566
  message = "normalizer error";
562
567
  break;
568
+ case GRN_TOKEN_FILTER_ERROR:
569
+ message = "token filter error";
570
+ break;
563
571
  }
564
572
 
565
573
  if (!message)
@@ -1114,12 +1122,12 @@ rb_grn_init_exception (VALUE mGrn)
1114
1122
  rb_define_class_under(mGrn, "ZLibError", rb_eGrnError);
1115
1123
 
1116
1124
  /*
1117
- * Document-class: Groonga::LZOError
1125
+ * Document-class: Groonga::LZ4Error
1118
1126
  *
1119
- * LZOに問題があるときに発生する。
1127
+ * LZ4に問題があるときに発生する。
1120
1128
  */
1121
- eGrnLZOError =
1122
- rb_define_class_under(mGrn, "LZOError", rb_eGrnError);
1129
+ eGrnLZ4Error =
1130
+ rb_define_class_under(mGrn, "LZ4Error", rb_eGrnError);
1123
1131
 
1124
1132
  /*
1125
1133
  * Document-class: Groonga::StackOverFlow
@@ -1209,4 +1217,14 @@ rb_grn_init_exception (VALUE mGrn)
1209
1217
  */
1210
1218
  eGrnNormalizerError =
1211
1219
  rb_define_class_under(mGrn, "NormalizerError", rb_eGrnError);
1220
+
1221
+ /*
1222
+ * Document-class: Groonga::TokenFilterError
1223
+ *
1224
+ * It is used when a token filter causes an error.
1225
+ *
1226
+ * @since 4.0.6
1227
+ */
1228
+ eGrnTokenFilterError =
1229
+ rb_define_class_under(mGrn, "TokenFilterError", rb_eGrnError);
1212
1230
  }
@@ -1,6 +1,7 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
3
  Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
4
+ Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
4
5
 
5
6
  This library is free software; you can redistribute it and/or
6
7
  modify it under the terms of the GNU Lesser General Public
@@ -493,6 +494,37 @@ rb_grn_expression_compile (VALUE self)
493
494
  return Qnil;
494
495
  }
495
496
 
497
+ /*
498
+ * Dump execution plan of the `expression` in string.
499
+ *
500
+ * @overload dump_plan
501
+ * @since 4.0.8
502
+ */
503
+ static VALUE
504
+ rb_grn_expression_dump_plan (VALUE self)
505
+ {
506
+ /* TODO: Remove me after Groogna 4.0.8 is released. */
507
+ #ifdef HAVE_GRN_EXPR_DUMP_PLAN
508
+ grn_ctx *context = NULL;
509
+ grn_obj *expression;
510
+ grn_obj dumped_plan;
511
+ VALUE rb_dumped_plan;
512
+
513
+ rb_grn_expression_deconstruct(SELF(self), &expression, &context,
514
+ NULL, NULL,
515
+ NULL, NULL, NULL);
516
+
517
+ GRN_TEXT_INIT(&dumped_plan, 0);
518
+ grn_expr_dump_plan(context, expression, &dumped_plan);
519
+ rb_dumped_plan = GRNBULK2RVAL(context, &dumped_plan, NULL, self);
520
+ grn_obj_unlink(context, &dumped_plan);
521
+
522
+ return rb_dumped_plan;
523
+ #else
524
+ return rb_str_new2("");
525
+ #endif
526
+ }
527
+
496
528
  /*
497
529
  * _expression_ で使用可能な変数のうち、名前が _name_
498
530
  * または _offset_ 番目に {Expression#append_object}
@@ -717,6 +749,47 @@ rb_grn_expression_snippet (int argc, VALUE *argv, VALUE self)
717
749
  return GRNOBJECT2RVAL(Qnil, context, snippet, GRN_TRUE);
718
750
  }
719
751
 
752
+ /*
753
+ * Extracts keywords from _expression_. The keywords order isn't
754
+ * guaranteed.
755
+ *
756
+ * @example
757
+ * expression.parse("Ruby OR Groonga")
758
+ * expression.keywords #=> ["Groonga", "Ruby"]
759
+ *
760
+ * @overload keywords
761
+ * @return [::Array<String>] the extracted keywords
762
+ *
763
+ * @since 4.0.6
764
+ */
765
+ static VALUE
766
+ rb_grn_expression_get_keywords (VALUE self)
767
+ {
768
+ grn_ctx *context = NULL;
769
+ grn_obj *expression;
770
+ grn_obj keywords;
771
+ VALUE rb_keywords = rb_ary_new();
772
+
773
+ rb_grn_expression_deconstruct(SELF(self), &expression, &context,
774
+ NULL, NULL,
775
+ NULL, NULL, NULL);
776
+
777
+ GRN_PTR_INIT(&keywords, GRN_OBJ_VECTOR, GRN_ID_NIL);
778
+ grn_expr_get_keywords(context, expression, &keywords);
779
+ {
780
+ int i, n_keywords;
781
+ n_keywords = GRN_BULK_VSIZE(&keywords) / sizeof(grn_obj *);
782
+ for (i = 0; i < n_keywords; i++) {
783
+ grn_obj *keyword = GRN_PTR_VALUE_AT(&keywords, i);
784
+ rb_ary_push(rb_keywords,
785
+ GRNBULK2RVAL(context, keyword, NULL, self));
786
+ }
787
+ }
788
+ GRN_OBJ_FIN(context, &keywords);
789
+
790
+ return rb_keywords;
791
+ }
792
+
720
793
  void
721
794
  rb_grn_init_expression (VALUE mGrn)
722
795
  {
@@ -741,6 +814,8 @@ rb_grn_init_expression (VALUE mGrn)
741
814
  rb_grn_expression_execute, 0);
742
815
  rb_define_method(rb_cGrnExpression, "compile",
743
816
  rb_grn_expression_compile, 0);
817
+ rb_define_method(rb_cGrnExpression, "dump_plan",
818
+ rb_grn_expression_dump_plan, 0);
744
819
 
745
820
  rb_define_method(rb_cGrnExpression, "[]",
746
821
  rb_grn_expression_array_reference, 1);
@@ -748,6 +823,9 @@ rb_grn_init_expression (VALUE mGrn)
748
823
  rb_define_method(rb_cGrnExpression, "snippet",
749
824
  rb_grn_expression_snippet, -1);
750
825
 
826
+ rb_define_method(rb_cGrnExpression, "keywords",
827
+ rb_grn_expression_get_keywords, 0);
828
+
751
829
  rb_define_method(rb_cGrnExpression, "inspect",
752
830
  rb_grn_expression_inspect, 0);
753
831
  }
@@ -131,6 +131,11 @@ VALUE rb_cGrnHash;
131
131
  * デフォルトでは何も設定されていないので、テーブルに
132
132
  * {Groonga::IndexColumn} を定義する場合は
133
133
  * @"TokenBigram"@ などを指定する必要がある。
134
+ *
135
+ * @option options [::Array<String, Groonga::Procedure>, nil]
136
+ * :token_filters (nil) The token filters to be used in the
137
+ * table.
138
+ *
134
139
  * @option options [Groonga::Record#n_sub_records] :sub_records
135
140
  * +true+ を指定すると {#group} でグループ化したときに、
136
141
  * {Groonga::Record#n_sub_records} でグループに含まれるレコー
@@ -157,6 +162,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
157
162
  VALUE rb_table;
158
163
  VALUE options, rb_context, rb_name, rb_path, rb_persistent;
159
164
  VALUE rb_key_normalize, rb_key_type, rb_value_type, rb_default_tokenizer;
165
+ VALUE rb_token_filters;
160
166
  VALUE rb_sub_records;
161
167
  VALUE rb_normalizer;
162
168
 
@@ -171,6 +177,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
171
177
  "key_type", &rb_key_type,
172
178
  "value_type", &rb_value_type,
173
179
  "default_tokenizer", &rb_default_tokenizer,
180
+ "token_filters", &rb_token_filters,
174
181
  "sub_records", &rb_sub_records,
175
182
  "normalizer", &rb_normalizer,
176
183
  NULL);
@@ -215,6 +222,9 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
215
222
  if (!NIL_P(rb_default_tokenizer))
216
223
  rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
217
224
  rb_default_tokenizer);
225
+ if (!NIL_P(rb_token_filters))
226
+ rb_funcall(rb_table, rb_intern("token_filters="), 1,
227
+ rb_token_filters);
218
228
  if (!NIL_P(rb_normalizer))
219
229
  rb_funcall(rb_table, rb_intern("normalizer="), 1,
220
230
  rb_normalizer);
@@ -193,13 +193,14 @@ rb_grn_logger_fin (grn_ctx *ctx, void *user_data)
193
193
  * groongaがログを出力する度に呼び出されるブロックを登録する。
194
194
  *
195
195
  * @overload register(options={})
196
- * @yield [level, time, title, message, location]
197
- * _level_ はSymbol、それ以外は全て文字列で渡される。 _level_ 以外
196
+ * @yield [event, level, time, title, message, location]
197
+ * _event_ と _level_ はSymbol、それ以外は全て文字列で渡される。
198
+ * _event_ と _level_ 以外
198
199
  * の4つについては _options_ で +false+ を指定することでブロックに
199
200
  * 渡さないようにすることができ、その場合は空文字列が実際には渡される。
200
201
  * @param options [::Hash] The name and value
201
202
  * pairs. Omitted names are initialized as the default value.
202
- * @option options :level (:notice)
203
+ * @option options :max_level (:notice)
203
204
  * ログのレベルを +:none+ , +:emergency+ , +:alert+ ,
204
205
  * +:critical+ , +:error+ , +:warning+ , +:notice+ , +:info+ ,
205
206
  * +:debug+ , +:dump+ のいずれかで指定する。それより重要度が
@@ -234,6 +235,9 @@ rb_grn_logger_s_register (int argc, VALUE *argv, VALUE klass)
234
235
  rb_scan_args(argc, argv, "02&", &rb_logger, &rb_options, &rb_callback);
235
236
 
236
237
  if (rb_block_given_p()) {
238
+ if (!NIL_P(rb_logger)) {
239
+ rb_options = rb_logger;
240
+ }
237
241
  rb_logger = rb_funcall(cGrnCallbackLogger, id_new, 1, rb_callback);
238
242
  }
239
243
 
@@ -1,6 +1,7 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
3
  Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
4
+ Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
4
5
 
5
6
  This library is free software; you can redistribute it and/or
6
7
  modify it under the terms of the GNU Lesser General Public
@@ -901,8 +902,8 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
901
902
  case GRN_COLUMN_VAR_SIZE:
902
903
  if (flags & GRN_OBJ_COMPRESS_ZLIB)
903
904
  rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_ZLIB"));
904
- if (flags & GRN_OBJ_COMPRESS_LZO)
905
- rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_LZO"));
905
+ if (flags & GRN_OBJ_COMPRESS_LZ4)
906
+ rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_LZ4"));
906
907
  break;
907
908
  case GRN_COLUMN_INDEX:
908
909
  if (flags & GRN_OBJ_WITH_SECTION)
@@ -1,7 +1,7 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /* vim: set sts=4 sw=4 ts=8 noet: */
3
3
  /*
4
- Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
4
+ Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
5
5
 
6
6
  This library is free software; you can redistribute it and/or
7
7
  modify it under the terms of the GNU Lesser General Public
@@ -141,6 +141,11 @@ VALUE rb_cGrnPatriciaTrie;
141
141
  * デフォルトでは何も設定されていないので、テーブルに
142
142
  * {Groonga::IndexColumn} を定義する場合は
143
143
  * @"TokenBigram"@ などを指定する必要がある。
144
+ *
145
+ * @option options [::Array<String, Groonga::Procedure>, nil]
146
+ * :token_filters (nil) The token filters to be used in the
147
+ * table.
148
+ *
144
149
  * @option options :sub_records
145
150
  * +true+ を指定すると {#group} でグループ化したときに、
146
151
  * {Groonga::Record#n_sub_records} でグループに含まれるレコー
@@ -168,7 +173,9 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
168
173
  VALUE options, rb_context, rb_name, rb_path, rb_persistent;
169
174
  VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
170
175
  VALUE rb_value_type;
171
- VALUE rb_default_tokenizer, rb_sub_records;
176
+ VALUE rb_default_tokenizer;
177
+ VALUE rb_token_filters;
178
+ VALUE rb_sub_records;
172
179
  VALUE rb_normalizer;
173
180
 
174
181
  rb_scan_args(argc, argv, "01", &options);
@@ -183,6 +190,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
183
190
  "key_type", &rb_key_type,
184
191
  "value_type", &rb_value_type,
185
192
  "default_tokenizer", &rb_default_tokenizer,
193
+ "token_filters", &rb_token_filters,
186
194
  "sub_records", &rb_sub_records,
187
195
  "normalizer", &rb_normalizer,
188
196
  NULL);
@@ -230,6 +238,9 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
230
238
  if (!NIL_P(rb_default_tokenizer))
231
239
  rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
232
240
  rb_default_tokenizer);
241
+ if (!NIL_P(rb_token_filters))
242
+ rb_funcall(rb_table, rb_intern("token_filters="), 1,
243
+ rb_token_filters);
233
244
  if (!NIL_P(rb_normalizer))
234
245
  rb_funcall(rb_table, rb_intern("normalizer="), 1,
235
246
  rb_normalizer);
@@ -340,7 +351,7 @@ rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
340
351
  *
341
352
  * @example
342
353
  * words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
343
- * :key_normalize => true)
354
+ * :normalizer => "NormalizerAuto")
344
355
  * words.add("リンク")
345
356
  * adventure_of_link = words.add('リンクの冒険')
346
357
  * words.add('冒険')
@@ -753,10 +764,11 @@ rb_grn_patricia_trie_open_rk_cursor (int argc, VALUE *argv, VALUE self)
753
764
 
754
765
  static grn_table_cursor *
755
766
  rb_grn_patricia_trie_open_grn_near_cursor (int argc, VALUE *argv, VALUE self,
756
- grn_ctx **context, int flags)
767
+ grn_ctx **context, int flags)
757
768
  {
758
769
  grn_obj *table;
759
- grn_obj *key_p = NULL, casted_key;
770
+ grn_id domain_id;
771
+ grn_obj *key, *domain;
760
772
  grn_table_cursor *cursor;
761
773
  unsigned min_size = 0;
762
774
  int offset = 0, limit = -1;
@@ -765,10 +777,10 @@ rb_grn_patricia_trie_open_grn_near_cursor (int argc, VALUE *argv, VALUE self,
765
777
 
766
778
  flags |= GRN_CURSOR_PREFIX;
767
779
 
768
- rb_grn_table_deconstruct((RbGrnTable *)SELF(self), &table, context,
769
- NULL, NULL,
770
- NULL, NULL, NULL,
771
- NULL);
780
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, context,
781
+ &key, &domain_id, &domain,
782
+ NULL, NULL, NULL,
783
+ NULL);
772
784
 
773
785
  rb_scan_args(argc, argv, "11", &rb_key, &options);
774
786
 
@@ -780,15 +792,7 @@ rb_grn_patricia_trie_open_grn_near_cursor (int argc, VALUE *argv, VALUE self,
780
792
  "less_than", &rb_less_than,
781
793
  NULL);
782
794
 
783
- key_p = RVAL2GRNBULK_WITH_TYPE(rb_key, *context, key_p,
784
- table->header.domain,
785
- grn_ctx_at(*context, table->header.domain));
786
- GRN_OBJ_INIT(&casted_key, GRN_BULK, 0, table->header.domain);
787
- if (key_p->header.domain != table->header.domain) {
788
- grn_obj_cast(*context, key_p, &casted_key, GRN_FALSE);
789
- grn_obj_unlink(*context, key_p);
790
- key_p = &casted_key;
791
- }
795
+ RVAL2GRNBULK_WITH_TYPE(rb_key, *context, key, domain_id, domain);
792
796
 
793
797
  if (!NIL_P(rb_min_size))
794
798
  min_size = NUM2UINT(rb_min_size);
@@ -804,9 +808,8 @@ rb_grn_patricia_trie_open_grn_near_cursor (int argc, VALUE *argv, VALUE self,
804
808
 
805
809
  cursor = grn_table_cursor_open(*context, table,
806
810
  NULL, min_size,
807
- GRN_BULK_HEAD(key_p), GRN_BULK_VSIZE(key_p),
811
+ GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key),
808
812
  offset, limit, flags);
809
- GRN_OBJ_FIN(*context, &casted_key);
810
813
  rb_grn_context_check(*context, self);
811
814
 
812
815
  return cursor;