rroonga 1.1.0 → 1.2.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.
Files changed (64) hide show
  1. data/NEWS.ja.rdoc +18 -0
  2. data/NEWS.rdoc +18 -0
  3. data/bin/grndump +71 -0
  4. data/ext/groonga/rb-grn-accessor.c +64 -1
  5. data/ext/groonga/rb-grn-context.c +40 -1
  6. data/ext/groonga/rb-grn-database.c +47 -5
  7. data/ext/groonga/rb-grn-index-column.c +77 -7
  8. data/ext/groonga/rb-grn-object.c +8 -4
  9. data/ext/groonga/rb-grn-table-cursor.c +56 -1
  10. data/ext/groonga/rb-grn-table-key-support.c +2 -2
  11. data/ext/groonga/rb-grn-table.c +10 -38
  12. data/ext/groonga/rb-grn.h +11 -1
  13. data/html/index.html +6 -6
  14. data/html/ranguba.css +8 -1
  15. data/lib/groonga.rb +1 -0
  16. data/lib/groonga/dumper.rb +481 -0
  17. data/lib/groonga/schema.rb +54 -181
  18. data/rroonga-build.rb +1 -1
  19. data/test-unit-notify/Rakefile +47 -0
  20. data/test-unit-notify/lib/test/unit/notify.rb +104 -0
  21. data/test-unit/COPYING +56 -0
  22. data/test-unit/GPL +340 -0
  23. data/test-unit/PSFL +271 -0
  24. data/test-unit/Rakefile +18 -5
  25. data/test-unit/html/bar.svg +153 -0
  26. data/test-unit/html/developer.svg +469 -0
  27. data/test-unit/html/favicon.ico +0 -0
  28. data/test-unit/html/favicon.svg +82 -0
  29. data/test-unit/html/heading-mark.svg +393 -0
  30. data/test-unit/html/index.html +235 -13
  31. data/test-unit/html/index.html.ja +258 -15
  32. data/test-unit/html/install.svg +636 -0
  33. data/test-unit/html/logo.svg +483 -0
  34. data/test-unit/html/test-unit.css +339 -0
  35. data/test-unit/html/tutorial.svg +559 -0
  36. data/test-unit/lib/test/unit.rb +6 -1
  37. data/test-unit/lib/test/unit/assertions.rb +115 -11
  38. data/test-unit/lib/test/unit/autorunner.rb +5 -2
  39. data/test-unit/lib/test/unit/collector/load.rb +1 -1
  40. data/test-unit/lib/test/unit/color-scheme.rb +6 -2
  41. data/test-unit/lib/test/unit/diff.rb +17 -1
  42. data/test-unit/lib/test/unit/testcase.rb +7 -0
  43. data/test-unit/lib/test/unit/testresult.rb +34 -2
  44. data/test-unit/lib/test/unit/ui/console/testrunner.rb +9 -45
  45. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +2 -12
  46. data/test-unit/lib/test/unit/ui/testrunner.rb +25 -0
  47. data/test-unit/lib/test/unit/util/backtracefilter.rb +1 -0
  48. data/test-unit/lib/test/unit/util/output.rb +31 -0
  49. data/test-unit/lib/test/unit/version.rb +1 -1
  50. data/test-unit/test/test-color-scheme.rb +4 -2
  51. data/test-unit/test/test_assertions.rb +51 -5
  52. data/test-unit/test/ui/test_tap.rb +33 -0
  53. data/test-unit/test/util/test-output.rb +11 -0
  54. data/test/groonga-test-utils.rb +1 -0
  55. data/test/test-accessor.rb +32 -0
  56. data/test/test-context.rb +7 -1
  57. data/test/test-database-dumper.rb +156 -0
  58. data/test/test-index-column.rb +67 -1
  59. data/test/test-schema-dumper.rb +181 -0
  60. data/test/test-schema.rb +53 -97
  61. data/test/test-table-dumper.rb +83 -0
  62. metadata +48 -11
  63. data/ext/groonga/mkmf.log +0 -99
  64. data/test-unit/html/classic.html +0 -15
data/NEWS.ja.rdoc CHANGED
@@ -1,5 +1,23 @@
1
1
  = お知らせ
2
2
 
