rroonga 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. data/NEWS.ja.rdoc +29 -0
  2. data/NEWS.rdoc +29 -0
  3. data/Rakefile +5 -3
  4. data/ext/groonga/rb-grn-array.c +1 -1
  5. data/ext/groonga/rb-grn-context.c +15 -28
  6. data/ext/groonga/rb-grn-exception.c +46 -1
  7. data/ext/groonga/rb-grn-expression.c +22 -13
  8. data/ext/groonga/rb-grn-fix-size-column.c +2 -8
  9. data/ext/groonga/rb-grn-hash.c +8 -1
  10. data/ext/groonga/rb-grn-object.c +1 -1
  11. data/ext/groonga/rb-grn-patricia-trie.c +23 -1
  12. data/ext/groonga/rb-grn-table-key-support.c +22 -0
  13. data/ext/groonga/rb-grn-table.c +37 -5
  14. data/ext/groonga/rb-grn-utils.c +20 -2
  15. data/ext/groonga/rb-groonga.c +76 -38
  16. data/extconf.rb +17 -1
  17. data/html/developer.html +32 -7
  18. data/html/footer.html.erb +5 -0
  19. data/html/heading-mark.svg +393 -0
  20. data/html/index.html +33 -3
  21. data/lib/groonga.rb +3 -7
  22. data/lib/groonga/context.rb +2 -13
  23. data/lib/groonga/expression-builder.rb +273 -67
  24. data/lib/groonga/pagination.rb +143 -0
  25. data/lib/groonga/record.rb +2 -0
  26. data/lib/groonga/schema.rb +140 -29
  27. data/rroonga-build.rb +2 -2
  28. data/test-unit/Rakefile +40 -0
  29. data/test-unit/TODO +5 -0
  30. data/test-unit/bin/testrb +5 -0
  31. data/test-unit/html/classic.html +15 -0
  32. data/test-unit/html/index.html +25 -0
  33. data/test-unit/html/index.html.ja +27 -0
  34. data/test-unit/lib/test/unit.rb +323 -0
  35. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  36. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  37. data/test-unit/lib/test/unit/attribute.rb +125 -0
  38. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  39. data/test-unit/lib/test/unit/collector.rb +36 -0
  40. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  41. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  42. data/test-unit/lib/test/unit/collector/load.rb +144 -0
  43. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  44. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  45. data/test-unit/lib/test/unit/color.rb +96 -0
  46. data/test-unit/lib/test/unit/diff.rb +724 -0
  47. data/test-unit/lib/test/unit/error.rb +130 -0
  48. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  49. data/test-unit/lib/test/unit/failure.rb +136 -0
  50. data/test-unit/lib/test/unit/fixture.rb +176 -0
  51. data/test-unit/lib/test/unit/notification.rb +129 -0
  52. data/test-unit/lib/test/unit/omission.rb +191 -0
  53. data/test-unit/lib/test/unit/pending.rb +150 -0
  54. data/test-unit/lib/test/unit/priority.rb +180 -0
  55. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  56. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  57. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  58. data/test-unit/lib/test/unit/testcase.rb +476 -0
  59. data/test-unit/lib/test/unit/testresult.rb +89 -0
  60. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  61. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  62. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  63. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  64. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  65. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  66. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  67. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  68. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  69. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  70. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  71. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  72. data/test-unit/lib/test/unit/version.rb +7 -0
  73. data/test-unit/sample/adder.rb +13 -0
  74. data/test-unit/sample/subtracter.rb +12 -0
  75. data/test-unit/sample/test_adder.rb +20 -0
  76. data/test-unit/sample/test_subtracter.rb +20 -0
  77. data/test-unit/sample/test_user.rb +23 -0
  78. data/test-unit/test/collector/test-descendant.rb +133 -0
  79. data/test-unit/test/collector/test-load.rb +442 -0
  80. data/test-unit/test/collector/test_dir.rb +406 -0
  81. data/test-unit/test/collector/test_objectspace.rb +100 -0
  82. data/test-unit/test/run-test.rb +15 -0
  83. data/test-unit/test/test-attribute.rb +86 -0
  84. data/test-unit/test/test-color-scheme.rb +67 -0
  85. data/test-unit/test/test-color.rb +47 -0
  86. data/test-unit/test/test-diff.rb +518 -0
  87. data/test-unit/test/test-emacs-runner.rb +60 -0
  88. data/test-unit/test/test-fixture.rb +287 -0
  89. data/test-unit/test/test-notification.rb +33 -0
  90. data/test-unit/test/test-omission.rb +81 -0
  91. data/test-unit/test/test-pending.rb +70 -0
  92. data/test-unit/test/test-priority.rb +119 -0
  93. data/test-unit/test/test-testcase.rb +544 -0
  94. data/test-unit/test/test_assertions.rb +1151 -0
  95. data/test-unit/test/test_error.rb +26 -0
  96. data/test-unit/test/test_failure.rb +33 -0
  97. data/test-unit/test/test_testresult.rb +113 -0
  98. data/test-unit/test/test_testsuite.rb +129 -0
  99. data/test-unit/test/testunit-test-util.rb +14 -0
  100. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  101. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  102. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  103. data/test-unit/test/util/test_observable.rb +102 -0
  104. data/test-unit/test/util/test_procwrapper.rb +36 -0
  105. data/test/groonga-test-utils.rb +3 -2
  106. data/test/run-test.rb +14 -2
  107. data/test/test-column.rb +7 -7
  108. data/test/test-context-select.rb +34 -11
  109. data/test/test-exception.rb +3 -0
  110. data/test/test-expression-builder.rb +11 -0
  111. data/test/test-expression.rb +3 -6
  112. data/test/test-gqtp.rb +3 -5
  113. data/test/test-pagination.rb +249 -0
  114. data/test/test-record.rb +36 -8
  115. data/test/test-remote.rb +11 -4
  116. data/test/test-schema-create-table.rb +251 -0
  117. data/test/test-schema.rb +4 -24
  118. data/test/test-table-offset-and-limit.rb +3 -5
  119. data/test/test-table-select-mecab.rb +80 -0
  120. data/test/test-table-select-weight.rb +104 -0
  121. data/test/test-table.rb +22 -4
  122. data/test/test-version.rb +1 -1
  123. data/text/TUTORIAL.ja.rdoc +2 -0
  124. data/text/expression.rdoc +1 -0
  125. metadata +96 -35
