groonga 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.ja.rdoc +18 -3
- data/NEWS.rdoc +18 -3
- data/README.ja.rdoc +2 -0
- data/README.rdoc +2 -0
- data/Rakefile +14 -5
- data/TUTORIAL.ja.rdoc +82 -16
- data/benchmark/{read-write-small-many-items.rb → read-write-many-small-items.rb} +26 -23
- data/benchmark/{write-small-many-items.rb → write-many-small-items.rb} +26 -23
- data/example/bookmark.rb +49 -5
- data/ext/rb-grn-array.c +11 -1
- data/ext/rb-grn-column.c +132 -5
- data/ext/rb-grn-context.c +85 -80
- data/ext/rb-grn-database.c +182 -9
- data/ext/rb-grn-expression-builder.c +69 -0
- data/ext/rb-grn-expression.c +314 -0
- data/ext/rb-grn-fix-size-column.c +68 -89
- data/ext/rb-grn-hash.c +14 -5
- data/ext/rb-grn-index-column.c +14 -55
- data/ext/rb-grn-object.c +206 -75
- data/ext/rb-grn-operation.c +92 -0
- data/ext/rb-grn-patricia-trie.c +10 -32
- data/ext/rb-grn-query.c +9 -9
- data/ext/rb-grn-table-cursor.c +19 -80
- data/ext/rb-grn-table-key-support.c +33 -39
- data/ext/rb-grn-table.c +436 -79
- data/ext/rb-grn-type.c +10 -3
- data/ext/rb-grn-utils.c +131 -4
- data/ext/rb-grn-variable-size-column.c +36 -0
- data/ext/rb-grn-variable.c +90 -0
- data/ext/rb-grn.h +109 -56
- data/ext/rb-groonga.c +4 -0
- data/extconf.rb +39 -13
- data/html/index.html +2 -2
- data/lib/groonga.rb +22 -0
- data/lib/groonga/expression-builder.rb +141 -0
- data/lib/groonga/record.rb +25 -1
- data/lib/groonga/schema.rb +418 -0
- data/test/test-column.rb +11 -23
- data/test/test-context.rb +1 -1
- data/test/test-database.rb +60 -19
- data/test/test-expression-builder.rb +114 -0
- data/test/test-expression.rb +55 -0
- data/test/test-fix-size-column.rb +53 -0
- data/test/test-hash.rb +10 -3
- data/test/test-index-column.rb +24 -0
- data/test/test-patricia-trie.rb +9 -0
- data/test/test-procedure.rb +5 -5
- data/test/test-record.rb +71 -4
- data/test/test-schema.rb +207 -0
- data/test/test-table.rb +94 -12
- data/test/test-type.rb +18 -11
- data/test/test-variable-size-column.rb +53 -0
- data/test/test-variable.rb +28 -0
- metadata +18 -5
data/test/test-column.rb
CHANGED
@@ -61,12 +61,12 @@ class ColumnTest < Test::Unit::TestCase
|
|
61
61
|
@bookmarks_index =
|
62
62
|
Groonga::PatriciaTrie.create(:name => "bookmarks-index",
|
63
63
|
:path => @bookmarks_index_path.to_s,
|
64
|
-
:key_type => "
|
65
|
-
@bookmarks_index.default_tokenizer = "
|
64
|
+
:key_type => "ShortText")
|
65
|
+
@bookmarks_index.default_tokenizer = "TokenBigram"
|
66
66
|
|
67
67
|
@content_index_column_path = @columns_dir + "content-index"
|
68
68
|
@bookmarks_index_content =
|
69
|
-
@bookmarks_index.define_index_column("
|
69
|
+
@bookmarks_index.define_index_column("content", @bookmarks,
|
70
70
|
:with_section => true,
|
71
71
|
:with_weight => true,
|
72
72
|
:with_position => true,
|
@@ -74,7 +74,7 @@ class ColumnTest < Test::Unit::TestCase
|
|
74
74
|
|
75
75
|
@uri_index_column_path = @columns_dir + "uri-index"
|
76
76
|
@bookmarks_index_uri =
|
77
|
-
@bookmarks_index.define_index_column("
|
77
|
+
@bookmarks_index.define_index_column("uri", @bookmarks,
|
78
78
|
:path => @uri_index_column_path.to_s)
|
79
79
|
end
|
80
80
|
|
@@ -157,25 +157,6 @@ class ColumnTest < Test::Unit::TestCase
|
|
157
157
|
assert_equal(daijiro, @bookmarks_user[bookmark.id])
|
158
158
|
end
|
159
159
|
|
160
|
-
def test_inspect
|
161
|
-
assert_equal("#<Groonga::VarSizeColumn " +
|
162
|
-
"id: <#{@users_name_column.id}>, " +
|
163
|
-
"name: <users.name>, " +
|
164
|
-
"path: <#{@users_name_column_path}>, " +
|
165
|
-
"domain: <#{@users.inspect}>, " +
|
166
|
-
"range: <#{context['<shorttext>'].inspect}>" +
|
167
|
-
">",
|
168
|
-
@users_name_column.inspect)
|
169
|
-
end
|
170
|
-
|
171
|
-
def test_domain
|
172
|
-
assert_equal(@users, @users_name_column.domain)
|
173
|
-
end
|
174
|
-
|
175
|
-
def test_table
|
176
|
-
assert_equal(@users, @users_name_column.table)
|
177
|
-
end
|
178
|
-
|
179
160
|
def test_array_set_with_key_of_table
|
180
161
|
users = Groonga::Hash.create(:name => "<users>")
|
181
162
|
bookmarks = Groonga::Hash.create(:name => "<bookmarks>")
|
@@ -186,6 +167,13 @@ class ColumnTest < Test::Unit::TestCase
|
|
186
167
|
assert_equal("morita", groonga[:user].key)
|
187
168
|
end
|
188
169
|
|
170
|
+
def test_local_name
|
171
|
+
items = Groonga::Array.create(:name => "<items>")
|
172
|
+
title = items.define_column("title", "<shorttext>")
|
173
|
+
assert_equal("<items>.title", title.name)
|
174
|
+
assert_equal("title", title.local_name)
|
175
|
+
end
|
176
|
+
|
189
177
|
private
|
190
178
|
def assert_content_search(expected_records, term)
|
191
179
|
records = @bookmarks_index_content.search(term).records
|
data/test/test-context.rb
CHANGED
data/test/test-database.rb
CHANGED
@@ -63,25 +63,27 @@ class DatabaseTest < Test::Unit::TestCase
|
|
63
63
|
def test_each
|
64
64
|
db_path = @tmp_dir + "db"
|
65
65
|
database = Groonga::Database.create(:path => db_path.to_s)
|
66
|
-
assert_equal(["
|
67
|
-
"
|
68
|
-
"
|
69
|
-
"
|
70
|
-
"
|
71
|
-
"
|
72
|
-
"
|
73
|
-
"
|
74
|
-
"
|
75
|
-
"
|
76
|
-
"
|
77
|
-
"
|
78
|
-
"
|
79
|
-
"
|
80
|
-
"
|
81
|
-
"
|
82
|
-
"
|
83
|
-
"
|
84
|
-
"
|
66
|
+
assert_equal(["/q/define_selector",
|
67
|
+
"Bool",
|
68
|
+
"Float",
|
69
|
+
"Int16",
|
70
|
+
"Int32",
|
71
|
+
"Int64",
|
72
|
+
"Int8",
|
73
|
+
"LongText",
|
74
|
+
"Object",
|
75
|
+
"ShortText",
|
76
|
+
"Text",
|
77
|
+
"Time",
|
78
|
+
"TokenBigram",
|
79
|
+
"TokenDelimit",
|
80
|
+
"TokenMecab",
|
81
|
+
"TokenTrigram",
|
82
|
+
"TokenUnigram",
|
83
|
+
"UInt16",
|
84
|
+
"UInt32",
|
85
|
+
"UInt64",
|
86
|
+
"UInt8"],
|
85
87
|
database.collect {|object| object.name}.sort)
|
86
88
|
end
|
87
89
|
|
@@ -89,4 +91,43 @@ class DatabaseTest < Test::Unit::TestCase
|
|
89
91
|
assert_equal(Groonga::Encoding.default,
|
90
92
|
Groonga::Database.create.encoding)
|
91
93
|
end
|
94
|
+
|
95
|
+
def test_lock
|
96
|
+
database = Groonga::Database.create
|
97
|
+
|
98
|
+
assert_not_predicate(database, :locked?)
|
99
|
+
database.lock
|
100
|
+
assert_predicate(database, :locked?)
|
101
|
+
database.unlock
|
102
|
+
assert_not_predicate(database, :locked?)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_lock_failed
|
106
|
+
database = Groonga::Database.create
|
107
|
+
|
108
|
+
database.lock
|
109
|
+
assert_raise(Groonga::ResourceDeadlockAvoided) do
|
110
|
+
database.lock
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_lock_block
|
115
|
+
database = Groonga::Database.create
|
116
|
+
|
117
|
+
assert_not_predicate(database, :locked?)
|
118
|
+
database.lock do
|
119
|
+
assert_predicate(database, :locked?)
|
120
|
+
end
|
121
|
+
assert_not_predicate(database, :locked?)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_clear_lock
|
125
|
+
database = Groonga::Database.create
|
126
|
+
|
127
|
+
assert_not_predicate(database, :locked?)
|
128
|
+
database.lock
|
129
|
+
assert_predicate(database, :locked?)
|
130
|
+
database.clear_lock
|
131
|
+
assert_not_predicate(database, :locked?)
|
132
|
+
end
|
92
133
|
end
|
@@ -0,0 +1,114 @@
|
|
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
|
+
class ExpressionBuilderTest < Test::Unit::TestCase
|
17
|
+
include GroongaTestUtils
|
18
|
+
|
19
|
+
setup :setup_database
|
20
|
+
setup :setup_tables
|
21
|
+
setup :setup_data
|
22
|
+
|
23
|
+
def setup_tables
|
24
|
+
@users = Groonga::Hash.create(:name => "<users>")
|
25
|
+
@name = @users.define_column("name", "<shorttext>")
|
26
|
+
@hp = @users.define_column("hp", "<uint>")
|
27
|
+
|
28
|
+
@terms = Groonga::PatriciaTrie.create(:name => "<terms>",
|
29
|
+
:default_tokenizer => "TokenBigram")
|
30
|
+
@terms.define_index_column("user-name", @users, :source => @name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup_data
|
34
|
+
@morita = @users.add("morita",
|
35
|
+
:name => "mori daijiro",
|
36
|
+
:hp => 100)
|
37
|
+
@gunyara_kun = @users.add("gunyara-kun",
|
38
|
+
:name => "Tasuku SUENAGA",
|
39
|
+
:hp => 150)
|
40
|
+
@yu = @users.add("yu",
|
41
|
+
:name => "Yutaro Shimamura",
|
42
|
+
:hp => 200)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_equal
|
46
|
+
result = @users.select do |record|
|
47
|
+
record["name"] == "mori daijiro"
|
48
|
+
end
|
49
|
+
assert_equal(["morita"],
|
50
|
+
result.collect {|record| record.key.key})
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_not_equal
|
54
|
+
omit("not supported yet!!!")
|
55
|
+
result = @users.select do |record|
|
56
|
+
record["name"] != "mori daijiro"
|
57
|
+
end
|
58
|
+
assert_equal(["gunyara-kun", "yu"],
|
59
|
+
result.collect {|record| record.key.key})
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_less
|
63
|
+
result = @users.select do |record|
|
64
|
+
record["hp"] < 150
|
65
|
+
end
|
66
|
+
assert_equal(["morita"], result.collect {|record| record.key.key})
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_less_equal
|
70
|
+
result = @users.select do |record|
|
71
|
+
record["hp"] <= 150
|
72
|
+
end
|
73
|
+
assert_equal(["morita", "gunyara-kun"],
|
74
|
+
result.collect {|record| record.key.key})
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_greater
|
78
|
+
result = @users.select do |record|
|
79
|
+
record["hp"] > 150
|
80
|
+
end
|
81
|
+
assert_equal(["yu"], result.collect {|record| record.key.key})
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_greater_equal
|
85
|
+
result = @users.select do |record|
|
86
|
+
record["hp"] >= 150
|
87
|
+
end
|
88
|
+
assert_equal(["gunyara-kun", "yu"],
|
89
|
+
result.collect {|record| record.key.key})
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_and
|
93
|
+
result = @users.select do |record|
|
94
|
+
(record["hp"] > 100) & (record["hp"] <= 200)
|
95
|
+
end
|
96
|
+
assert_equal(["gunyara-kun", "yu"],
|
97
|
+
result.collect {|record| record.key.key})
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_match
|
101
|
+
result = @users.select do |record|
|
102
|
+
record["name"] =~ "ro"
|
103
|
+
end
|
104
|
+
assert_equal(["morita", "yu"],
|
105
|
+
result.collect {|record| record.key.key})
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_query_string
|
109
|
+
omit("not supported yet!!!")
|
110
|
+
result = @name.select("ro")
|
111
|
+
assert_equal(["morita", "yu"],
|
112
|
+
result.collect {|record| record.key.key})
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,55 @@
|
|
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
|
+
class ExpressionTest < Test::Unit::TestCase
|
17
|
+
include GroongaTestUtils
|
18
|
+
|
19
|
+
setup :setup_database
|
20
|
+
|
21
|
+
def test_get_value
|
22
|
+
users = Groonga::Hash.create(:name => "<users>")
|
23
|
+
name = users.define_column("name", "<shorttext>")
|
24
|
+
|
25
|
+
morita = users.add("morita", :name => "mori daijiro")
|
26
|
+
|
27
|
+
expression = Groonga::Expression.new
|
28
|
+
expression.append_constant(morita)
|
29
|
+
expression.append_constant("name")
|
30
|
+
expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
|
31
|
+
expression.compile
|
32
|
+
assert_equal("mori daijiro", expression.execute)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_get_value_with_variable
|
36
|
+
users = Groonga::Hash.create(:name => "<users>")
|
37
|
+
name = users.define_column("name", "<shorttext>")
|
38
|
+
|
39
|
+
morita = users.add("morita", :name => "mori daijiro")
|
40
|
+
gunyara_kun = users.add("gunyara-kun", :name => "Tasuku SUENAGA")
|
41
|
+
|
42
|
+
expression = Groonga::Expression.new
|
43
|
+
variable = expression.define_variable
|
44
|
+
variable.value = morita
|
45
|
+
expression.append_object(variable)
|
46
|
+
expression.append_constant("name")
|
47
|
+
expression.append_operation(Groonga::Operation::OBJECT_GET_VALUE, 2)
|
48
|
+
expression.compile
|
49
|
+
|
50
|
+
assert_equal("mori daijiro", expression.execute)
|
51
|
+
|
52
|
+
variable.value = gunyara_kun.id
|
53
|
+
assert_equal("Tasuku SUENAGA", expression.execute)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,53 @@
|
|
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
|
+
class FixSizeColumnTest < Test::Unit::TestCase
|
17
|
+
include GroongaTestUtils
|
18
|
+
|
19
|
+
def setup
|
20
|
+
setup_database
|
21
|
+
|
22
|
+
setup_bookmarks_table
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup_bookmarks_table
|
26
|
+
@bookmarks_path = @tables_dir + "bookmarks"
|
27
|
+
@bookmarks = Groonga::Array.create(:name => "bookmarks",
|
28
|
+
:path => @bookmarks_path.to_s)
|
29
|
+
|
30
|
+
@viewed_column_path = @columns_dir + "viewed"
|
31
|
+
@viewed = @bookmarks.define_column("viewed", "<int>",
|
32
|
+
:path => @viewed_column_path.to_s)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_inspect
|
36
|
+
assert_equal("#<Groonga::FixSizeColumn " +
|
37
|
+
"id: <#{@viewed.id}>, " +
|
38
|
+
"name: <bookmarks.viewed>, " +
|
39
|
+
"path: <#{@viewed_column_path}>, " +
|
40
|
+
"domain: <#{@bookmarks.inspect}>, " +
|
41
|
+
"range: <#{context['<int>'].inspect}>" +
|
42
|
+
">",
|
43
|
+
@viewed.inspect)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_domain
|
47
|
+
assert_equal(@bookmarks, @viewed.domain)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_table
|
51
|
+
assert_equal(@bookmarks, @viewed.table)
|
52
|
+
end
|
53
|
+
end
|
data/test/test-hash.rb
CHANGED
@@ -102,11 +102,11 @@ class HashTest < Test::Unit::TestCase
|
|
102
102
|
named_table.inspect)
|
103
103
|
end
|
104
104
|
|
105
|
-
def
|
106
|
-
named_table = Groonga::Hash.create
|
105
|
+
def test_inspect_temporary
|
106
|
+
named_table = Groonga::Hash.create
|
107
107
|
assert_equal("#<Groonga::Hash " +
|
108
108
|
"id: <#{named_table.id}>, " +
|
109
|
-
"name:
|
109
|
+
"name: (anonymous), " +
|
110
110
|
"path: (temporary), " +
|
111
111
|
"domain: <nil>, " +
|
112
112
|
"range: <nil>, " +
|
@@ -191,4 +191,11 @@ class HashTest < Test::Unit::TestCase
|
|
191
191
|
users_opened.add("morita")
|
192
192
|
assert_equal(1, users_created.size)
|
193
193
|
end
|
194
|
+
|
195
|
+
def test_has_key?
|
196
|
+
users = Groonga::Hash.create(:name => "<users>")
|
197
|
+
assert_false(users.has_key?("morita"))
|
198
|
+
users.add("morita")
|
199
|
+
assert_true(users.has_key?("morita"))
|
200
|
+
end
|
194
201
|
end
|
data/test/test-index-column.rb
CHANGED
@@ -54,4 +54,28 @@ class IndexColumnTest < Test::Unit::TestCase
|
|
54
54
|
assert_equal([groonga],
|
55
55
|
content_index.search("エンジン").collect {|record| record.key})
|
56
56
|
end
|
57
|
+
|
58
|
+
def test_shorter_query_than_ngram
|
59
|
+
articles = Groonga::Array.create(:name => "<articles>")
|
60
|
+
articles.define_column("content", "<text>")
|
61
|
+
|
62
|
+
terms = Groonga::PatriciaTrie.create(:name => "<terms>",
|
63
|
+
:default_tokenizer => "<token:bigram>")
|
64
|
+
content_index = terms.define_index_column("content", articles,
|
65
|
+
:source => "<articles>.content")
|
66
|
+
articles.add(:content => 'l')
|
67
|
+
articles.add(:content => 'll')
|
68
|
+
articles.add(:content => 'hello')
|
69
|
+
|
70
|
+
assert_search(["hello"], content_index, "he")
|
71
|
+
assert_search(["ll", "hello"], content_index, "ll")
|
72
|
+
assert_search(["l", "ll", "hello"], content_index, "l")
|
73
|
+
end
|
74
|
+
|
75
|
+
def assert_search(expected, content_index, keyword)
|
76
|
+
result = content_index.search(keyword).collect do |entry|
|
77
|
+
entry.key["content"]
|
78
|
+
end
|
79
|
+
assert_equal(expected, result)
|
80
|
+
end
|
57
81
|
end
|
data/test/test-patricia-trie.rb
CHANGED
@@ -32,6 +32,8 @@ class PatriciaTrieTest < Test::Unit::TestCase
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_search
|
35
|
+
omit("creating entry is broken.")
|
36
|
+
|
35
37
|
users = Groonga::Array.create(:name => "<users>")
|
36
38
|
user_name = users.define_column("name", "<shorttext>")
|
37
39
|
|
@@ -79,4 +81,11 @@ class PatriciaTrieTest < Test::Unit::TestCase
|
|
79
81
|
users_opened.add("morita")
|
80
82
|
assert_equal(1, users_created.size)
|
81
83
|
end
|
84
|
+
|
85
|
+
def test_has_key?
|
86
|
+
users = Groonga::PatriciaTrie.create(:name => "<users>")
|
87
|
+
assert_false(users.has_key?("morita"))
|
88
|
+
users.add("morita")
|
89
|
+
assert_true(users.has_key?("morita"))
|
90
|
+
end
|
82
91
|
end
|