3
+ == 1.2.0: 2011-04-01
4
+
5
+ === 改良
6
+
7
+ * groonga 1.2.0対応。
8
+ * Groonga::Accessor#local_nameを追加。
9
+ * Groonga::IndexColumn#with_section?を追加。
10
+ * Groonga::IndexColumn#with_weight?を追加。
11
+ * Groonga::IndexColumn#with_position?を追加。
12
+ * Groonga::Schema.dumpがgroongaコマンド形式でのダンプに対応。
13
+ * grndumpを追加。
14
+ * Groonga::Database#eachで繰り返す順序を指定可能にした。
15
+ * Groonga::Context#match_escalation_thresholdを追加。
16
+ * Groonga::Context#match_escalation_threshold=を追加。
17
+ * エラーメッセージの改良。
18
+ * Groonga::Schemaの型指定で"ShortText"など正式型名だけではなく、
19
+ :short_textなどよりRubyらしい名前を使えるようにした。
20
+
3
21
  == 1.1.0: 2011-02-09
4
22
 
5
23
  === 改良
data/NEWS.rdoc CHANGED
@@ -1,5 +1,23 @@
1
1
  = NEWS
2
2
 
3
+ == 1.2.0: 2011-04-01
4
+
5
+ === Improvements
6
+
7
+ * Supported groonga 1.2.0.
8
+ * Added Groonga::Accessor#local_name.
9
+ * Added Groonga::IndexColumn#with_section?.
10
+ * Added Groonga::IndexColumn#with_weight?.
11
+ * Added Groonga::IndexColumn#with_position?.
12
+ * Groonga::Schema.dump supported groonga command format dump.
13
+ * Added grndump command.
14
+ * Groonga::Database#each supports order customize.
15
+ * Added Groonga::Context#match_escalation_threshold.
16
+ * Added Groonga::Context#match_escalation_threshold=.
17
+ * Improved error message.
18
+ * Supported Rubyish name like :short_text instead of the
19
+ official type name like "ShortText" in Groonga::Schema.
20
+
3
21
  == 1.1.0: 2011-02-09
4
22
 
5
23
  === Improvements
data/bin/grndump ADDED
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
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
+ require 'ostruct'
20
+ require 'optparse'
21
+ require 'pathname'
22
+
23
+ require 'groonga'
24
+
25
+ options = OpenStruct.new
26
+ options.tables = []
27
+ options.dump_schema = true
28
+ options.dump_tables = true
29
+ option_parser = OptionParser.new do |parser|
30
+ parser.banner += " DB_PATH"
31
+
32
+ parser.on("--no-dump-schema",
33
+ "don't dump schema.") do |boolean|
34
+ options.dump_schema = boolean
35
+ end
36
+
37
+ parser.on("--no-dump-tables",
38
+ "don't dump tables.") do |boolean|
39
+ options.dump_tables = boolean
40
+ end
41
+
42
+ parser.on("-t=TABLE", "--table=TABLE",
43
+ "dump only TABLE.",
44
+ "use this option multiple to dump multiple tables.",
45
+ "use /.../ as TABLE to match table name with regexp.") do |table|
46
+ case table
47
+ when /\A\/(.*)\/(i)?\z/
48
+ options.tables << Regexp.new($1, $2 == "i")
49
+ when
50
+ options.tables << table
51
+ end
52
+ end
53
+ end
54
+ args = option_parser.parse!(ARGV)
55
+
56
+ if args.size != 1
57
+ puts(option_parser)
58
+ exit(false)
59
+ end
60
+ db_path = args[0]
61
+
62
+ database = Groonga::Database.open(db_path)
63
+ dumper_options = {
64
+ :database => database,
65
+ :output => STDOUT,
66
+ :dump_schema => options.dump_schema,
67
+ :dump_tables => options.dump_tables,
68
+ :tables => options.tables,
69
+ }
70
+ database_dumper = Groonga::DatabaseDumper.new(dumper_options)
71
+ database_dumper.dump
@@ -18,7 +18,7 @@
18
18
 
19
19
  #include "rb-grn.h"
20
20
 
21
- #define SELF(object) (RVAL2GRNACCESSOR(object))
21
+ #define SELF(object) ((RbGrnAccessor *)DATA_PTR(object))
22
22
 
23
23
  VALUE rb_cGrnAccessor;
24
24
 
@@ -39,6 +39,66 @@ rb_grn_accessor_to_ruby_object (grn_ctx *context, grn_obj *table,
39
39
  return GRNOBJECT2RVAL(rb_cGrnAccessor, context, table, owner);
40
40
  }
41
41
 