data/NEWS.ja.rdoc CHANGED
@@ -1,5 +1,34 @@
1
1
  = お知らせ
2
2
 
3
+ == 0.9.5: 2010-07-29
4
+
5
+ * groonga 0.7.4対応。
6
+ * Groonga::Table#selectの改良:
7
+ * 重み付きマッチ対応:
8
+
9
+ sourceカラムとtitleカラムにマッチするが、
10
+ titleカラムの方がスコアが大きくなる例:
11
+ table.select do |record|
12
+ (record.title * 10 | record.source) =~ "query"
13
+ end
14
+ * 配列で複数条件のand表現に対応:
15
+
16
+ 以下は同じ条件になる:
17
+ table.select do |record|
18
+ conditions = []
19
+ conditions << record.title =~ "query"
20
+ conditions << record.updated_at > Time.parse("2010-07-29T21:14:29+09:00")
21
+ conditions
22
+ end
23
+
24
+ table.select do |record|
25
+ (record.title =~ "query") &
26
+ (record.updated_at > Time.parse("2010-07-29T21:14:29+09:00"))
27
+ end
28
+ * 利用しているgroongaのバージョン取得対応: Groonga::VERSION
29
+ * Groonga::Table#support_sub_records?追加
30
+ * ページネーション対応: Groonga::Table#paginate, Groonga::Pagination
31
+
3
32
  == 0.9.4: 2010-04-22
4
33
 
5
34
  * リリースミス修正。
data/NEWS.rdoc CHANGED
@@ -1,5 +1,34 @@
1
1
  = NEWS
2
2
 
