rroonga 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2009 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
@@ -105,10 +105,76 @@ class IndexColumnTest < Test::Unit::TestCase
105
105
  assert_search(["l", "ll", "hello"], content_index, "l")
106
106
  end
107
107
 
108
+ def test_with_section?
109
+ define_index_column_with_flags
110
+ assert_equal({
111
+ :section => true,
112
+ :weight => false,
113
+ :position => false,
114
+ },
115
+ {
116
+ :section => context["Tags.section"].with_section?,
117
+ :weight => context["Tags.weight"].with_section?,
118
+ :position => context["Tags.position"].with_section?,
119
+ })
120
+ end
121
+
122
+ def test_with_weight?
123
+ define_index_column_with_flags
124
+ assert_equal({
125
+ :section => false,
126
+ :weight => true,
127
+ :position => false,
128
+ },
129
+ {
130
+ :section => context["Tags.section"].with_weight?,
131
+ :weight => context["Tags.weight"].with_weight?,
132
+ :position => context["Tags.position"].with_weight?,
133
+ })
134
+ end
135
+
136
+ def test_with_position?
137
+ define_index_column_with_flags
138
+ assert_equal({
139
+ :section => false,
140
+ :weight => false,
141
+ :position => true,
142
+ },
143
+ {
144
+ :section => context["Tags.section"].with_position?,
145
+ :weight => context["Tags.weight"].with_position?,
146
+ :position => context["Tags.position"].with_position?,
147
+ })
148
+ end
149
+
150
+ private
108
151
  def assert_search(expected, content_index, keyword)
109
152
  result = content_index.search(keyword).collect do |entry|
110
153
  entry.key["content"]
111
154
  end
112
155
  assert_equal(expected, result)
113
156
  end
157
+
158
+ def define_index_column_with_flags
159
+ Groonga::Schema.define do |schema|
160
+ schema.create_table("Articles") do |table|
161
+ table.text("tags", :type => :vector)
162
+ end
163
+
164
+ schema.create_table("Tags",
165
+ :type => :patricia_trie,
166
+ :key_type => "ShortText",
167
+ :default_tokenizer => "TokenDelimit") do |table|
168
+ table.index("Articles.tags",
169
+ :name => "section",
170
+ :with_section => true)
171
+ table.index("Articles.tags",
172
+ :name => "weight",
173
+ :with_weight => true)
174
+ table.index("Articles.tags",
175
+ :name => "position",
176
+ :with_position => true)
177
+ end
178
+ end
179
+ end
114
180
  end