42
+ void
43
+ rb_grn_accessor_bind (RbGrnAccessor *rb_accessor,
44
+ grn_ctx *context, grn_obj *accessor)
45
+ {
46
+ RbGrnObject *rb_grn_object;
47
+ RbGrnNamedObject *rb_grn_named_object;
48
+ char name[GRN_TABLE_MAX_KEY_SIZE];
49
+ int name_size;
50
+
51
+ rb_grn_object = RB_GRN_OBJECT(rb_accessor);
52
+ rb_grn_named_object = RB_GRN_NAMED_OBJECT(rb_accessor);
53
+ rb_grn_named_object_bind(rb_grn_named_object, context, accessor);
54
+
55
+ name_size = grn_column_name(context, accessor, name, sizeof(name));
56
+ if (name_size > 0) {
57
+ rb_grn_named_object_set_name(rb_grn_named_object, name, name_size);
58
+ }
59
+
60
+ rb_accessor->value = grn_obj_open(context, GRN_BULK, 0,
61
+ rb_grn_object->range_id);
62
+ }
63
+
64
+
65
+ void
66
+ rb_grn_accessor_finalizer (grn_ctx *context, grn_obj *grn_object,
67
+ RbGrnAccessor *rb_accessor)
68
+ {
69
+ rb_grn_named_object_finalizer(context, grn_object,
70
+ RB_GRN_NAMED_OBJECT(rb_accessor));
71
+ if (context && rb_accessor->value)
72
+ grn_obj_unlink(context, rb_accessor->value);
73
+ rb_accessor->value = NULL;
74
+ }
75
+
76
+ /*
77
+ * call-seq:
78
+ * accessor.local_name
79
+ *
80
+ * アクセサ名を返す。
81
+ *
82
+ * items = Groonga::Array.create(:name => "Items")
83
+ * id = items.column("_id")
84
+ * id.name # => nil
85
+ * id.local_name # => "_id"
86
+ */
87
+ static VALUE
88
+ rb_grn_accessor_get_local_name (VALUE self)
89
+ {
90
+ RbGrnAccessor *rb_grn_accessor;
91
+ RbGrnNamedObject *rb_grn_named_object;
92
+
93
+ rb_grn_accessor = SELF(self);
94
+ rb_grn_named_object = RB_GRN_NAMED_OBJECT(rb_grn_accessor);
95
+ if (rb_grn_named_object->name_size == 0)
96
+ return Qnil;
97
+
98
+ return rb_str_new(rb_grn_named_object->name,
99
+ rb_grn_named_object->name_size);
100
+ }
101
+
42
102
  /*
43
103
  * Document-class: Groonga::Accessor < Groonga::Object
44
104
  *
@@ -49,4 +109,7 @@ void
49
109
  rb_grn_init_accessor (VALUE mGrn)
50
110
  {
51
111
  rb_cGrnAccessor = rb_define_class_under(mGrn, "Accessor", rb_cGrnObject);
112
+
113
+ rb_define_method(rb_cGrnAccessor, "local_name",
114
+ rb_grn_accessor_get_local_name, 0);
52
115
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2010 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2010-2011 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
@@ -422,6 +422,41 @@ rb_grn_context_set_encoding (VALUE self, VALUE rb_encoding)
422
422
  return rb_encoding;
423
423
  }
424
424
 
425
+ /*
426
+ * call-seq:
427
+ * context.match_escalation_threshold -> Integer
428
+ *
429
+ * このコンテキストを使って検索したときに検索の挙動をエスカレー
430
+ * ションする閾値を返します。エスカレーションの詳細はgroonga
431
+ * の検索の仕様に関するドキュメントを参照してください。
432
+ * http://groonga.org/docs/spec/search.html#spec-search
433
+ */
434
+ static VALUE
435
+ rb_grn_context_get_match_escalation_threshold (VALUE self)
436
+ {
437
+ return LL2NUM(grn_ctx_get_match_escalation_threshold(SELF(self)));
438
+ }
439
+
440
+ /*
441
+ * call-seq:
442
+ * context.match_escalation_threshold=(match_escalation_threshold)
443
+ *
444
+ * このコンテキストを使って検索したときに検索の挙動をエスカレー
445
+ * ションする閾値を設定します。エスカレーションの詳細はgroonga
446
+ * の検索の仕様に関するドキュメントを参照してください。
447
+ * http://groonga.org/docs/spec/search.html#spec-search
448
+ */
449
+ static VALUE
450
+ rb_grn_context_set_match_escalation_threshold (VALUE self, VALUE threshold)
451
+ {
452
+ grn_ctx *context;
453
+
454
+ context = SELF(self);
455
+ grn_ctx_set_match_escalation_threshold(context, NUM2LL(threshold));
456
+
457
+ return threshold;
458
+ }
459
+
425
460
  /*
426
461
  * call-seq:
427
462
  * context.support_zlib?
@@ -732,6 +767,10 @@ rb_grn_init_context (VALUE mGrn)
732
767
 
733
768
  rb_define_method(cGrnContext, "encoding", rb_grn_context_get_encoding, 0);
734
769
  rb_define_method(cGrnContext, "encoding=", rb_grn_context_set_encoding, 1);
770
+ rb_define_method(cGrnContext, "match_escalation_threshold",
771
+ rb_grn_context_get_match_escalation_threshold, 0);
772
+ rb_define_method(cGrnContext, "match_escalation_threshold=",
773
+ rb_grn_context_set_match_escalation_threshold, 1);
735
774
 
736
775
  rb_define_method(cGrnContext, "support_zlib?",
737
776
  rb_grn_context_support_zlib_p, 0);
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2011 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
@@ -287,27 +287,69 @@ rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
287
287
  /*
288
288
  * call-seq:
289
289
  * database.each {|object| ...}
290
+ * database.each(options=nil) {|object| ...}
290
291
  *
291
292
  * データベース内のオブジェクトを順番にブロックに渡す。
292
293
  *
294
+ * _options_にはハッシュでオプションを指定する。指定できるオ
295
+ * プションは以下の通り。
296
+ *
297
+ * [+:order+]
298
+ * +:asc+または+:ascending+を指定すると昇順にレコードを取
299
+ * り出す。(デフォルト)
300
+ *
301
+ * +:desc+または+:descending+を指定すると降順にレコードを
302
+ * 取り出す。
303
+ *
304
+ * [+:order_by+]
305
+ * +:id+を指定するとID順にレコードを取り出す。
306
+ *
307
+ * +:key+指定するとキー順にレコードを取り出す。(デフォル
308
+ * ト)
309
+ *
293
310
  * すべてのオブジェクトの名前を表示する:
294
311
  * database.each do |object|
295
312
  * p object.name
296
313
  * end
314
+ *
315
+ * すべてのオブジェクトの名前をID順で表示する:
316
+ * database.each(:order_by => :id) do |object|
317
+ * p object.name
318
+ * end
319
+ *
320
+ * すべてのオブジェクトの名前をキー名の降順で表示する:
321
+ * database.each(:order_by => :key, :order => :desc) do |object|
322
+ * p object.name
323
+ * end
297
324
  */