3
+ == 0.9.5: 2010-07-20
4
+
5
+ * Supported groonga 0.7.4.
6
+ * Imporoved Groonga::Table#select:
7
+ * Supported weight match:
8
+
9
+ Here is an example to match source column or title column and
10
+ title column has high score:
11
+ table.select do |record|
12
+ (record.title * 10 | record.source) =~ "query"
13
+ end
14
+ * Supported and representation for and conditions:
15
+
16
+ Here are examples that represents the same condition:
17
+ table.select do |record|
18
+ conditions = []
19
+ conditions << record.title =~ "query"
20
+ conditions << record.updated_at > Time.parse("2010-07-29T21:14:29+09:00")
21
+ conditions
22
+ end
23
+
24
+ table.select do |record|
25
+ (record.title =~ "query") &
26
+ (record.updated_at > Time.parse("2010-07-29T21:14:29+09:00"))
27
+ end
28
+ * Provided groonga runtime version: Groonga::VERSION
29
+ * Added Groonga::Table#support_sub_records?
30
+ * Supported pagination: Groonga::Table#paginate, Groonga::Pagination
31
+
3
32
  == 0.9.4: 2010-04-22
4
33
 
5
34
  * Fixed release miss.
data/Rakefile CHANGED
@@ -87,10 +87,10 @@ end
87
87
  ENV["VERSION"] ||= guess_version
88
88
  version = ENV["VERSION"]
89
89
  project = nil
90
- Hoe.spec('rroonga') do |_project|
90
+ Hoe.spec('rroonga') do
91
91
  Hoe::Test::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
92
- project = _project
93
- project.version = version
92
+ project = self
93
+ project.version = version.dup
94
94
  project.rubyforge_name = 'groonga'
95
95
  authors = File.join(base_dir, "AUTHORS")
96
96
  project.author = File.readlines(authors).collect do |line|
@@ -187,6 +187,7 @@ task :prepare_docs_for_publishing do
187
187
  end
188
188
  end
189
189
 
190
+ desc "Publish HTML to Web site."
190
191
  task :publish_html do
191
192
  config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
192
193
  host = "#{config["username"]}@rubyforge.org"
@@ -196,6 +197,7 @@ task :publish_html do
196
197
  sh "rsync #{rsync_args} html/ #{host}:#{remote_dir}"
197
198
  end
198
199
 
200
+ desc "Tag the current revision."
199
201
  task :tag do
200
202
  sh("git tag -a #{version} -m 'release #{version}!!!'")
201
203
  end
@@ -83,7 +83,7 @@ VALUE rb_cGrnArray;
83
83
  *
84
84
  * 名前付き永続テーブルを生成する。ただし、ファイル名は気に
85
85
  * しない。
86
- * Groonga::Array.create(:name => "<bookmarks>",
86
+ * Groonga::Array.create(:name => "Bookmarks",
87
87
  * :persistent => true)
88
88
  *
89
89
  * それぞれのレコードに512バイトの値を格納できる無名一時テー
@@ -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) 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
@@ -107,19 +107,23 @@ rb_grn_context_to_exception (grn_ctx *context, VALUE related_object)
107
107
 
108
108
  GRN_OBJ_INIT(&bulk, GRN_BULK, 0, GRN_ID_NIL);
109
109
  GRN_TEXT_PUTS(context, &bulk, message);
110
- GRN_TEXT_PUTS(context, &bulk, ": ");
111
- GRN_TEXT_PUTS(context, &bulk, context->errbuf);
110
+ if (context->errbuf[0]) {
111
+ GRN_TEXT_PUTS(context, &bulk, ": ");
112
+ GRN_TEXT_PUTS(context, &bulk, context->errbuf);
113
+ }
112
114
  if (!NIL_P(related_object)) {
113
115
  GRN_TEXT_PUTS(context, &bulk, ": ");
114
116
  GRN_TEXT_PUTS(context, &bulk, rb_grn_inspect(related_object));
115
117
  }