@@ -0,0 +1,181 @@
1
+ # Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ class SchemaDumperTest < Test::Unit::TestCase
17
+ include GroongaTestUtils
18
+
19
+ setup :setup_database
20
+
21
+ private
22
+ def define_simple_schema
23
+ Groonga::Schema.define do |schema|
24
+ schema.create_table("Posts") do |table|
25
+ table.short_text :title
26
+ end
27
+ end
28
+ end
29
+
30
+ def define_reference_schema
31
+ Groonga::Schema.define do |schema|
32
+ schema.create_table("Items") do |table|
33
+ table.short_text("title")
34
+ end
35
+
36
+ schema.create_table("Users") do |table|
37
+ table.short_text("name")
38
+ end
39
+
40
+ schema.create_table("Comments") do |table|
41
+ table.reference("item", "Items")
42
+ table.reference("author", "Users")
43
+ table.text("content")
44
+ table.time("issued")
45
+ end
46
+ end
47
+ end
48
+
49
+ def define_index_schema
50
+ Groonga::Schema.define do |schema|
51
+ schema.create_table("Items",
52
+ :type => :patricia_trie,
53
+ :key_type => "ShortText") do |table|
54
+ table.short_text("title")
55
+ end
56
+
57
+ schema.create_table("Terms",
58
+ :type => :patricia_trie,
59
+ :key_type => "ShortText",
60
+ :key_normalize => true,
61
+ :default_tokenizer => "TokenBigram") do |table|
62
+ table.index("Items", "_key")
63
+ table.index("Items", "title")
64
+ end
65
+ end
66
+ end
67
+
68
+ class RubySyntaxSchemaDumperTest < SchemaDumperTest
69
+ def test_simple
70
+ define_simple_schema
71
+ assert_equal(<<-EOS, dump)
72
+ create_table("Posts",
73
+ :force => true) do |table|
74
+ table.short_text("title")
75
+ end
76
+ EOS
77
+ end
78
+
79
+ def test_reference
80
+ define_reference_schema
81
+ assert_equal(<<-EOS, dump)
82
+ create_table("Comments",
83
+ :force => true) do |table|
84
+ table.text("content")
85
+ table.time("issued")
86
+ end
87
+
88
+ create_table("Items",
89
+ :force => true) do |table|
90
+ table.short_text("title")
91
+ end
92
+
93
+ create_table("Users",
94
+ :force => true) do |table|
95
+ table.short_text("name")
96
+ end
97
+
98
+ change_table("Comments") do |table|
99
+ table.reference("author", "Users")
100
+ table.reference("item", "Items")
101
+ end
102
+ EOS
103
+ end
104
+
105
+ def test_index
106
+ define_index_schema
107
+ assert_equal(<<-EOS, dump)
108
+ create_table("Items",
109
+ :type => :patricia_trie,
110
+ :key_type => "ShortText",
111
+ :force => true) do |table|
112
+ table.short_text("title")
113
+ end
114
+
115
+ create_table("Terms",
116
+ :type => :patricia_trie,
117
+ :key_type => "ShortText",
118
+ :key_normalize => true,
119
+ :default_tokenizer => "TokenBigram",
120
+ :force => true) do |table|
121
+ end
122
+
123
+ change_table("Terms") do |table|
124
+ table.index("Items", "_key", :name => "Items__key")
125
+ table.index("Items", "title", :name => "Items_title")
126
+ end
127
+ EOS
128
+ end
129
+
130
+ private
131
+ def dump
132
+ Groonga::Schema.dump
133
+ end
134
+ end
135
+
136
+ class CommandSyntaxSchemaDumperTest < SchemaDumperTest
137
+ def test_simple
138
+ define_simple_schema
139
+ assert_equal(<<-EOS, dump)
140
+ table_create Posts TABLE_NO_KEY
141
+ column_create Posts title COLUMN_SCALAR ShortText
142
+ EOS
143
+ end
144
+
145
+ def test_reference
146
+ define_reference_schema
147
+ assert_equal(<<-EOS, dump)
148
+ table_create Comments TABLE_NO_KEY
149
+ column_create Comments content COLUMN_SCALAR Text
150
+ column_create Comments issued COLUMN_SCALAR Time
151
+
152
+ table_create Items TABLE_NO_KEY
153
+ column_create Items title COLUMN_SCALAR ShortText
154
+
155
+ table_create Users TABLE_NO_KEY
156
+ column_create Users name COLUMN_SCALAR ShortText
157
+
158
+ column_create Comments author COLUMN_SCALAR Users
159
+ column_create Comments item COLUMN_SCALAR Items
160
+ EOS
161
+ end
162
+
163
+ def test_index
164
+ define_index_schema
165
+ assert_equal(<<-EOS, dump)
166
+ table_create Items TABLE_PAT_KEY --key_type ShortText
167
+ column_create Items title COLUMN_SCALAR ShortText
168
+
169
+ table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
170
+
171
+ column_create Terms Items__key COLUMN_INDEX|WITH_POSITION Items _key
172
+ column_create Terms Items_title COLUMN_INDEX|WITH_POSITION Items title
173
+ EOS
174
+ end
175
+
176
+ private
177
+ def dump
178
+ Groonga::Schema.dump(:syntax => :command)
179
+ end
180
+ end
181
+ end
data/test/test-schema.rb CHANGED
@@ -25,6 +25,34 @@ class SchemaTest < Test::Unit::TestCase
25
25
  assert_nil(context["Posts"])