298
325
  static VALUE
299
- rb_grn_database_each (VALUE self)
326
+ rb_grn_database_each (int argc, VALUE *argv, VALUE self)
300
327
  {
301
328
  grn_ctx *context = NULL;
302
329
  grn_obj *database;
303
330
  grn_table_cursor *cursor;
304
- VALUE rb_cursor;
331
+ VALUE rb_cursor, rb_options, rb_order, rb_order_by;
332
+ int flags = 0;
305
333
  grn_id id;
306
334
 
307
335
  rb_grn_database_deconstruct(SELF(self), &database, &context,
308
336
  NULL, NULL, NULL, NULL);
337
+
338
+ rb_scan_args(argc, argv, "01", &rb_options);
339
+
340
+ rb_grn_scan_options(rb_options,
341
+ "order", &rb_order,
342
+ "order_by", &rb_order_by,
343
+ NULL);
344
+
345
+ flags |= rb_grn_table_cursor_order_to_flag(rb_order);
346
+ flags |= rb_grn_table_cursor_order_by_to_flag(GRN_TABLE_PAT_KEY,
347
+ self,
348
+ rb_order_by);
349
+
309
350
  cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0,
310
- 0, -1, GRN_CURSOR_ASCENDING);
351
+ 0, -1,
352
+ flags);
311
353
  rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
312
354
  rb_iv_set(self, "cursor", rb_cursor);
313
355
  while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
@@ -480,7 +522,7 @@ rb_grn_init_database (VALUE mGrn)
480
522
  rb_grn_database_initialize, -1);
481
523
 
482
524
  rb_define_method(rb_cGrnDatabase, "each",
483
- rb_grn_database_each, 0);
525
+ rb_grn_database_each, -1);
484
526
 
485
527
  rb_define_method(rb_cGrnDatabase, "close",
486
528
  rb_grn_database_close, 0);
@@ -400,26 +400,26 @@ rb_grn_index_column_set_source (VALUE self, VALUE rb_source)
400
400
  *
401
401
  * 利用可能なオプションは以下の通り。
402
402
  *
403
- * [_:result_]
403
+ * [+:result+]
404
404
  * 結果を格納するGroonga::Hash。指定しない場合は新しく
405
405
  * Groonga::Hashを生成し、それに結果を格納して返す。