116
- GRN_TEXT_PUTS(context, &bulk, "\n");
117
- GRN_TEXT_PUTS(context, &bulk, context->errfile);
118
- GRN_TEXT_PUTS(context, &bulk, ":");
119
- grn_text_itoa(context, &bulk, context->errline);
120
- GRN_TEXT_PUTS(context, &bulk, ": ");
121
- GRN_TEXT_PUTS(context, &bulk, context->errfunc);
122
- GRN_TEXT_PUTS(context, &bulk, "()");
118
+ if (context->errline > 0) {
119
+ GRN_TEXT_PUTS(context, &bulk, "\n");
120
+ GRN_TEXT_PUTS(context, &bulk, context->errfile);
121
+ GRN_TEXT_PUTS(context, &bulk, ":");
122
+ grn_text_itoa(context, &bulk, context->errline);
123
+ GRN_TEXT_PUTS(context, &bulk, ": ");
124
+ GRN_TEXT_PUTS(context, &bulk, context->errfunc);
125
+ GRN_TEXT_PUTS(context, &bulk, "()");
126
+ }
123
127
  exception = rb_funcall(exception_class, rb_intern("new"), 1,
124
128
  rb_str_new(GRN_BULK_HEAD(&bulk),
125
129
  GRN_BULK_VSIZE(&bulk)));
@@ -410,7 +414,7 @@ static VALUE
410
414
  rb_grn_context_connect (int argc, VALUE *argv, VALUE self)
411
415
  {
412
416
  grn_ctx *context;
413
- char *host;
417
+ const char *host;
414
418
  int port;
415
419
  int flags = 0;
416
420
  grn_rc rc;
@@ -610,21 +614,6 @@ rb_grn_context_array_reference (VALUE self, VALUE name_or_id)
610
614
  return GRNOBJECT2RVAL(Qnil, context, object, RB_GRN_FALSE);
611
615
  }
612
616
 
613
- /*
614
- * call-seq:
615
- * context.pop -> 値
616
- *
617
- * コンテキスト内にあるスタックから値を取り出す。このスタッ
618
- * クにはGroonga::Expression#executeの実行結果が格納される。
619
- */
620
- static VALUE
621
- rb_grn_context_pop (VALUE self)
622
- {
623
- grn_ctx *context;
624
- context = SELF(self);
625
- return GRNOBJ2RVAL(Qnil, context, grn_ctx_pop(context), self);
626
- }
627
-
628
617
  void
629
618
  rb_grn_init_context (VALUE mGrn)
630
619
  {
@@ -654,8 +643,6 @@ rb_grn_init_context (VALUE mGrn)
654
643
 
655
644
  rb_define_method(cGrnContext, "[]", rb_grn_context_array_reference, 1);
656
645
 
657
- rb_define_method(cGrnContext, "pop", rb_grn_context_pop, 0);
658
-
659
646
  rb_define_method(cGrnContext, "connect", rb_grn_context_connect, -1);
660
647
  rb_define_method(cGrnContext, "send", rb_grn_context_send, 1);
661
648
  rb_define_method(cGrnContext, "receive", rb_grn_context_receive, 0);
@@ -89,6 +89,9 @@ static VALUE eGrnSyntaxError;
89
89
  static VALUE eGrnRetryMax;
90
90
  static VALUE eGrnIncompatibleFileFormat;
91
91
  static VALUE eGrnUpdateNotAllowed;
92
+ static VALUE eGrnTooSmallOffset;
93
+ static VALUE eGrnTooLargeOffset;
94
+ static VALUE eGrnTooSmallLimit;
92
95
 
93
96
  VALUE
94
97
  rb_grn_rc_to_exception (grn_rc rc)
@@ -300,6 +303,15 @@ rb_grn_rc_to_exception (grn_rc rc)
300
303
  case GRN_UPDATE_NOT_ALLOWED:
301
304
  exception = eGrnUpdateNotAllowed;
302
305
  break;
306
+ case GRN_TOO_SMALL_OFFSET:
307
+ exception = eGrnTooSmallOffset;
308
+ break;
309
+ case GRN_TOO_LARGE_OFFSET:
310
+ exception = eGrnTooLargeOffset;
311
+ break;
312
+ case GRN_TOO_SMALL_LIMIT:
313
+ exception = eGrnTooSmallLimit;
314
+ break;
303
315
  }
304
316
 
305
317
  if (NIL_P(exception))
@@ -518,6 +530,15 @@ rb_grn_rc_to_message (grn_rc rc)
518
530
  case GRN_UPDATE_NOT_ALLOWED:
519
531
  message = "update isn't allowed";
520
532
  break;