26
26
  end
27
27
 
28
+ def test_remove_not_existing_table
29
+ assert_raise(Groonga::Schema::TableNotExists) do
30
+ Groonga::Schema.remove_table("NotExistingTable")
31
+ end
32
+ end
33
+
34
+ def test_path_canonicalization
35
+ directory = @tmp_dir.to_s
36
+ table_filename = "hash.groonga"
37
+
38
+ canonical_path = directory + "/#{table_filename}"
39
+ uncanonical_path = directory + "/./#{table_filename}"
40
+
41
+ Groonga::Schema.create_table("Posts",
42
+ :type => :hash,
43
+ :key_type => "integer",
44
+ :path => canonical_path) do |table|
45
+ end
46
+
47
+ assert_nothing_raised do
48
+ Groonga::Schema.create_table("Posts",
49
+ :type => :hash,
50
+ :key_type => "integer",
51
+ :path => uncanonical_path) do |table|
52
+ end
53
+ end
54
+ end
55
+
28
56
  def test_define_hash
29
57
  Groonga::Schema.create_table("Posts", :type => :hash) do |table|
30
58
  end
@@ -419,103 +447,6 @@ class SchemaTest < Test::Unit::TestCase
419
447
  end
420
448
  end
421
449
 
422
- def test_dump
423
- Groonga::Schema.define do |schema|
424
- schema.create_table("Posts") do |table|
425
- table.short_text :title
426
- end
427
- end
428
- assert_equal(<<-EOS, Groonga::Schema.dump)
429
- create_table("Posts",
430
- :force => true) do |table|
431
- table.short_text("title")
432
- end
433
- EOS
434
- end
435
-
436
- def test_dump_reference
437
- Groonga::Schema.define do |schema|
438
- schema.create_table("Items") do |table|
439
- table.short_text("title")
440
- end
441
-
442
- schema.create_table("Users") do |table|
443
- table.short_text("name")
444
- end
445
-
446
- schema.create_table("Comments") do |table|
447
- table.reference("item", "Items")
448
- table.reference("author", "Users")
449
- table.text("content")
450
- table.time("issued")
451
- end
452
- end
453
-
454
- assert_equal(<<-EOS, Groonga::Schema.dump)
455
- create_table("Comments",
456
- :force => true) do |table|
457
- table.text("content")
458
- table.time("issued")
459
- end
460
-
461
- create_table("Items",
462
- :force => true) do |table|
463
- table.short_text("title")
464
- end
465
-
466
- create_table("Users",
467
- :force => true) do |table|
468
- table.short_text("name")
469
- end
470
-
471
- change_table("Comments") do |table|
472
- table.reference("author", "Users")
473
- table.reference("item", "Items")
474
- end
475
- EOS
476
- end
477
-
478
- def test_dump_index
479
- Groonga::Schema.define do |schema|
480
- schema.create_table("Items",
481
- :type => :patricia_trie,
482
- :key_type => "ShortText") do |table|
483
- table.short_text("title")
484
- end
485
-
486
- schema.create_table("Terms",
487
- :type => :patricia_trie,
488
- :key_type => "ShortText",
489
- :key_normalize => true,
490
- :default_tokenizer => "TokenBigram") do |table|
491
- table.index("Items", "_key")
492
- table.index("Items", "title")
493
- end
494
- end
495
-
496
- assert_equal(<<-EOS, Groonga::Schema.dump)
497
- create_table("Items",
498
- :type => :patricia_trie,
499
- :key_type => "ShortText",
500
- :force => true) do |table|
501
- table.short_text("title")
502
- end
503
-
504
- create_table("Terms",
505
- :type => :patricia_trie,
506
- :key_type => "ShortText",
507
- :key_normalize => true,
508
- :default_tokenizer => "TokenBigram",
509
- :force => true) do |table|
510
- end
511
-
512
- change_table("Terms") do |table|
513
- table.index("Items", "_key", :name => "Items__key")
514
- table.index("Items", "title", :name => "Items_title")
515
- end
516
- EOS
517
- end
518
-
519
450
  def test_explicit_context_create_table
