groonga 0.0.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/NEWS.ja.rdoc +56 -0
  2. data/NEWS.rdoc +58 -0
  3. data/Rakefile +2 -3
  4. data/benchmark/read-write-many-small-items.rb +16 -32
  5. data/benchmark/write-many-small-items.rb +14 -28
  6. data/example/bookmark.rb +19 -17
  7. data/example/index-html.rb +11 -1
  8. data/example/search/config.ru +14 -9
  9. data/ext/rb-grn-array.c +6 -6
  10. data/ext/rb-grn-column.c +348 -18
  11. data/ext/rb-grn-context.c +8 -4
  12. data/ext/rb-grn-database.c +6 -7
  13. data/ext/rb-grn-exception.c +101 -5
  14. data/ext/rb-grn-expression.c +206 -23
  15. data/ext/rb-grn-fix-size-column.c +6 -39
  16. data/ext/rb-grn-hash.c +24 -24
  17. data/ext/rb-grn-index-column.c +74 -19
  18. data/ext/rb-grn-logger.c +48 -0
  19. data/ext/rb-grn-object.c +281 -67
  20. data/ext/rb-grn-operation.c +1 -1
  21. data/ext/rb-grn-patricia-trie-cursor.c +10 -1
  22. data/ext/rb-grn-patricia-trie.c +268 -7
  23. data/ext/rb-grn-query.c +52 -1
  24. data/ext/rb-grn-record.c +8 -2
  25. data/ext/rb-grn-snippet.c +63 -1
  26. data/ext/rb-grn-table-cursor-key-support.c +15 -1
  27. data/ext/rb-grn-table-cursor.c +57 -0
  28. data/ext/rb-grn-table-key-support.c +382 -46
  29. data/ext/rb-grn-table.c +729 -192
  30. data/ext/rb-grn-type.c +63 -12
  31. data/ext/rb-grn-utils.c +156 -158
  32. data/ext/rb-grn-variable.c +18 -0
  33. data/ext/rb-grn.h +85 -21
  34. data/ext/rb-groonga.c +13 -3
  35. data/extconf.rb +19 -4
  36. data/html/developer.html +1 -1
  37. data/html/header.html.erb +1 -1
  38. data/html/index.html +4 -4
  39. data/lib/groonga.rb +10 -0
  40. data/lib/groonga/expression-builder.rb +81 -42
  41. data/lib/groonga/patricia-trie.rb +13 -0
  42. data/lib/groonga/record.rb +158 -13
  43. data/lib/groonga/schema.rb +339 -33
  44. data/pkg-config.rb +6 -1
  45. data/test-unit/lib/test/unit.rb +23 -42
  46. data/test-unit/lib/test/unit/assertionfailederror.rb +11 -0
  47. data/test-unit/lib/test/unit/assertions.rb +87 -9
  48. data/test-unit/lib/test/unit/autorunner.rb +20 -11
  49. data/test-unit/lib/test/unit/collector.rb +1 -8
  50. data/test-unit/lib/test/unit/collector/load.rb +2 -3
  51. data/test-unit/lib/test/unit/color-scheme.rb +13 -1
  52. data/test-unit/lib/test/unit/diff.rb +223 -37
  53. data/test-unit/lib/test/unit/error.rb +4 -0
  54. data/test-unit/lib/test/unit/failure.rb +31 -5
  55. data/test-unit/lib/test/unit/notification.rb +8 -4
  56. data/test-unit/lib/test/unit/omission.rb +51 -3
  57. data/test-unit/lib/test/unit/pending.rb +4 -0
  58. data/test-unit/lib/test/unit/testcase.rb +55 -4
  59. data/test-unit/lib/test/unit/ui/console/testrunner.rb +190 -4
  60. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +14 -0
  61. data/test-unit/lib/test/unit/ui/testrunner.rb +8 -0
  62. data/test-unit/lib/test/unit/version.rb +1 -1
  63. data/test-unit/sample/{tc_adder.rb → test_adder.rb} +3 -1
  64. data/test-unit/sample/{tc_subtracter.rb → test_subtracter.rb} +3 -1
  65. data/test-unit/sample/test_user.rb +1 -0
  66. data/test-unit/test/collector/test-descendant.rb +2 -4
  67. data/test-unit/test/collector/test_objectspace.rb +7 -5
  68. data/test-unit/test/run-test.rb +2 -0
  69. data/test-unit/test/test-color-scheme.rb +7 -0
  70. data/test-unit/test/test-diff.rb +48 -7
  71. data/test-unit/test/test-omission.rb +1 -1
  72. data/test-unit/test/test-testcase.rb +47 -0
  73. data/test-unit/test/test_assertions.rb +79 -10
  74. data/test/groonga-test-utils.rb +6 -1
  75. data/test/test-array.rb +29 -14
  76. data/test/test-column.rb +107 -55
  77. data/test/test-context.rb +5 -0
  78. data/test/test-database.rb +2 -37
  79. data/test/test-exception.rb +9 -1
  80. data/test/test-expression-builder.rb +23 -5
  81. data/test/test-expression.rb +44 -8
  82. data/test/test-fix-size-column.rb +16 -5
  83. data/test/test-gqtp.rb +70 -0
  84. data/test/test-hash.rb +142 -43
  85. data/test/test-index-column.rb +9 -9
  86. data/test/test-patricia-trie.rb +79 -20
  87. data/test/test-procedure.rb +4 -2
  88. data/test/test-record.rb +32 -20
  89. data/test/test-remote.rb +3 -2
  90. data/test/test-schema.rb +226 -92
  91. data/test/test-table-cursor.rb +103 -1
  92. data/test/test-table-offset-and-limit.rb +102 -0
  93. data/test/test-table-select-normalize.rb +4 -4
  94. data/test/test-table-select.rb +52 -8
  95. data/test/test-table.rb +235 -116
  96. data/test/test-type.rb +2 -2
  97. data/test/test-variable-size-column.rb +21 -5
  98. data/test/test-vector-column.rb +76 -0
  99. data/{TUTORIAL.ja.rdoc → text/TUTORIAL.ja.rdoc} +52 -52
  100. data/text/expression.rdoc +284 -0
  101. metadata +11 -7
  102. data/test-unit/sample/ts_examples.rb +0 -7