533
+ case GRN_TOO_SMALL_OFFSET:
534
+ message = "too small offset";
535
+ break;
536
+ case GRN_TOO_LARGE_OFFSET:
537
+ message = "too large offset";
538
+ break;
539
+ case GRN_TOO_SMALL_LIMIT:
540
+ message = "too small limit";
541
+ break;
521
542
  }
522
543
 
523
544
  if (!message)
@@ -549,7 +570,7 @@ rb_grn_init_exception (VALUE mGrn)
549
570
  /*
550
571
  * Document-class: Groonga::Error
551
572
  *
552
- * Ruby/groongaが発生する例外のスーパークラス。
573
+ * rroongaが発生する例外のスーパークラス。
553
574
  */
554
575
  rb_eGrnError =
555
576
  rb_define_class_under(mGrn, "Error", rb_eStandardError);
@@ -1107,4 +1128,28 @@ rb_grn_init_exception (VALUE mGrn)
1107
1128
  */
1108
1129
  eGrnUpdateNotAllowed =
1109
1130
  rb_define_class_under(mGrn, "UpdateNotAllowed", rb_eGrnError);
1131
+
1132
+ /*
1133
+ * Document-class: Groonga::TooSmallOffset
1134
+ *
1135
+ * offset値が小さすぎるときに発生する。
1136
+ */
1137
+ eGrnTooSmallOffset =
1138
+ rb_define_class_under(mGrn, "TooSmallOffset", rb_eGrnError);
1139
+
1140
+ /*
1141
+ * Document-class: Groonga::TooLargeOffset
1142
+ *
1143
+ * offset値が大きすぎるときに発生する。
1144
+ */
1145
+ eGrnTooLargeOffset =
1146
+ rb_define_class_under(mGrn, "TooLargeOffset", rb_eGrnError);
1147
+
1148
+ /*
1149
+ * Document-class: Groonga::TooSmallLimit
1150
+ *
1151
+ * limit値が小さすぎるときに発生する。
1152
+ */
1153
+ eGrnTooSmallLimit =
1154
+ rb_define_class_under(mGrn, "TooSmallLimit", rb_eGrnError);
1110
1155
  }
@@ -333,7 +333,8 @@ static VALUE
333
333
  rb_grn_expression_parse (int argc, VALUE *argv, VALUE self)
334
334
  {
335
335
  grn_ctx *context = NULL;
336
- grn_obj *expression, *default_column = NULL;
336
+ grn_obj *expression, *default_column;
337
+ rb_grn_boolean default_column_is_created = RB_GRN_FALSE;
337
338
  grn_operator default_operator = GRN_OP_AND;
338
339
  grn_operator default_mode = GRN_OP_MATCH;
339
340
  grn_rc rc;
@@ -363,7 +364,15 @@ rb_grn_expression_parse (int argc, VALUE *argv, VALUE self)
363
364
  NULL, NULL,
364
365
  NULL, NULL, NULL);
365
366
 
366
- default_column = RVAL2GRNBULK(rb_default_column, context, default_column);
367
+ if (NIL_P(rb_default_column)) {
368
+ default_column = NULL;
369
+ } else if (RVAL2CBOOL(rb_obj_is_kind_of(rb_default_column, rb_cGrnObject))) {
370
+ default_column = RVAL2GRNOBJECT(rb_default_column, &context);
371
+ } else {
372
+ default_column = RVAL2GRNBULK(rb_default_column, context, NULL);
373
+ default_column_is_created = RB_GRN_TRUE;
374
+ }
375
+
367
376
  if (!NIL_P(rb_default_mode))
368
377
  default_mode = RVAL2GRNOPERATOR(rb_default_mode);
369
378
  if (!NIL_P(rb_default_operator))
@@ -382,10 +391,10 @@ rb_grn_expression_parse (int argc, VALUE *argv, VALUE self)
382
391
  }
383
392
 
384
393
  if (NIL_P(rb_allow_pragma)) {
385
- if ((flags & GRN_EXPR_SYNTAX_QUERY) == GRN_EXPR_SYNTAX_QUERY)
394
+ if (!(flags & GRN_EXPR_SYNTAX_SCRIPT))
386
395
  flags |= GRN_EXPR_ALLOW_PRAGMA;
387
396
  } else {
388
- if ((flags & GRN_EXPR_SYNTAX_SCRIPT) == GRN_EXPR_SYNTAX_SCRIPT)
397
+ if ((flags & GRN_EXPR_SYNTAX_SCRIPT))
389
398
  rb_raise(rb_eArgError,
390
399
  ":allow_pragma isn't allowed in script syntax");
391
400
  if (RVAL2CBOOL(rb_allow_pragma))
@@ -393,10 +402,10 @@ rb_grn_expression_parse (int argc, VALUE *argv, VALUE self)
393
402
  }