406
- * [_:operator_]
406
+ * [+:operator+]
407
407
  * 以下のどれかの値を指定する。+nil+, <tt>"or"</tt>, <tt>"||"</tt>,
408
408
  * <tt>"and"</tt>, <tt>"+"</tt>, <tt>"&&"</tt>, <tt>"but"</tt>,
409
409
  * <tt>"not"</tt>, <tt>"-"</tt>, <tt>"adjust"</tt>, <tt>">"</tt>。
410
410
  * それぞれ以下のようになる。(FIXME: 「以下」)
411
- * [_:exact_]
411
+ * [+:exact+]
412
412
  * +true+を指定すると完全一致で検索する
413
- * [_:longest_common_prefix_]
413
+ * [+:longest_common_prefix+]
414
414
  * +true+を指定すると_query_と同じ接頭辞をもつエントリのう
415
415
  * ち、もっとも長いエントリを検索する
416
- * [_:suffix_]
416
+ * [+:suffix+]
417
417
  * +true+を指定すると_query_が後方一致するエントリを検索す
418
418
  * る
419
- * [_:prefix_]
419
+ * [+:prefix+]
420
420
  * +true+を指定すると_query_が前方一致するレコードを検索す
421
421
  * る
422
- * [_:near_]
422
+ * [+:near+]
423
423
  * +true+を指定すると_query_に指定した複数の語が近傍に含ま
424
424
  * れるレコードを検索する
425
425
  * [...]
@@ -483,6 +483,69 @@ rb_grn_index_column_search (int argc, VALUE *argv, VALUE self)
483
483
  return rb_result;
484
484
  }
485
485
 
486
+ /*
487
+ * Document-method: with_section?
488
+ *
489
+ * call-seq:
490
+ * column.with_section? -> true/false
491
+ *
492
+ * _column_が段落情報も格納する場合は+true+を返します。
493
+ */
494
+ static VALUE
495
+ rb_grn_index_column_with_section_p (VALUE self)
496
+ {
497
+ grn_obj *column;
498
+
499
+ rb_grn_index_column_deconstruct(SELF(self), &column, NULL,
500
+ NULL, NULL,
501
+ NULL, NULL, NULL, NULL,
502
+ NULL, NULL);
503
+
504
+ return CBOOL2RVAL(column->header.flags & GRN_OBJ_WITH_SECTION);
505
+ }
506
+
507
+ /*
508
+ * Document-method: with_weight?
509
+ *
510
+ * call-seq:
511
+ * column.with_weight? -> true/false
512
+ *
513
+ * _column_がウェイト情報も格納する場合は+true+を返します。
514
+ */
515
+ static VALUE
516
+ rb_grn_index_column_with_weight_p (VALUE self)
517
+ {
518
+ grn_obj *column;
519
+
520
+ rb_grn_index_column_deconstruct(SELF(self), &column, NULL,
521
+ NULL, NULL,
522
+ NULL, NULL, NULL, NULL,
523
+ NULL, NULL);
524
+
525
+ return CBOOL2RVAL(column->header.flags & GRN_OBJ_WITH_WEIGHT);
526
+ }
527
+
528
+ /*
529
+ * Document-method: with_position?
530
+ *
531
+ * call-seq:
532
+ * column.with_position? -> true/false
533
+ *
534
+ * _column_が位置情報も格納する場合は+true+を返します。
535
+ */
536
+ static VALUE
537
+ rb_grn_index_column_with_position_p (VALUE self)
538
+ {
539
+ grn_obj *column;
540
+
541
+ rb_grn_index_column_deconstruct(SELF(self), &column, NULL,
542
+ NULL, NULL,
543
+ NULL, NULL, NULL, NULL,
544
+ NULL, NULL);
545
+
546
+ return CBOOL2RVAL(column->header.flags & GRN_OBJ_WITH_POSITION);
547
+ }
548
+
486
549
  void
487
550
  rb_grn_init_index_column (VALUE mGrn)
488
551
  {
@@ -501,4 +564,11 @@ rb_grn_init_index_column (VALUE mGrn)
501
564
 
502
565
  rb_define_method(rb_cGrnIndexColumn, "search",
503
566
  rb_grn_index_column_search, -1);
567
+
568
+ rb_define_method(rb_cGrnIndexColumn, "with_section?",
569
+ rb_grn_index_column_with_section_p, 0);
570
+ rb_define_method(rb_cGrnIndexColumn, "with_weight?",
571
+ rb_grn_index_column_with_weight_p, 0);
572
+ rb_define_method(rb_cGrnIndexColumn, "with_position?",
573
+ rb_grn_index_column_with_position_p, 0);
504
574
  }