@@ -20,7 +20,7 @@ class TableCursorTest < Test::Unit::TestCase
20
20
  setup_database
21
21
 
22
22
  @bookmarks_path = @tables_dir + "table"
23
- @bookmarks = Groonga::PatriciaTrie.create(:name => "bookmarks",
23
+ @bookmarks = Groonga::PatriciaTrie.create(:name => "Bookmarks",
24
24
  :path => @bookmarks_path.to_s)
25
25
  @groonga_bookmark = @bookmarks.add("groonga")
26
26
  @cutter_bookmark = @bookmarks.add("Cutter")
@@ -48,4 +48,106 @@ class TableCursorTest < Test::Unit::TestCase
48
48
  [@groonga_bookmark, "groonga"]],
49
49
  record_and_key_list)
50
50
  end
51
+
52
+ def test_without_limit_and_offset
53
+ users = create_users
54
+ add_users(users)
55
+ results = []
56
+ users.open_cursor do |cursor|
57
+ cursor.each do |record|
58
+ results << record["name"]
59
+ end
60
+ end
61
+
62
+ assert_equal((100..199).collect {|i| "user#{i}"},
63
+ results)
64
+ end
65
+
66
+ def test_with_limit
67
+ users = create_users
68
+ add_users(users)
69
+ results = []
70
+ users.open_cursor(:limit => 20) do |cursor|
71
+ cursor.each do |record|
72
+ results << record["name"]
73
+ end
74
+ end
75
+
76
+ assert_equal((100...120).collect {|i| "user#{i}"},
77
+ results)
78
+ end
79
+
80
+ def test_with_offset
81
+ users = create_users
82
+ add_users(users)
83
+ results = []
84
+ users.open_cursor(:offset => 20) do |cursor|
85
+ cursor.each do |record|
86
+ results << record["name"]
87
+ end
88
+ end
89
+
90
+ assert_equal((120...200).collect {|i| "user#{i}"},
91
+ results)
92
+ end
93
+
94
+ def test_with_limit_and_offset
95
+ users = create_users
96
+ add_users(users)
97
+ results = []
98
+ users.open_cursor(:limit => 20, :offset => 20) do |cursor|
99
+ cursor.each do |record|
100
+ results << record["name"]
101
+ end
102
+ end
103
+
104
+ assert_equal((120...140).collect {|i| "user#{i}"},
105
+ results)
106
+ end
107
+
108
+ def test_delete
109
+ users = create_users
110
+ add_users(users)
111
+
112
+ users.open_cursor(:limit => 20) do |cursor|
113
+ 20.times do
114
+ cursor.next
115
+ cursor.delete
116
+ end
117
+ end
118
+
119
+ results = []
120
+ users.open_cursor do |cursor|
121
+ cursor.each do |record|
122
+ results << record["name"]
123
+ end
124
+ end
125
+
126
+ assert_equal((120...200).collect {|i| "user#{i}"},
127
+ results)
128
+ end
129
+
130
+ def test_patricia_trie_cursor_key
131
+ sites = Groonga::PatriciaTrie.create(:name => "Sites")
132
+ sites.add("http://groonga.org/")
133
+ sites.open_cursor do |cursor|
134
+ cursor.next
135
+ assert_equal("http://groonga.org/", cursor.key)
136
+ end
137
+ end
138
+
139
+ private
140
+ def create_users
141
+ users = Groonga::Array.create(:name => "Users")
142
+ users.define_column("name", "ShortText")
143
+ users
144
+ end
145
+
146
+ def add_users(users)
147
+ (0...100).to_a.each do |i|
148
+ user = users.add
149
+ user["name"] = "user#{i + 100}"
150
+ end
151
+ users
152
+ end
51
153
  end