394
403
 
395
404
  if (NIL_P(rb_allow_column)) {
396
- if ((flags & GRN_EXPR_SYNTAX_QUERY) == GRN_EXPR_SYNTAX_QUERY)
405
+ if (!(flags & GRN_EXPR_SYNTAX_SCRIPT))
397
406
  flags |= GRN_EXPR_ALLOW_COLUMN;
398
407
  } else {
399
- if ((flags & GRN_EXPR_SYNTAX_SCRIPT) == GRN_EXPR_SYNTAX_SCRIPT)
408
+ if ((flags & GRN_EXPR_SYNTAX_SCRIPT))
400
409
  rb_raise(rb_eArgError,
401
410
  ":allow_column isn't allowed in script syntax");
402
411
  if (RVAL2CBOOL(rb_allow_column))
@@ -419,7 +428,8 @@ rb_grn_expression_parse (int argc, VALUE *argv, VALUE self)
419
428
  related_object = rb_ary_new3(2, self, rb_ary_new4(argc, argv));
420
429
  exception = rb_grn_context_to_exception(context, related_object);
421
430
  }
422
- grn_obj_unlink(context, default_column);
431
+ if (default_column_is_created)
432
+ grn_obj_unlink(context, default_column);
423
433
 
424
434
  if (!NIL_P(exception))
425
435
  rb_exc_raise(exception);
@@ -429,26 +439,25 @@ rb_grn_expression_parse (int argc, VALUE *argv, VALUE self)
429
439
 
430
440
  /*
431
441
  * call-seq:
432
- * expression.execute
442
+ * expression.execute -> 値
433
443
  *
434
- * _expression_を実行する。
444
+ * _expression_を実行し、実行した結果を返す。
435
445
  */
436
446
  static VALUE
437
447
  rb_grn_expression_execute (VALUE self)
438
448
  {
439
449
  grn_ctx *context = NULL;
440
450
  grn_obj *expression;
441
- grn_rc rc;
451
+ grn_obj *result;
442
452
 
443
453
  rb_grn_expression_deconstruct(SELF(self), &expression, &context,
444
454
  NULL, NULL,
445
455
  NULL, NULL, NULL);
446
456
 
447
- rc = grn_expr_exec(context, expression, 0);
457
+ result = grn_expr_exec(context, expression, 0);
448
458
  rb_grn_context_check(context, self);
449
- rb_grn_rc_check(rc, self);
450
459
 
451
- return Qnil;
460
+ return GRNOBJ2RVAL(Qnil, context, result, self);
452
461
  }
453
462
 