520
451
  context = Groonga::Context.default
521
452
  Groonga::Context.default = nil
@@ -558,6 +489,31 @@ EOS
558
489
  assert_directory_not_removed(dir)
559
490
  end
560
491
 
492
+ def test_default_tokenizer_name_shortcut
493
+ Groonga::Schema.define do |schema|
494
+ schema.create_table("Terms",
495
+ :type => :patricia_trie,
496
+ :key_normalize => true,
497
+ :default_tokenizer => :bigram) do |table|
498
+ end
499
+ end
500
+
501
+ assert_equal(Groonga["TokenBigram"], Groonga["Terms"].default_tokenizer)
502
+ end
503
+
504
+ def test_duplicated_shortcut_name
505
+ short_text = Groonga::Type.new("short_text", :size => 1024)
506
+ Groonga::Schema.define do |schema|
507
+ schema.create_table("Users",
508
+ :type => :patricia_trie,
509
+ :key_normalize => true,
510
+ :key_type => :short_text) do |table|
511
+ end
512
+ end
513
+
514
+ assert_equal(short_text, Groonga["Users"].domain)
515
+ end
516
+
561
517
  private
562
518
  def columns_directory_path(table)
563
519
  "#{table.path}.columns"
@@ -0,0 +1,83 @@
1
+ # Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ class TableDumperTest < Test::Unit::TestCase
17
+ include GroongaTestUtils
18
+
19
+ setup :setup_database, :before => :append
20
+
21
+ def setup
22
+ setup_tables
23
+ end
24
+
25
+ def setup_tables
26
+ Groonga::Schema.define do |schema|
27
+ schema.create_table("Users",
28
+ :type => :hash,
29
+ :key_type => "ShortText") do |table|
30
+ table.text("name")
31
+ end
32
+
33
+ schema.create_table("Posts") do |table|
34
+ table.text("title")
35
+ table.reference("author", "Users")
36
+ table.integer("rank")
37
+ table.unsigned_integer("n_goods")
38
+ table.text("tags", :type => :vector)
39
+ table.boolean("published")
40
+ table.time("created_at")
41
+ end
42
+
43
+ schema.change_table("Users") do |table|
44
+ table.index("Posts.author")
45
+ end
46
+ end
47
+ end
48
+
49
+ def test_empty
50
+ assert_equal(<<-EOS, dump("Posts"))
51
+ load --table Posts
52
+ [
53
+ ["_id","author","created_at","n_goods","published","rank","tags","title"]
54
+ ]
55
+ EOS
56
+ end
57
+
58
+ def test_with_records
59
+ posts.add(:author => "mori",
60
+ :created_at => Time.parse("2010-03-08 16:52 JST"),
61
+ :n_goods => 4,
62
+ :published => true,
63
+ :rank => 10,
64
+ :tags => ["search", "mori"],
65
+ :title => "Why search engine find?")
66
+ assert_equal(<<-EOS, dump("Posts"))
67
+ load --table Posts
68
+ [
69
+ ["_id","author","created_at","n_goods","published","rank","tags","title"],
70
+ [1,"mori",1268034720.0,4,true,10,["search","mori"],"Why search engine find?"]
71
+ ]
72
+ EOS
73
+ end
74
+
75
+ private
76
+ def dump(table_name)
77
+ Groonga::TableDumper.new(context[table_name]).dump
78
+ end
79
+
80
+ def posts
81
+ context["Posts"]
82
+ end
83
+ end