@@ -0,0 +1,102 @@
1
+ # Copyright (C) 2009 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
+ module TestOffsetAndLimitSupport
17
+ def test_zero_and_positive_offset
18
+ assert_equal(((100 + 0)...200).to_a, ids(:offset => 0))
19
+ assert_equal(((100 + 32)...200).to_a, ids(:offset => 32))
20
+ assert_equal(((100 + 99)...200).to_a, ids(:offset => 99))
21
+ assert_raise(Groonga::InvalidArgument) do
22
+ ids(:offset => 100)
23
+ end
24
+ end
25
+
26
+ def test_negative_offset
27
+ assert_equal(((200 - 1)...200).to_a, ids(:offset => -1))
28
+ assert_equal(((200 - 32)...200).to_a, ids(:offset => -32))
29
+ assert_equal(((200 - 100)...200).to_a, ids(:offset => -100))
30
+ assert_raise(Groonga::InvalidArgument) do
31
+ ids(:offset => -101)
32
+ end
33
+ end
34
+
35
+ def test_zero_and_positive_limit
36
+ all_ids = (100...200).to_a
37
+ assert_equal(all_ids[0, 0], ids(:limit => 0))
38
+ assert_equal(all_ids[0, 32], ids(:limit => 32))
39
+ assert_equal(all_ids[0, 100], ids(:limit => 100))
40
+ assert_nothing_raised do
41
+ ids(:limit => 101)
42
+ end
43
+ end
44
+
45
+ def test_negative_limit
46
+ all_ids = (100...200).to_a
47
+ assert_equal(all_ids[0..-1], ids(:limit => -1))
48
+ assert_equal(all_ids[0..-32], ids(:limit => -32))
49
+ assert_equal(all_ids[0..-100], ids(:limit => -100))
50
+ assert_raise(Groonga::InvalidArgument) do
51
+ ids(:offset => -101)
52
+ end
53
+ end
54
+
55
+ private
56
+ def create_bookmarks
57
+ @bookmarks = Groonga::Array.create(:name => "Bookmarks")
58
+ @bookmarks.define_column("id", "Int32")
59
+ @bookmarks
60
+ end
61
+
62
+ def add_ids
63
+ 100.times do |i|
64
+ bookmark = @bookmarks.add
65
+ bookmark["id"] = i + 100
66
+ end
67
+ @bookmarks
68
+ end
69
+ end
70
+
71
+ class TestOffsetAndLimit < Test::Unit::TestCase
72
+ include GroongaTestUtils
73
+ def setup
74
+ setup_database
75
+ @bookmarks = create_bookmarks
76
+ add_ids
77
+ end
78
+ end
79
+
80
+ class TestTableCursorOffsetAndLimit < TestOffsetAndLimit
81
+ include TestOffsetAndLimitSupport
82
+
83
+ private
84
+ def ids(options={})
85
+ @bookmarks.open_cursor(options) do |cursor|
86
+ cursor.collect do |record|
87
+ record["id"]
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ class TestTableSortOffsetAndLimit < TestOffsetAndLimit
94
+ include TestOffsetAndLimitSupport
95
+
96
+ private
97
+ def ids(options={})
98
+ @bookmarks.sort([:key => "id", :order => :asc], options).collect do |record|
99
+ record["id"]
100
+ end
101
+ end
102
+ end
@@ -15,22 +15,22 @@
15
15
  # License along with this library; if not, write to the Free Software
16
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
 
18
- class TableTestSelectNormalize < Test::Unit::TestCase
18
+ class TableSelectNormalizeTest < Test::Unit::TestCase
19
19
  include GroongaTestUtils
20
20
 
21
21
  setup :setup_database
22
22
 
23
23
  setup
24
24
  def setup_comments
25
- @comments = Groonga::Array.create(:name => "comments")
25
+ @comments = Groonga::Array.create(:name => "Comments")
26
26
  @comments.define_column("content", "Text")
27
27
  @comments.define_column("created_at", "Time")
28
- terms = Groonga::PatriciaTrie.create(:name => "terms",
28
+ terms = Groonga::PatriciaTrie.create(:name => "Terms",
29
29
  :default_tokenizer => "TokenBigram",
30
30
  :key_normalize => true)
31
31
  terms.define_index_column("comment_content", @comments,
32
32
  :with_section => true,
33
- :source => "comments.content")
33
+ :source => "Comments.content")
34
34
  @japanese_comment =
35
35
  @comments.add(:content => "うちのボロTVはまだ現役です",
36
36
  :created_at => Time.parse("2009-06-09"))
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
4
  #
4
5
  # This library is free software; you can redistribute it and/or
5
6
  # modify it under the terms of the GNU Lesser General Public
@@ -14,30 +15,37 @@
14
15
  # License along with this library; if not, write to the Free Software
15
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
17
 
17
- class TableTestSelect < Test::Unit::TestCase
18
+ class TableSelectTest < Test::Unit::TestCase
18
19
  include GroongaTestUtils
19
20
 
20
21
  setup :setup_database
21
22
 
22
23
  setup
23
24
  def setup_comments
24
- @comments = Groonga::Array.create(:name => "comments")
25
+ @users = Groonga::Hash.create(:name => "Users", :key_type => "ShortText")
26
+
27
+ @comments = Groonga::Array.create(:name => "Comments")
25
28
  @comments.define_column("content", "Text")
26
29
  @comments.define_column("created_at", "Time")
27
- terms = Groonga::PatriciaTrie.create(:name => "terms",
30
+ @comments.define_column("user", "Users")
31
+
32
+ terms = Groonga::PatriciaTrie.create(:name => "Terms",
28
33
  :default_tokenizer => "TokenBigram")
29
34
  terms.define_index_column("comment_content", @comments,
30
35
  :with_section => true,
31
- :source => "comments.content")
36
+ :source => "content")
32
37
  @comment1 = @comments.add(:content => "Hello Good-bye!",
33
- :created_at => Time.parse("2009-08-09"))
38
+ :created_at => Time.parse("2009-08-09"),
39
+ :user => "morita")
34
40
  @comment2 = @comments.add(:content => "Hello World",
35
41
  :created_at => Time.parse("2009-07-09"))
36
42
  @comment3 = @comments.add(:content => "test",
37
- :created_at => Time.parse("2009-06-09"))
43
+ :created_at => Time.parse("2009-06-09"),
44
+ :user => "gunyara-kun")
38
45
  @japanese_comment =
39
46
  @comments.add(:content => "うちのボロTVはまだ現役です",
40
- :created_at => Time.parse("2009-06-09"))
47
+ :created_at => Time.parse("2009-06-09"),
48
+ :user => "darashi")
41
49
  end
42
50
 
43
51
  def test_select_sub_expression
@@ -53,6 +61,22 @@ class TableTestSelect < Test::Unit::TestCase
53
61
  assert_equal_select_result([@comment1, @comment2], result)
54
62
  end
55
63
 
64
+ def test_select_query_with_parser
65
+ result = @comments.select("content @ \"Hello\"", :syntax => :script)
66
+ assert_equal_select_result([@comment1, @comment2], result)
67
+ end
68
+
69
+ def test_select_expression
70
+ expression = Groonga::Expression.new
71
+ variable = expression.define_variable(:domain => @comments)
72
+ expression.append_object(variable)
73
+ expression.parse("content:%Hello", :syntax => :query)
74
+ expression.compile
75
+ result = @comments.select(expression)
76
+ assert_equal(expression, result.expression)
77
+ assert_equal_select_result([@comment1, @comment2], result)
78
+ end
79
+
56
80
  def test_select_query_with_block
