rroonga 9.0.3 → 9.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/text/news.md +30 -0
- data/ext/groonga/rb-grn-context.c +27 -0
- data/ext/groonga/rb-grn-flushable.c +7 -0
- data/ext/groonga/rb-grn-index-column.c +28 -0
- data/ext/groonga/rb-grn-index-cursor.c +19 -0
- data/ext/groonga/rb-grn-logger.c +17 -3
- data/ext/groonga/rb-grn-object.c +236 -22
- data/ext/groonga/rb-grn-table.c +68 -42
- data/ext/groonga/rb-grn.h +1 -1
- data/lib/groonga/dumper.rb +3 -0
- data/lib/groonga/record.rb +2 -2
- data/test/groonga-test-utils.rb +28 -5
- data/test/run-test.rb +0 -2
- data/test/test-accessor.rb +63 -7
- data/test/test-context.rb +25 -0
- data/test/test-exception.rb +5 -0
- data/test/test-flushable.rb +51 -6
- data/test/test-index-column.rb +67 -6
- data/test/test-index-cursor.rb +26 -0
- data/test/test-logger.rb +56 -11
- data/test/test-plugin.rb +1 -0
- data/test/test-query-logger.rb +4 -3
- data/test/test-record.rb +2 -1
- data/test/test-remote.rb +40 -10
- data/test/test-schema-dumper.rb +13 -0
- data/test/test-table.rb +21 -1
- data/test/test-variable.rb +23 -7
- metadata +59 -59
data/test/test-flushable.rb
CHANGED
@@ -18,32 +18,77 @@ class FlushableTest < Test::Unit::TestCase
|
|
18
18
|
|
19
19
|
setup :setup_database
|
20
20
|
|
21
|
+
def normalize_query_log(log)
|
22
|
+
log.lines.collect do |line|
|
23
|
+
line.chomp.gsub(/\A.*?:\d+ /, "")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
21
27
|
def test_flush_table
|
22
28
|
table = Groonga::Hash.create
|
23
|
-
|
29
|
+
log = collect_query_log do
|
24
30
|
table.flush
|
25
31
|
end
|
32
|
+
assert_equal([
|
33
|
+
"flush[(anonymous:table:hash_key)]",
|
34
|
+
],
|
35
|
+
normalize_query_log(log))
|
26
36
|
end
|
27
37
|
|
28
38
|
def test_flush_column
|
29
39
|
table = Groonga::Hash.create(:name => "Users")
|
30
40
|
column = table.define_column("name", "ShortText")
|
31
|
-
|
41
|
+
log = collect_query_log do
|
32
42
|
column.flush
|
33
43
|
end
|
44
|
+
assert_equal([
|
45
|
+
"flush[Users.name]",
|
46
|
+
],
|
47
|
+
normalize_query_log(log))
|
34
48
|
end
|
35
49
|
|
36
50
|
def test_flush_database
|
37
|
-
|
51
|
+
table = Groonga::Hash.create(:name => "Users")
|
52
|
+
table.define_column("name", "ShortText")
|
53
|
+
log = collect_query_log do
|
38
54
|
@database.flush
|
39
55
|
end
|
56
|
+
assert_equal([
|
57
|
+
"flush[Users.name]",
|
58
|
+
"flush[Users]",
|
59
|
+
"flush[(anonymous:table:dat_key)]",
|
60
|
+
"flush[(anonymous:column:var_size)]",
|
61
|
+
"flush[(anonymous:table:hash_key)]",
|
62
|
+
"flush[(anonymous:column:var_size)]",
|
63
|
+
"flush[(DB)]",
|
64
|
+
],
|
65
|
+
normalize_query_log(log))
|
40
66
|
end
|
41
67
|
|
42
68
|
def test_flush_not_recursive
|
43
|
-
table = Groonga::Hash.create
|
44
|
-
table.
|
45
|
-
|
69
|
+
table = Groonga::Hash.create(:name => "Users")
|
70
|
+
table.define_column("name", "ShortText")
|
71
|
+
log = collect_query_log do
|
46
72
|
table.flush(:recursive => false)
|
47
73
|
end
|
74
|
+
assert_equal([
|
75
|
+
"flush[Users]",
|
76
|
+
],
|
77
|
+
normalize_query_log(log))
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_flush_dependent
|
81
|
+
referenced_table = Groonga::Hash.create(name: "Names")
|
82
|
+
table = Groonga::Hash.create(:name => "Users")
|
83
|
+
table.define_column("name", referenced_table)
|
84
|
+
log = collect_query_log do
|
85
|
+
table.flush(:recursive => false, :dependent => true)
|
86
|
+
end
|
87
|
+
assert_equal([
|
88
|
+
"flush[Names]",
|
89
|
+
"flush[Users.name]",
|
90
|
+
"flush[Users]",
|
91
|
+
],
|
92
|
+
normalize_query_log(log))
|
48
93
|
end
|
49
94
|
end
|
data/test/test-index-column.rb
CHANGED
@@ -33,11 +33,11 @@ class IndexColumnTest < Test::Unit::TestCase
|
|
33
33
|
articles = Groonga::Array.create(:name => "Articles")
|
34
34
|
articles.define_column("content", "Text")
|
35
35
|
|
36
|
-
terms = Groonga::Hash.create(:name => "Terms",
|
37
|
-
|
38
|
-
|
39
|
-
@index = terms.define_index_column("content", articles,
|
40
|
-
|
36
|
+
@terms = Groonga::Hash.create(:name => "Terms",
|
37
|
+
:key_type => "ShortText",
|
38
|
+
:default_tokenizer => "TokenBigram")
|
39
|
+
@index = @terms.define_index_column("content", articles,
|
40
|
+
:with_section => true)
|
41
41
|
end
|
42
42
|
|
43
43
|
def test_index?
|
@@ -63,6 +63,20 @@ class IndexColumnTest < Test::Unit::TestCase
|
|
63
63
|
not @index.data?
|
64
64
|
end
|
65
65
|
end
|
66
|
+
|
67
|
+
sub_test_case("#lexicon?") do
|
68
|
+
def test_true
|
69
|
+
assert do
|
70
|
+
@terms.lexicon?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_false
|
75
|
+
assert do
|
76
|
+
not @index.lexicon?
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
66
80
|
end
|
67
81
|
|
68
82
|
class CRUDTest < self
|
@@ -438,11 +452,35 @@ class IndexColumnTest < Test::Unit::TestCase
|
|
438
452
|
])
|
439
453
|
end
|
440
454
|
|
455
|
+
def test_large
|
456
|
+
Groonga::Schema.define do |schema|
|
457
|
+
schema.create_table("Tags",
|
458
|
+
:type => :patricia_trie,
|
459
|
+
:key_type => "ShortText") do |table|
|
460
|
+
table.index("Articles.tags",
|
461
|
+
:name => "large",
|
462
|
+
:size => :large)
|
463
|
+
table.index("Articles.tags",
|
464
|
+
:name => "default")
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
assert_equal([
|
469
|
+
true,
|
470
|
+
false,
|
471
|
+
],
|
472
|
+
[
|
473
|
+
context["Tags.large"].large?,
|
474
|
+
context["Tags.default"].large?,
|
475
|
+
])
|
476
|
+
end
|
477
|
+
|
441
478
|
def test_invalid
|
442
479
|
Groonga::Schema.create_table("Tags",
|
443
480
|
:type => :patricia_trie,
|
444
481
|
:key_type => "ShortText")
|
445
|
-
message =
|
482
|
+
message =
|
483
|
+
":size must be nil, :small, :medium or :large: <invalid>"
|
446
484
|
assert_raise(ArgumentError.new(message)) do
|
447
485
|
tags = context["Tags"]
|
448
486
|
tags.define_index_column("small",
|
@@ -818,5 +856,28 @@ class IndexColumnTest < Test::Unit::TestCase
|
|
818
856
|
">",
|
819
857
|
index.inspect)
|
820
858
|
end
|
859
|
+
|
860
|
+
def test_large_size
|
861
|
+
Groonga::Schema.define do |schema|
|
862
|
+
schema.create_table("Tags",
|
863
|
+
:type => :hash,
|
864
|
+
:key_type => "ShortText") do |tags|
|
865
|
+
tags.index("Articles.tag", :size => :large)
|
866
|
+
end
|
867
|
+
end
|
868
|
+
|
869
|
+
index = context["Tags.Articles_tag"]
|
870
|
+
source_column_names = index.sources.collect(&:local_name).join(",")
|
871
|
+
assert_equal("\#<Groonga::IndexColumn " +
|
872
|
+
"id: <#{index.id}>, " +
|
873
|
+
"name: <#{index.name}>, " +
|
874
|
+
"path: <#{index.path}>, " +
|
875
|
+
"domain: <#{index.domain.name}>, " +
|
876
|
+
"range: <#{index.range.name}>, " +
|
877
|
+
"flags: <LARGE>, " +
|
878
|
+
"sources: <#{source_column_names}>" +
|
879
|
+
">",
|
880
|
+
index.inspect)
|
881
|
+
end
|
821
882
|
end
|
822
883
|
end
|
data/test/test-index-cursor.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
# Copyright (C) 2019 Horimoto Yasuhiro <horimoto@clear-code.com>
|
2
3
|
#
|
3
4
|
# This library is free software; you can redistribute it and/or
|
4
5
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -155,6 +156,31 @@ class IndexCursorTest < Test::Unit::TestCase
|
|
155
156
|
assert_equal("l", term.key)
|
156
157
|
end
|
157
158
|
|
159
|
+
sub_test_case(".set_min?") do
|
160
|
+
def setup
|
161
|
+
default_set_min = Groonga::IndexCursor.set_min?
|
162
|
+
begin
|
163
|
+
yield
|
164
|
+
ensure
|
165
|
+
Groonga::IndexCursor.set_min = default_set_min
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_true
|
170
|
+
Groonga::IndexCursor.set_min = true
|
171
|
+
assert do
|
172
|
+
Groonga::IndexCursor.set_min?
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_false
|
177
|
+
Groonga::IndexCursor.set_min = false
|
178
|
+
assert do
|
179
|
+
not Groonga::IndexCursor.set_min?
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
158
184
|
private
|
159
185
|
def create_hashes(keys, values)
|
160
186
|
hashes = []
|
data/test/test-logger.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2010-
|
1
|
+
# Copyright (C) 2010-2019 Kouhei Sutou <kou@clear-code.com>
|
2
2
|
# Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
|
3
3
|
#
|
4
4
|
# This library is free software; you can redistribute it and/or
|
@@ -21,15 +21,18 @@ class LoggerTest < Test::Unit::TestCase
|
|
21
21
|
@default_log_path = Groonga::Logger.path
|
22
22
|
@default_log_max_level = Groonga::Logger.max_level
|
23
23
|
@default_rotate_threshold_size = Groonga::Logger.rotate_threshold_size
|
24
|
+
@default_flags = Groonga::Logger.flags
|
24
25
|
end
|
25
26
|
|
26
27
|
def teardown
|
27
28
|
Groonga::Logger.path = @default_log_path
|
28
29
|
Groonga::Logger.max_level = @default_log_max_level
|
29
30
|
Groonga::Logger.rotate_threshold_size = @default_rotate_threshold_size
|
31
|
+
Groonga::Logger.flags = @default_flags
|
30
32
|
end
|
31
33
|
|
32
34
|
def test_reopen
|
35
|
+
only_not_windows
|
33
36
|
Groonga::Logger.unregister
|
34
37
|
Groonga::Logger.path = @log_path.to_s
|
35
38
|
if @log_path.exist?
|
@@ -46,12 +49,22 @@ class LoggerTest < Test::Unit::TestCase
|
|
46
49
|
assert_equal(:debug, Groonga::Logger.max_level)
|
47
50
|
end
|
48
51
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
sub_test_case ".flags" do
|
53
|
+
def test_default
|
54
|
+
assert_equal(Groonga::Logger::Flags::TIME |
|
55
|
+
Groonga::Logger::Flags::MESSAGE,
|
56
|
+
Groonga::Logger.flags)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_location
|
60
|
+
Groonga::Logger.flags = Groonga::Logger::Flags::LOCATION
|
61
|
+
assert_equal(Groonga::Logger::Flags::LOCATION, Groonga::Logger.flags)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_thread_id
|
65
|
+
Groonga::Logger.flags = Groonga::Logger::Flags::THREAD_ID
|
66
|
+
assert_equal(Groonga::Logger::Flags::THREAD_ID, Groonga::Logger.flags)
|
67
|
+
end
|
55
68
|
end
|
56
69
|
|
57
70
|
sub_test_case ".log" do
|
@@ -89,7 +102,8 @@ class LoggerTest < Test::Unit::TestCase
|
|
89
102
|
|
90
103
|
test "default location" do
|
91
104
|
locations = []
|
92
|
-
Groonga::Logger.register do |
|
105
|
+
Groonga::Logger.register(thread_id: false) do |*args|
|
106
|
+
location = args[5]
|
93
107
|
locations << location
|
94
108
|
end
|
95
109
|
Groonga::Logger.log("message"); line = __LINE__
|
@@ -102,7 +116,8 @@ class LoggerTest < Test::Unit::TestCase
|
|
102
116
|
|
103
117
|
test ":file" do
|
104
118
|
locations = []
|
105
|
-
Groonga::Logger.register do |
|
119
|
+
Groonga::Logger.register(thread_id: false) do |*args|
|
120
|
+
location = args[5]
|
106
121
|
locations << location
|
107
122
|
end
|
108
123
|
Groonga::Logger.log("message", :file => "file.rb")
|
@@ -118,7 +133,8 @@ class LoggerTest < Test::Unit::TestCase
|
|
118
133
|
|
119
134
|
test ":line" do
|
120
135
|
locations = []
|
121
|
-
Groonga::Logger.register do |
|
136
|
+
Groonga::Logger.register(thread_id: false) do |*args|
|
137
|
+
location = args[5]
|
122
138
|
locations << location
|
123
139
|
end
|
124
140
|
Groonga::Logger.log("message", :line => 100)
|
@@ -134,7 +150,8 @@ class LoggerTest < Test::Unit::TestCase
|
|
134
150
|
|
135
151
|
test ":function" do
|
136
152
|
locations = []
|
137
|
-
Groonga::Logger.register do |
|
153
|
+
Groonga::Logger.register(thread_id: false) do |*args|
|
154
|
+
location = args[5]
|
138
155
|
locations << location
|
139
156
|
end
|
140
157
|
Groonga::Logger.log("message", :function => "method_name")
|
@@ -149,6 +166,34 @@ class LoggerTest < Test::Unit::TestCase
|
|
149
166
|
end
|
150
167
|
end
|
151
168
|
|
169
|
+
sub_test_case ".register" do
|
170
|
+
setup do
|
171
|
+
GC.disable
|
172
|
+
end
|
173
|
+
|
174
|
+
teardown do
|
175
|
+
Groonga::Logger.unregister
|
176
|
+
GC.enable
|
177
|
+
end
|
178
|
+
|
179
|
+
test ":thread_id" do
|
180
|
+
locations = []
|
181
|
+
Groonga::Logger.register(location: false,
|
182
|
+
thread_id: true) do |*args|
|
183
|
+
location = args[5]
|
184
|
+
locations << location
|
185
|
+
end
|
186
|
+
Groonga::Logger.log("message")
|
187
|
+
locations = locations.collect do |location|
|
188
|
+
location.gsub(/\A([a-f\d]+)\z/, "THREAD_ID")
|
189
|
+
end
|
190
|
+
assert_equal([
|
191
|
+
"THREAD_ID",
|
192
|
+
],
|
193
|
+
locations)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
152
197
|
def test_rotate_threshold_size
|
153
198
|
Groonga::Logger.unregister
|
154
199
|
Groonga::Logger.path = @log_path.to_s
|
data/test/test-plugin.rb
CHANGED
@@ -48,6 +48,7 @@ class PluginTest < Test::Unit::TestCase
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_by_path
|
51
|
+
only_not_windows # TODO: We can remove this with Groonga 9.0.3
|
51
52
|
context.register_plugin("token_filters/stop_word")
|
52
53
|
assert_not_nil(context["TokenFilterStopWord"])
|
53
54
|
plugin_path = "#{Groonga::Plugin.system_plugins_dir}/"
|
data/test/test-query-logger.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2015-
|
1
|
+
# Copyright (C) 2015-2019 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
|
@@ -29,6 +29,7 @@ class QueryLoggerTest < Test::Unit::TestCase
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_reopen
|
32
|
+
only_not_windows
|
32
33
|
Groonga::QueryLogger.unregister
|
33
34
|
Groonga::QueryLogger.path = @query_log_path.to_s
|
34
35
|
if @query_log_path.exist?
|
@@ -109,7 +110,7 @@ class QueryLoggerTest < Test::Unit::TestCase
|
|
109
110
|
Groonga::QueryLogger.log("default")
|
110
111
|
Groonga::QueryLogger.log("flags", :flags => "command")
|
111
112
|
normalized_infos = infos.collect do |info|
|
112
|
-
info = info.gsub(/\
|
113
|
+
info = info.gsub(/\A[a-zA-Z\d]+\|/,
|
113
114
|
"context_id|")
|
114
115
|
info.gsub(/\|[\d]+ \z/,
|
115
116
|
"|timestamp ")
|
@@ -129,7 +130,7 @@ class QueryLoggerTest < Test::Unit::TestCase
|
|
129
130
|
Groonga::QueryLogger.log("default")
|
130
131
|
Groonga::QueryLogger.log("mark", :mark => ":")
|
131
132
|
normalized_infos = infos.collect do |info|
|
132
|
-
info.gsub(/\
|
133
|
+
info.gsub(/\A[a-zA-Z\d]+\|([^\d])?[\d]+ \z/,
|
133
134
|
"context_id|\\1timestamp ")
|
134
135
|
end
|
135
136
|
assert_equal([
|
data/test/test-record.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2009-
|
1
|
+
# Copyright (C) 2009-2019 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
|
@@ -647,6 +647,7 @@ class RecordTest < Test::Unit::TestCase
|
|
647
647
|
end
|
648
648
|
|
649
649
|
def test_to_json
|
650
|
+
only_not_windows
|
650
651
|
ENV["TZ"] = "Japan"
|
651
652
|
created_at = Time.parse("2013-05-16T16:57:34+09:00")
|
652
653
|
values = {
|
data/test/test-remote.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2009-
|
1
|
+
# Copyright (C) 2009-2019 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
|
@@ -20,24 +20,54 @@ class RemoteTest < Test::Unit::TestCase
|
|
20
20
|
def setup_remote_connection
|
21
21
|
@process_id = nil
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
vendor_local_bin = File.join(__dir__, "..", "vendor", "local", "bin")
|
24
|
+
if File.exist?(vendor_local_bin)
|
25
|
+
groonga = File.join(vendor_local_bin, "groonga")
|
26
|
+
else
|
27
|
+
package_config = PKGConfig.package_config("groonga")
|
28
|
+
groonga = package_config.variable("groonga")
|
29
|
+
end
|
25
30
|
|
26
31
|
@host = "127.0.0.1"
|
27
32
|
@port = 12345
|
28
33
|
@remote_database_path = @tmp_dir + "remote-database"
|
29
|
-
@process_id =
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
@process_id = spawn(groonga,
|
35
|
+
"-i", @host,
|
36
|
+
"-p", @port.to_s,
|
37
|
+
"-s",
|
38
|
+
"-n", @remote_database_path.to_s)
|
39
|
+
Timeout.timeout(5) do
|
40
|
+
loop do
|
41
|
+
begin
|
42
|
+
open_client do |client|
|
43
|
+
client.status
|
44
|
+
end
|
45
|
+
rescue Groonga::Client::Error
|
46
|
+
else
|
47
|
+
break
|
48
|
+
end
|
49
|
+
end
|
34
50
|
end
|
35
|
-
sleep(1)
|
36
51
|
end
|
37
52
|
|
38
53
|
teardown
|
39
54
|
def teardown_remote_connection
|
40
|
-
|
55
|
+
if @process_id
|
56
|
+
begin
|
57
|
+
open_client do |client|
|
58
|
+
client.shutdown
|
59
|
+
end
|
60
|
+
rescue Groonga::Client::Error
|
61
|
+
end
|
62
|
+
Process.waitpid(@process_id)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def open_client(&block)
|
67
|
+
Groonga::Client.open(host: @host,
|
68
|
+
port: @port,
|
69
|
+
protocol: :gqtp,
|
70
|
+
&block)
|
41
71
|
end
|
42
72
|
|
43
73
|
def test_send
|