454
463
  /*
@@ -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
@@ -77,13 +77,7 @@ rb_grn_fix_size_column_array_set (VALUE self, VALUE rb_id, VALUE rb_value)
77
77
  &value, &range_id, &range);
78
78
 
79
79
  id = NUM2UINT(rb_id);
80
- RVAL2GRNBULK(rb_value, context, value);
81
- if ((value->header.domain == GRN_DB_INT32 ||
82
- value->header.domain == GRN_DB_UINT32) &&
83
- (GRN_TABLE_HASH_KEY <= range->header.type &&
84
- range->header.type <= GRN_TABLE_VIEW)) {
85
- value->header.domain = range_id;
86
- }
80
+ RVAL2GRNBULK_WITH_TYPE(rb_value, context, value, range_id, range);
87
81
 
88
82
  rc = grn_obj_set_value(context, column, id, value, GRN_OBJ_SET);
89
83
  rb_grn_context_check(context, self);
@@ -62,6 +62,9 @@ VALUE rb_cGrnHash;
62
62
  * Groonga::Contextに結びついているデータベースが一時デー
63
63
  * タベースの場合は例外が発生する。
64
64
  *
65
+ * [+:key_normalize+]
66
+ * +true+を指定するとキーを正規化する。
67
+ *
65
68
  * [+:key_type+]
66
69
  * キーの種類を示すオブジェクトを指定する。キーの種類には型
67
70
  * 名("Int32"や"ShortText"など)またはGroonga::Typeまたは
@@ -152,7 +155,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
152
155
  grn_obj_flags flags = GRN_TABLE_HASH_KEY;
153
156
  VALUE rb_table;
154
157
  VALUE options, rb_context, rb_name, rb_path, rb_persistent;
155
- VALUE rb_key_type, rb_value_type, rb_default_tokenizer;
158
+ VALUE rb_key_normalize, rb_key_type, rb_value_type, rb_default_tokenizer;
156
159
  VALUE rb_sub_records;
157
160
 
158
161
  rb_scan_args(argc, argv, "01", &options);
@@ -162,6 +165,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
162
165
  "name", &rb_name,
163
166
  "path", &rb_path,
164
167
  "persistent", &rb_persistent,
168
+ "key_normalize", &rb_key_normalize,
165
169
  "key_type", &rb_key_type,
166
170
  "value_type", &rb_value_type,
167
171
  "default_tokenizer", &rb_default_tokenizer,
@@ -184,6 +188,9 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
184
188
  if (RVAL2CBOOL(rb_persistent))
185
189
  flags |= GRN_OBJ_PERSISTENT;
186
190
 
191
+ if (RVAL2CBOOL(rb_key_normalize))
192
+ flags |= GRN_OBJ_KEY_NORMALIZE;
193
+
187
194
  if (NIL_P(rb_key_type)) {
188
195
  flags |= GRN_OBJ_KEY_VAR_SIZE;
189
196
  } else {
@@ -429,7 +429,7 @@ rb_grn_named_object_set_name (RbGrnNamedObject *rb_grn_named_object,
429
429
  const char *name, unsigned name_size)
430
430
  {
431
431
  if (rb_grn_named_object->name) {
432
- free(rb_grn_named_object->name);
432
+ xfree(rb_grn_named_object->name);
433
433
  rb_grn_named_object->name = NULL;
434
434
  }
435
435
  if (name_size > 0) {
@@ -396,7 +396,7 @@ rb_grn_patricia_trie_scan (VALUE self, VALUE rb_string)
396
396
  while (string_length > 0) {
397
397
  const char *rest;
398
398
  int i, n_hits;
399
- long previous_offset = 0;
399
+ unsigned int previous_offset = 0;
400
400
 
401
401
  n_hits = grn_pat_scan(context, (grn_pat *)table,
402
402
  string, string_length,
@@ -469,6 +469,25 @@ rb_grn_patricia_trie_prefix_search (VALUE self, VALUE rb_prefix)
469
469
  return rb_result;
470
470
  }
471
471
 
472
+ /*
473
+ * call-seq:
474
+ * table.register_key_with_sis? -> true/false
475
+ *
476
+ * キーを登録するときに文字列の全suffixも一緒に登録する場合
477
+ * は+true+、登録しない場合は+false+を返す。
478
+ */
479
+ static VALUE
480
+ rb_grn_patricia_trie_register_key_with_sis_p (VALUE self)
481
+ {
482
+ grn_obj *table;
483
+
484
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, NULL,
485
+ NULL, NULL, NULL,
486
+ NULL, NULL, NULL,
487
+ NULL);
488
+ return CBOOL2RVAL(table->header.flags & GRN_OBJ_KEY_WITH_SIS);
489
+ }
490
+
472
491
  void
473
492
  rb_grn_init_patricia_trie (VALUE mGrn)
474
493
  {
@@ -485,4 +504,7 @@ rb_grn_init_patricia_trie (VALUE mGrn)
485
504
  rb_grn_patricia_trie_scan, 1);
486
505
  rb_define_method(rb_cGrnPatriciaTrie, "prefix_search",
487
506
  rb_grn_patricia_trie_prefix_search, 1);
507
+
508
+ rb_define_method(rb_cGrnPatriciaTrie, "register_key_with_sis?",
509
+ rb_grn_patricia_trie_register_key_with_sis_p, 0);
488
510
  }