57
81
  result = @comments.select("content:%Hello") do |record|
58
82
  record["created_at"] < Time.parse("2009-08-01")
@@ -98,4 +122,24 @@ class TableTestSelect < Test::Unit::TestCase
98
122
  end
99
123
  assert_equal_select_result([], result)
100
124
  end
125
+
126
+ def test_select_equal_reference_column_by_key
127
+ result = @comments.select do |record|
128
+ record["user"] == "darashi"
129
+ end
130
+ assert_equal_select_result([@japanese_comment], result)
131
+ end
132
+
133
+ def test_select_not_equal_reference_column_by_key
134
+ result = @comments.select('user != "darashi"', :syntax => :script)
135
+ assert_equal_select_result([@comment1, @comment2, @comment3],
136
+ result)
137
+ end
138
+
139
+ def test_select_equal_reference_column_by_nonexistent_key
140
+ result = @comments.select do |record|
141
+ record["user"] == "nonexistent"
142
+ end
143
+ assert_equal_select_result([], result)
144
+ end
101
145
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -19,31 +19,33 @@ class TableTest < Test::Unit::TestCase
19
19
  setup :setup_database
20
20
 
21
21
  def test_create
22
- table_path = @tables_dir + "table"
22
+ table_path = @tables_dir + "bookmarks"
23
23
  assert_not_predicate(table_path, :exist?)
24
- table = Groonga::PatriciaTrie.create(:name => "bookmarks",
24
+ table = Groonga::PatriciaTrie.create(:name => "Bookmarks",
25
25
  :path => table_path.to_s)
26
- assert_equal("bookmarks", table.name)
26
+ assert_equal("Bookmarks", table.name)
27
27
  assert_predicate(table_path, :exist?)
28
28
  end
29
29
 
30
30
  def test_temporary
31
31
  table = Groonga::PatriciaTrie.create
32
32
  assert_nil(table.name)
33
+ assert_predicate(table, :temporary?)
34
+ assert_not_predicate(table, :persistent?)
33
35
  assert_equal([], @tables_dir.children)
34
36
  end
35
37
 
36
38
  def test_open
37
- table_path = @tables_dir + "table"
38
- table = Groonga::Hash.create(:name => "bookmarks",
39
+ table_path = @tables_dir + "bookmarks"
40
+ table = Groonga::Hash.create(:name => "Bookmarks",
39
41
  :path => table_path.to_s)
40
- assert_equal("bookmarks", table.name)
42
+ assert_equal("Bookmarks", table.name)
41
43
 
42
44
  called = false
43
- Groonga::Table.open(:name => "bookmarks") do |_table|
45
+ Groonga::Table.open(:name => "Bookmarks") do |_table|
44
46
  table = _table
45
47
  assert_not_predicate(table, :closed?)
46
- assert_equal("bookmarks", _table.name)
48
+ assert_equal("Bookmarks", _table.name)
47
49
  called = true
48
50
  end
49
51
  assert_true(called)
@@ -51,10 +53,10 @@ class TableTest < Test::Unit::TestCase
51
53
  end
52
54
 
53
55
  def test_open_by_path
54
- table_path = @tables_dir + "table"
55
- table = Groonga::PatriciaTrie.create(:name => "bookmarks",
56
+ table_path = @tables_dir + "bookmarks"
57
+ table = Groonga::PatriciaTrie.create(:name => "Bookmarks",
56
58
  :path => table_path.to_s)
57
- assert_equal("bookmarks", table.name)
59
+ assert_equal("Bookmarks", table.name)
58
60
  table.close
59
61
 
60
62
  called = false
@@ -69,17 +71,17 @@ class TableTest < Test::Unit::TestCase
69
71
  end
70
72
 
71
73
  def test_open_override_name
72
- table_path = @tables_dir + "table"
73
- table = Groonga::PatriciaTrie.create(:name => "bookmarks",
74
+ table_path = @tables_dir + "bookmarks"
75
+ table = Groonga::PatriciaTrie.create(:name => "Bookmarks",
74
76
  :path => table_path.to_s)
75
- assert_equal("bookmarks", table.name)
77
+ assert_equal("Bookmarks", table.name)
76
78
  table.close
77
79
 
78
80
  called = false
79
- Groonga::Table.open(:name => "no-name", :path => table_path.to_s) do |_table|
81
+ Groonga::Table.open(:name => "Marks", :path => table_path.to_s) do |_table|
80
82
  table = _table
81
83
  assert_not_predicate(table, :closed?)
82
- assert_equal("no-name", _table.name)
84
+ assert_equal("Marks", _table.name)
83
85
  called = true
84
86
  end
85
87
  assert_true(called)
@@ -87,19 +89,19 @@ class TableTest < Test::Unit::TestCase
87
89
  end
88
90
 
89
91
  def test_open_wrong_table
90
- table_path = @tables_dir + "table"
91
- Groonga::Hash.create(:name => "bookmarks",
92
+ table_path = @tables_dir + "bookmarks"
93
+ Groonga::Hash.create(:name => "Bookmarks",
92
94
  :path => table_path.to_s) do
93
95
  end
94
96
 
95
97
  assert_raise(TypeError) do
96
- Groonga::PatriciaTrie.open(:name => "bookmarks",
98
+ Groonga::PatriciaTrie.open(:name => "Bookmarks",
97
99
  :path => table_path.to_s)
98
100
  end
99
101
  end
100
102
 
101
103
  def test_new
102
- table_path = @tables_dir + "table"
104
+ table_path = @tables_dir + "no-name"
103
105
  assert_raise(Groonga::NoSuchFileOrDirectory) do
104
106
  Groonga::Hash.new(:path => table_path.to_s)
105
107
  end
@@ -109,42 +111,108 @@ class TableTest < Test::Unit::TestCase
109
111
  end
110
112
 
111
113
  def test_define_column
112
- table_path = @tables_dir + "table"
113
- table = Groonga::Hash.create(:name => "bookmarks",
114
+ table_path = @tables_dir + "bookmarks"
115
+ table = Groonga::Hash.create(:name => "Bookmarks",
114
116
  :path => table_path.to_s)
115
- column = table.define_column("name", "<text>")
116
- assert_equal("bookmarks.name", column.name)
117
+ column = table.define_column("name", "Text")
118
+ assert_equal("Bookmarks.name", column.name)
117
119
  assert_equal(column, table.column("name"))
118
120
  end
119
121
 
122
+ def test_temporary_table_define_column_default_persistent
123
+ table = Groonga::Hash.create
124
+ name = table.define_column("name", "ShortText")
125
+ assert_predicate(name, :temporary?)
126
+ end
127
+
128
+ def test_temporary_table_define_index_column_default_persistent
129
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
130
+ terms = Groonga::Hash.create
131
+ url = terms.define_index_column("url", bookmarks)
132
+ assert_predicate(url, :temporary?)
133
+ end
134
+
135
+ def test_define_column_default_persistent
136
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
137
+ real_name = bookmarks.define_column("real_name", "ShortText")
138
+ assert_predicate(real_name, :persistent?)
139
+ end
140
+
141
+ def test_define_column_not_persistent
142
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
143
+ real_name = bookmarks.define_column("real_name", "ShortText",
144
+ :persistent => false)
145
+ assert_predicate(real_name, :temporary?)
146
+ end
147
+
148
+ def test_define_column_not_persistent_and_path
149
+ column_path = @tables_dir + "bookmakrs.real_name.column"
150
+
151
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
152
+ message = "should not pass :path if :persistent is false: <#{column_path}>"
153
+ assert_raise(ArgumentError.new(message)) do
154
+ real_name = bookmarks.define_column("real_name", "ShortText",
155
+ :path => column_path.to_s,
156
+ :persistent => false)
157
+ end
158
+ end
159
+
160
+ def test_define_index_column_default_persistent
161
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
162
+ terms = Groonga::Hash.create(:name => "Terms")
163
+ real_name = terms.define_index_column("real_name", bookmarks)
164
+ assert_predicate(real_name, :persistent?)
165
+ end
166
+
167
+ def test_define_index_column_not_persistent
168
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
169
+ terms = Groonga::Hash.create(:name => "Terms")
170
+ real_name = terms.define_index_column("real_name", bookmarks,
171
+ :persistent => false)
172
+ assert_predicate(real_name, :temporary?)
173
+ end
174
+
175
+ def test_define_index_column_not_persistent_and_path
176
+ column_path = @tables_dir + "bookmakrs.real_name.column"
177
+
178
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
179
+ terms = Groonga::Hash.create(:name => "Terms")
180
+ message = "should not pass :path if :persistent is false: <#{column_path}>"
181
+ assert_raise(ArgumentError.new(message)) do
182
+ real_name = terms.define_index_column("real_name", bookmarks,
183
+ :path => column_path.to_s,
184
+ :persistent => false)
185
+ end
186
+ end
187
+
120
188
  def test_define_index_column
121
- bookmarks = Groonga::Hash.create(:name => "<bookmarks>")
122
- bookmarks.define_column("content", "<text>")
123
- terms = Groonga::Hash.create(:name => "<terms>")
124
- terms.default_tokenizer = "<token:bigram>"
189
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
190
+ bookmarks.define_column("content", "Text")
191
+ terms = Groonga::Hash.create(:name => "Terms")
192
+ terms.default_tokenizer = "TokenBigram"
125
193
  index = terms.define_index_column("content-index", bookmarks,
126
194
  :with_section => true,
127
- :source => "<bookmarks>.content")
195
+ :source => "Bookmarks.content")
128
196
  bookmarks.add("google", :content => "Search engine")
129
197
  assert_equal(["google"],
130
198
  index.search("engine").collect {|record| record.key.key})
131
199
  end
132
200
 
133
201
  def test_add_column
134
- bookmarks = Groonga::Hash.create(:name => "bookmarks",
202
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
135
203
  :path => (@tables_dir + "bookmarks").to_s)
136
204
 
137
205
  description_column_path = @columns_dir + "description"
138
206
  bookmarks_description =
139
- bookmarks.define_index_column("description", "<text>",
207
+ bookmarks.define_index_column("description", "Text",
140
208
  :path => description_column_path.to_s)
141
209
 
142
- books = Groonga::Hash.create(:name => "books",
210
+ books = Groonga::Hash.create(:name => "Books",
143
211
  :path => (@tables_dir + "books").to_s)
144
212
  books_description = books.add_column("description",
145
- "<longtext>",
213
+ "LongText",
146
214
  description_column_path.to_s)
147
- assert_equal("books.description", books_description.name)
215
+ assert_equal("Books.description", books_description.name)
148
216
  assert_equal(books_description, books.column("description"))
149
217
 
150
218
  assert_equal(bookmarks_description, bookmarks.column("description"))
@@ -152,51 +220,46 @@ class TableTest < Test::Unit::TestCase
152
220
 
153
221
  def test_column_nonexistent
154
222
  table_path = @tables_dir + "bookmarks"
155
- table = Groonga::Hash.create(:name => "bookmarks",
223
+ table = Groonga::Hash.create(:name => "Bookmarks",
156
224
  :path => table_path.to_s)
157
225
  assert_nil(table.column("nonexistent"))
158
226
  end
159
227
 
160
228
  def test_set_value
161
- value_type = Groonga::Type.new("Text512", :size => 512)
162
229
  table_path = @tables_dir + "bookmarks"
163
- bookmarks = Groonga::Hash.create(:name => "bookmarks",
164
- :value_type => value_type,
230
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
231
+ :value_type => "Int32",
165
232
  :path => table_path.to_s)
166
233
  comment_column_path = @columns_dir + "comment"
167
234
  bookmarks_comment =
168
- bookmarks.define_column("comment", "<shorttext>",
235
+ bookmarks.define_column("comment", "ShortText",
169
236
  :type => "scalar",
170
237
  :path => comment_column_path.to_s)
171
238
  groonga = bookmarks.add("groonga")
172
- url = "http://groonga.org/"
173
- groonga.value = url
239
+ groonga.value = 29
174
240
  bookmarks_comment[groonga.id] = "fulltext search engine"
175
241
 
176
- assert_equal([url, "fulltext search engine"],
177
- [groonga.value[0, url.length],
178
- bookmarks_comment[groonga.id]])
242
+ assert_equal([29, "fulltext search engine"],
243
+ [groonga.value, bookmarks_comment[groonga.id]])
179
244
  end
180
245
 
181
246
  def test_array_set
182
- value_type = Groonga::Type.new("Text512", :size => 512)
183
- bookmarks = Groonga::Hash.create(:name => "bookmarks",
184
- :value_type => value_type)
185
- url = "http://groonga.org/"
186
- bookmarks["groonga"] = "#{url}\0"
247
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
248
+ :value_type => "Int32")
249
+ bookmarks.set_value("groonga", 29)
187
250
 
188
251
  values = bookmarks.records.collect do |record|
189
- record.value.split(/\0/, 2)[0]
252
+ record.value
190
253
  end
191
- assert_equal([url], values)
254
+ assert_equal([29], values)
192
255
  end
193
256
 
194
257
  def test_add_without_name
195
258
  users_path = @tables_dir + "users"
196
- users = Groonga::Array.create(:name => "users",
259
+ users = Groonga::Array.create(:name => "Users",
197
260
  :path => users_path.to_s)
198
261
  name_column_path = @columns_dir + "name"
199
- users_name = users.define_column("name", "<shorttext>",
262
+ users_name = users.define_column("name", "ShortText",
200
263
  :path => name_column_path.to_s)
201
264
  morita = users.add
202
265
  users_name[morita.id] = "morita"
@@ -205,37 +268,34 @@ class TableTest < Test::Unit::TestCase
205
268
 
206
269
  def test_add_by_id
207
270
  users_path = @tables_dir + "users"
208
- users = Groonga::Hash.create(:name => "users",
271
+ users = Groonga::Hash.create(:name => "Users",
209
272
  :path => users_path.to_s)
210
273
 
211
- value_type = Groonga::Type.new("Text512", :size => 512)
212
274
  bookmarks_path = @tables_dir + "bookmarks"
213
- bookmarks = Groonga::Hash.create(:name => "bookmarks",
275
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks",
214
276
  :key_type => users,
215
- :value_type => value_type,
277
+ :value_type => "Int32",
216
278
  :path => bookmarks_path.to_s)
217
279
  morita = users.add("morita")
218
280
  groonga = bookmarks.add(morita.id)
219
- url = "http://groonga.org/"
220
- groonga.value = url
221
-
222
- assert_equal(url, groonga.value[0, url.length])
281
+ groonga.value = 29
282
+ assert_equal(29, groonga.value)
223
283
  end
224
284
 
225
285
  def test_columns
226
286
  bookmarks_path = @tables_dir + "bookmarks"
227
- bookmarks = Groonga::Array.create(:name => "bookmarks",
287
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
228
288
  :path => bookmarks_path.to_s)
229
289
 
230
- uri_column = bookmarks.define_column("uri", "<shorttext>")
231
- comment_column = bookmarks.define_column("comment", "<text>")
290
+ uri_column = bookmarks.define_column("uri", "ShortText")
291
+ comment_column = bookmarks.define_column("comment", "Text")
232
292
  assert_equal([uri_column.name, comment_column.name].sort,
233
293
  bookmarks.columns.collect {|column| column.name}.sort)
234
294
  end
235
295
 
236
296
  def test_column_by_symbol
237
297
  bookmarks_path = @tables_dir + "bookmarks"
238
- bookmarks = Groonga::Array.create(:name => "bookmarks",
298
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
239
299
  :path => bookmarks_path.to_s)
240
300
 
241
301
  uri_column = bookmarks.define_column("uri", "Text")
@@ -244,7 +304,7 @@ class TableTest < Test::Unit::TestCase
244
304
 
245
305
  def test_size
246
306
  bookmarks_path = @tables_dir + "bookmarks"
247
- bookmarks = Groonga::Array.create(:name => "bookmarks",
307
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
248
308
  :path => bookmarks_path.to_s)
249
309
 
250
310
  assert_equal(0, bookmarks.size)
@@ -256,11 +316,18 @@ class TableTest < Test::Unit::TestCase
256
316
  assert_equal(3, bookmarks.size)
257
317
  end
258
318
 
319
+ def test_path
320
+ bookmarks_path = @tables_dir + "bookmarks"
321
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
322
+ :path => bookmarks_path.to_s)
323
+ assert_equal(bookmarks_path.to_s, bookmarks.path)
324
+ end
325
+
259
326
  def test_time_column
260
327
  bookmarks_path = @tables_dir + "bookmarks"
261
- bookmarks = Groonga::Array.create(:name => "bookmarks",
328
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
262
329
  :path => bookmarks_path.to_s)
263
- column = bookmarks.define_column("created_at", "<time>")
330
+ column = bookmarks.define_column("created_at", "Time")
264
331
 
265
332
  bookmark = bookmarks.add
266
333
  now = Time.now
@@ -271,7 +338,7 @@ class TableTest < Test::Unit::TestCase
271
338
 
272
339
  def test_delete
273
340
  bookmarks_path = @tables_dir + "bookmarks"
274
- bookmarks = Groonga::Array.create(:name => "bookmarks",
341
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
275
342
  :path => bookmarks_path.to_s)
276
343
 
277
344
  bookmark1 = bookmarks.add
@@ -285,7 +352,7 @@ class TableTest < Test::Unit::TestCase
285
352
 
286
353
  def test_remove
287
354
  bookmarks_path = @tables_dir + "bookmarks"
288
- bookmarks = Groonga::Array.create(:name => "bookmarks",
355
+ bookmarks = Groonga::Array.create(:name => "Bookmarks",
289
356
  :path => bookmarks_path.to_s)
290
357
  assert_predicate(bookmarks_path, :exist?)
291
358
  bookmarks.remove
@@ -293,15 +360,15 @@ class TableTest < Test::Unit::TestCase
293
360
  end
294
361
 
295
362
  def test_temporary_add
296
- table = Groonga::Hash.create(:key_type => "<shorttext>")
363
+ table = Groonga::Hash.create(:key_type => "ShortText")
297
364
  assert_equal(0, table.size)
298
365
  table.add("key")
299
366
  assert_equal(1, table.size)
300
367
  end
301
368
 
302
369
  def test_each
303
- users = Groonga::Array.create(:name => "<users>")
304
- user_name = users.define_column("name", "<shorttext>")
370
+ users = Groonga::Array.create(:name => "Users")
371
+ user_name = users.define_column("name", "ShortText")
305
372
 
306
373
  names = ["daijiro", "gunyarakun", "yu"]
307
374
  names.each do |name|
@@ -313,7 +380,7 @@ class TableTest < Test::Unit::TestCase
313
380
  end
314
381
 
315
382
  def test_truncate
316
- users = Groonga::Array.create(:name => "<users>")
383
+ users = Groonga::Array.create(:name => "Users")
317
384
  users.add
318
385
  users.add
319
386
  users.add
@@ -325,12 +392,8 @@ class TableTest < Test::Unit::TestCase
325
392
  end
326
393
 
327
394
  def test_sort
328
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
329
- id_column = bookmarks.define_column("id", "<int>")
330
- 100.times do |i|
331
- bookmark = bookmarks.add
332
- bookmark["id"] = i + 100
333
- end
395
+ bookmarks = create_bookmarks
396
+ add_shuffled_ids(bookmarks)
334
397
 
335
398
  results = bookmarks.sort([
336
399
  {
@@ -344,12 +407,8 @@ class TableTest < Test::Unit::TestCase
344
407
  end
345
408
 
346
409
  def test_sort_simple
347
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
348
- id_column = bookmarks.define_column("id", "<int>")
349
- 100.times do |i|
350
- bookmark = bookmarks.add
351
- bookmark["id"] = i + 100
352
- end
410
+ bookmarks = create_bookmarks
411
+ add_shuffled_ids(bookmarks)
353
412
 
354
413
  results = bookmarks.sort(["id"], :limit => 20)
355
414
  assert_equal((100..119).to_a,
@@ -357,35 +416,66 @@ class TableTest < Test::Unit::TestCase
357
416
  end
358
417
 
359
418
  def test_sort_by_array
360
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
361
- id_column = bookmarks.define_column("id", "<int>")
362
- 100.times do |i|
363
- bookmark = bookmarks.add
364
- bookmark["id"] = i + 100
365
- end
419
+ bookmarks = create_bookmarks
420
+ add_shuffled_ids(bookmarks)
366
421
 
367
422
  results = bookmarks.sort([["id", "descending"]], :limit => 20)
368
423
  assert_equal((180..199).to_a.reverse,
369
424
  results.collect {|record| record["id"]})
370
425
  end
371
426
 
372
- def test_sort_without_limit
373
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
374
- id_column = bookmarks.define_column("id", "<int>")
375
- 100.times do |i|
376
- bookmark = bookmarks.add
377
- bookmark["id"] = i + 100
378
- end
427
+ def test_sort_without_limit_and_offset
428
+ bookmarks = create_bookmarks
429
+ add_shuffled_ids(bookmarks)
379
430
 
380
431
  results = bookmarks.sort([{:key => "id", :order => :descending}])
381
432
  assert_equal((100..199).to_a.reverse,
382
433
  results.collect {|record| record["id"]})
383
434
  end
384
435
 
436
+ def test_sort_with_limit
437
+ bookmarks = create_bookmarks
438
+ add_shuffled_ids(bookmarks)
439
+
440
+ results = bookmarks.sort([{:key => "id", :order => :descending}],
441
+ :limit => 20)
442
+ assert_equal((180..199).to_a.reverse,
443
+ results.collect {|record| record["id"]})
444
+ end
445
+
446
+ def test_sort_with_offset
447
+ bookmarks = create_bookmarks
448
+ add_shuffled_ids(bookmarks)
449
+
450
+ results = bookmarks.sort([{:key => "id", :order => :descending}],
451
+ :offset => 20)
452
+ assert_equal((100..179).to_a.reverse,
453
+ results.collect {|record| record["id"]})
454
+ end
455
+
456
+ def test_sort_with_limit_and_offset
457
+ bookmarks = create_bookmarks
458
+ add_shuffled_ids(bookmarks)
459
+
460
+ results = bookmarks.sort([{:key => "id", :order => :descending}],
461
+ :limit => 20, :offset => 20)
462
+ assert_equal((160..179).to_a.reverse,
463
+ results.collect {|record| record["id"]})
464
+ end
465
+
466
+ def test_sort_with_nonexistent_key
467
+ omit("maybe crash!!!")
468
+ bookmarks = create_bookmarks
469
+ add_shuffled_ids(bookmarks)
470
+ results = bookmarks.sort([{:key => "nonexistent", :order => :descending}])
471
+ assert_equal("unknown",
472
+ results.collect {|record| record["id"]})
473
+ end
474
+
385
475
  def test_group
386
- bookmarks = Groonga::Hash.create(:name => "<bookmarks>")
387
- bookmarks.define_column("title", "<text>")
388
- comments = Groonga::Array.create(:name => "<comments>")
476
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
477
+ bookmarks.define_column("title", "Text")
478
+ comments = Groonga::Array.create(:name => "Comments")
389
479
  comments.define_column("bookmark", bookmarks)
390
480
  comments.define_column("content", "Text")
391
481
  comments.define_column("issued", "Int32")
@@ -409,16 +499,16 @@ class TableTest < Test::Unit::TestCase
409
499
  end
410
500
  assert_equal([[2, "groonga", "http://groonga.org/"],
411
501
  [1, "Ruby", "http://ruby-lang.org/"]],
412
- records.group([".bookmark"]).collect do |record|
502
+ records.group(".bookmark").collect do |record|
413
503
  bookmark = record.key
414
- [record[".:nsubrecs"],
504
+ [record.n_sub_records,
415
505
  bookmark["title"],
416
506
  bookmark.key]
417
507
  end)
418
508
  end
419
509
 
420
510
  def test_union!
421
- bookmarks = Groonga::Hash.create(:name => "bookmarks")
511
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
422
512
  bookmarks.define_column("title", "ShortText")
423
513
 
424
514
  groonga = bookmarks.add("http://groonga.org/", :title => "groonga")
@@ -448,7 +538,7 @@ class TableTest < Test::Unit::TestCase
448
538
  end
449
539
 
450
540
  def test_difference!
451
- bookmarks = Groonga::Hash.create(:name => "bookmarks")
541
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
452
542
  bookmarks.define_column("title", "ShortText")
453
543
 
454
544
  bookmarks.add("http://groonga.org/", :title => "groonga")
@@ -463,23 +553,23 @@ class TableTest < Test::Unit::TestCase
463
553
  end
464
554
 
465
555
  def test_merge!
466
- omit("should write a test")
467
- bookmarks = Groonga::Hash.create(:name => "bookmarks")
556
+ bookmarks = Groonga::Hash.create(:name => "Bookmarks")
468
557
  bookmarks.define_column("title", "ShortText")
469
558
 
470
559
  bookmarks.add("http://groonga.org/", :title => "groonga")
471
560
  bookmarks.add("http://ruby-lang.org/", :title => "Ruby")
472
561
 
473
- ruby_bookmarks = bookmarks.select {|record| record["title"] == "Ruby"}
562
+ ruby_bookmarks = bookmarks.select {|record| (record["title"] == "Ruby") &
563
+ (record["title"] == "Ruby") }
474
564
  all_bookmarks = bookmarks.select
475
- assert_equal(["groonga"],
565
+ assert_equal([["groonga", 1], ["Ruby", 2]],
476
566
  all_bookmarks.merge!(ruby_bookmarks).collect do |record|
477
- [record[".title"], record[".:score"]]
567
+ [record[".title"], record.score]
478
568
  end)
479
569
  end
480
570
 
481
571
  def test_lock
482
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
572
+ bookmarks = Groonga::Array.create(:name => "Bookmarks")
483
573
  bookmark = bookmarks.add
484
574
 
485
575
  assert_not_predicate(bookmarks, :locked?)
@@ -490,7 +580,7 @@ class TableTest < Test::Unit::TestCase
490
580
  end
491
581
 
492
582
  def test_lock_failed
493
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
583
+ bookmarks = Groonga::Array.create(:name => "Bookmarks")
494
584
  bookmark = bookmarks.add
495
585
 
496
586
  bookmarks.lock
@@ -500,7 +590,7 @@ class TableTest < Test::Unit::TestCase
500
590
  end
501
591
 
502
592
  def test_lock_block
503
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
593
+ bookmarks = Groonga::Array.create(:name => "Bookmarks")
504
594
  bookmark = bookmarks.add
505
595
 
506
596
  assert_not_predicate(bookmarks, :locked?)
@@ -511,7 +601,7 @@ class TableTest < Test::Unit::TestCase
511
601
  end
512
602
 
513
603
  def test_clear_lock
514
- bookmarks = Groonga::Array.create(:name => "<bookmarks>")
604
+ bookmarks = Groonga::Array.create(:name => "Bookmarks")
515
605
  bookmark = bookmarks.add
516
606
 
517
607
  assert_not_predicate(bookmarks, :locked?)
@@ -520,4 +610,33 @@ class TableTest < Test::Unit::TestCase
520
610
  bookmarks.clear_lock
521
611
  assert_not_predicate(bookmarks, :locked?)
522
612
  end
613
+
614
+ def test_auto_record_register
615
+ users = Groonga::Hash.create(:name => "Users",
616
+ :key_type => "ShortText")
617
+ books = Groonga::Hash.create(:name => "Books",
618
+ :key_type => "ShortText")
619
+ users.define_column("book", "Books")
620
+
621
+ assert_equal([], books.select.collect {|book| book.key})
622
+ users.add("ryoqun", :book => "XP")
623
+ assert_equal([books["XP"]],
624
+ books.select.collect {|book| book.key})
625
+ end
626
+
627
+ private
628
+ def create_bookmarks
629
+ bookmarks = Groonga::Array.create(:name => "Bookmarks")
630
+ bookmarks.define_column("id", "Int32")
631
+ bookmarks
632
+ end
633
+
634
+ def add_shuffled_ids(bookmarks)
635
+ srand(Time.now.to_i)
636
+ (0...100).to_a.shuffle.each do |i|
637
+ bookmark = bookmarks.add
638
+ bookmark["id"] = i + 100
639
+ end
640
+ bookmarks
641
+ end
523
642
  end