rroonga 4.0.8 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/rroonga-build.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
+ # Copyright (C) 2015 Masafumi Yokoyama <yokoyama@clear-code.com>
3
4
  # Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
4
5
  #
5
6
  # This library is free software; you can redistribute it and/or
@@ -17,17 +18,17 @@
17
18
 
18
19
  module RroongaBuild
19
20
  module RequiredGroongaVersion
20
- MAJOR = 4
21
+ MAJOR = 5
21
22
  MINOR = 0
22
- MICRO = 9
23
+ MICRO = 0
23
24
  VERSION = [MAJOR, MINOR, MICRO]
24
- RELEASED_DATE = Time.utc(2014, 12, 29)
25
+ RELEASED_DATE = Time.utc(2015, 2, 9)
25
26
  end
26
27
 
27
28
  module LatestGroongaVersion
28
- MAJOR = 4
29
+ MAJOR = 5
29
30
  MINOR = 0
30
- MICRO = 9
31
+ MICRO = 0
31
32
  VERSION = [MAJOR, MINOR, MICRO]
32
33
  end
33
34
 
@@ -1,3 +1,4 @@
1
+ # Copyright (C) 2015 Masafumi Yokoyama <yokoyama@clear-code.com>
1
2
  # Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
2
3
  #
3
4
  # This library is free software; you can redistribute it and/or
@@ -165,6 +166,14 @@ module GroongaTestUtils
165
166
  omit("Ruby 1.9 is needed.") unless ruby19?
166
167
  end
167
168
 
169
+ def linux?
170
+ /linux/ =~ RUBY_PLATFORM
171
+ end
172
+
173
+ def only_linux
174
+ omit("This test is only for Linux system.") unless linux?
175
+ end
176
+
168
177
  def support_self_recursive_equal?
169
178
  self_recursive_hash1 = {}
170
179
  self_recursive_hash1["next"] = self_recursive_hash1
data/test/test-array.rb CHANGED
@@ -242,6 +242,17 @@ EXPECTED_OUTPUT
242
242
  $stdout.sync = true
243
243
 
244
244
  base_dir = #{base_dir.dump}
245
+
246
+ groonga_command_dir = File.join(base_dir, "..", "groonga-command")
247
+ if File.exist?(groonga_command_dir)
248
+ $LOAD_PATH.unshift(File.join(groonga_command_dir, "lib"))
249
+ end
250
+
251
+ groonga_client_dir = File.join(base_dir, "..", "groonga-client")
252
+ if File.exist?(groonga_client_dir)
253
+ $LOAD_PATH.unshift(File.join(groonga_client_dir, "lib"))
254
+ end
255
+
245
256
  ext_dir = File.join(base_dir, "ext", "groonga")
246
257
  lib_dir = File.join(base_dir, "lib")
247
258
 
@@ -1,5 +1,5 @@
1
+ # Copyright (C) 2014-2015 Masafumi Yokoyama <yokoyama@clear-code.com>
1
2
  # Copyright (C) 2009-2014 Kouhei Sutou <kou@clear-code.com>
2
- # Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.com>
3
3
  #
4
4
  # This library is free software; you can redistribute it and/or
5
5
  # modify it under the terms of the GNU Lesser General Public
@@ -97,6 +97,8 @@ class ExceptionTest < Test::Unit::TestCase
97
97
  assert_const_defined(Groonga, :UnsupportedCommandVersion)
98
98
  assert_const_defined(Groonga, :NormalizerError)
99
99
  assert_const_defined(Groonga, :TokenFilterError)
100
+ assert_const_defined(Groonga, :CommandError)
101
+ assert_const_defined(Groonga, :PluginError)
100
102
  end
101
103
  end
102
104
 
@@ -1,3 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
1
3
  # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
2
4
  #
3
5
  # This library is free software; you can redistribute it and/or
@@ -21,4 +23,30 @@ class NormalizerTest < Test::Unit::TestCase
21
23
  def test_normalize
22
24
  assert_equal("abc", Groonga::Normalizer.normalize("AbC"))
23
25
  end
26
+
27
+ def test_normalize_with_space
28
+ assert_equal("abcdefgh", Groonga::Normalizer.normalize("AbC Def gh"))
29
+ end
30
+
31
+ def test_normalize_with_space_explicitly
32
+ assert_equal("abcdefgh",
33
+ Groonga::Normalizer.normalize("AbC Def gh",
34
+ :remove_blank => true))
35
+ end
36
+
37
+ def test_normalize_group_text
38
+ assert_equal("キロメートルキロメートルキロメートルキロメートル",
39
+ Groonga::Normalizer.normalize("㌖㌖㌖㌖"));
40
+ end
41
+
42
+ def test_normalize_keep_space
43
+ # full width space => half width space
44
+ assert_equal("abc def gh",
45
+ Groonga::Normalizer.normalize("AbC Def gh",
46
+ :remove_blank => false))
47
+ end
48
+
49
+ def test_normalize_tilda
50
+ assert_equal("~~~", Groonga::Normalizer.normalize("~~〜"))
51
+ end
24
52
  end
data/test/test-record.rb CHANGED
@@ -619,6 +619,11 @@ class RecordTest < Test::Unit::TestCase
619
619
  def setup
620
620
  setup_database
621
621
  setup_schema
622
+ setup_tz
623
+ end
624
+
625
+ def teardown
626
+ teardown_tz
622
627
  end
623
628
 
624
629
  def setup_schema
@@ -633,6 +638,14 @@ class RecordTest < Test::Unit::TestCase
633
638
  @bookmarks = Groonga["Bookmarks"]
634
639
  end
635
640
 
641
+ def setup_tz
642
+ @tz_original = ENV["TZ"]
643
+ end
644
+
645
+ def teardown_tz
646
+ ENV["TZ"] = @tz_original
647
+ end
648
+
636
649
  def test_to_json
637
650
  ENV["TZ"] = "Japan"
638
651
  created_at = Time.parse("2013-05-16T16:57:34+09:00")
@@ -652,5 +665,26 @@ class RecordTest < Test::Unit::TestCase
652
665
  }.to_json
653
666
  assert_equal(expected, groonga.to_json)
654
667
  end
668
+
669
+ def test_to_json_with_leap_second
670
+ only_linux
671
+ ENV["TZ"] = "right/Japan"
672
+ created_at = Time.parse("2012-07-01T08:59:60+09:00")
673
+ values = {
674
+ "uri" => "http://groonga.org/",
675
+ "rate" => 5,
676
+ "comment" => "Great!",
677
+ "created_at" => created_at,
678
+ }
679
+ groonga = @bookmarks.add(values)
680
+ expected = {
681
+ "_id" => groonga.id,
682
+ "comment" => values["comment"],
683
+ "created_at" => created_at.iso8601,
684
+ "rate" => values["rate"],
685
+ "uri" => values["uri"],
686
+ }.to_json
687
+ assert_equal(expected, groonga.to_json)
688
+ end
655
689
  end
656
690
  end
@@ -0,0 +1,366 @@
1
+ # Copyright (C) 2015 Masafumi Yokoyama <yokoyama@clear-code.com>
2
+ # Copyright (C) 2009-2013 Kouhei Sutou <kou@clear-code.com>
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License version 2.1 as published by the Free Software Foundation.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TableGroupTest < Test::Unit::TestCase
18
+ include GroongaTestUtils
19
+
20
+ setup :setup_database
21
+
22
+ class MaxNSubRecordsTest < self
23
+ setup
24
+ def setup_schema
25
+ Groonga::Schema.define do |schema|
26
+ schema.create_table("Bookmarks", :type => :hash) do |table|
27
+ table.text("title")
28
+ end
29
+
30
+ schema.create_table("Comments", :type => :array) do |table|
31
+ table.reference("bookmark")
32
+ table.text("content")
33
+ table.int32("rank")
34
+ end
35
+ end
36
+ end
37
+
38
+ setup
39
+ def setup_data
40
+ setup_bookmarks
41
+ setup_comments
42
+ end
43
+
44
+ def setup_bookmarks
45
+ @bookmarks = Groonga["Bookmarks"]
46
+ @groonga = @bookmarks.add("http://groonga.org/", :title => "groonga")
47
+ @ruby = @bookmarks.add("http://ruby-lang.org/", :title => "Ruby")
48
+ end
49
+
50
+ def setup_comments
51
+ @comments = Groonga["Comments"]
52
+ @comments.add(:bookmark => @groonga,
53
+ :content => "garbage comment1",
54
+ :rank => 0)
55
+ @comments.add(:bookmark => @groonga,
56
+ :content => "garbage comment2",
57
+ :rank => 0)
58
+ @comments.add(:bookmark => @groonga,
59
+ :content => "full-text search",
60
+ :rank => 1)
61
+ @comments.add(:bookmark => @groonga,
62
+ :content => "column store",
63
+ :rank => 5)
64
+ @comments.add(:bookmark => @ruby,
65
+ :content => "object oriented script language",
66
+ :rank => 100)
67
+ @comments.add(:bookmark => @ruby,
68
+ :content => "multi paradigm programming language",
69
+ :rank => 80)
70
+ end
71
+
72
+ setup
73
+ def setup_searched
74
+ @records = @comments.select do |record|
75
+ record.rank > 0
76
+ end
77
+ end
78
+
79
+ def test_upper_limit
80
+ grouped_records = @records.group("bookmark", :max_n_sub_records => 2)
81
+ groups = grouped_records.collect do |record|
82
+ sub_record_contents = record.sub_records.collect do |sub_record|
83
+ sub_record.content
84
+ end
85
+ [record.title, sub_record_contents]
86
+ end
87
+ assert_equal([
88
+ [
89
+ "groonga",
90
+ [
91
+ "full-text search",
92
+ "column store",
93
+ ],
94
+ ],
95
+ [
96
+ "Ruby",
97
+ [
98
+ "object oriented script language",
99
+ "multi paradigm programming language",
100
+ ],
101
+ ],
102
+ ],
103
+ groups)
104
+ end
105
+
106
+ def test_less_than_limit
107
+ sorted = @records.sort([{:key => "rank", :order => :descending}],
108
+ :limit => 3, :offset => 0)
109
+ grouped_records = sorted.group("bookmark", :max_n_sub_records => 2)
110
+ groups = grouped_records.collect do |record|
111
+ sub_record_ranks = record.sub_records.collect do |sub_record|
112
+ sub_record.rank
113
+ end
114
+ [record.title, sub_record_ranks]
115
+ end
116
+ assert_equal([
117
+ ["Ruby", [100, 80]],
118
+ ["groonga", [5]]
119
+ ],
120
+ groups)
121
+ end
122
+ end
123
+
124
+ class KeyTest < self
125
+ setup
126
+ def setup_schema
127
+ Groonga::Schema.define do |schema|
128
+ schema.create_table("Bookmarks", :type => :hash) do |table|
129
+ table.text("title")
130
+ end
131
+
132
+ schema.create_table("Comments", :type => :array) do |table|
133
+ table.reference("bookmark")
134
+ table.text("content")
135
+ table.int32("rank")
136
+ end
137
+ end
138
+ end
139
+
140
+ setup
141
+ def setup_data
142
+ setup_bookmarks
143
+ setup_comments
144
+ end
145
+
146
+ def setup_bookmarks
147
+ @bookmarks = Groonga["Bookmarks"]
148
+ @groonga = @bookmarks.add("http://groonga.org/", :title => "groonga")
149
+ @ruby = @bookmarks.add("http://ruby-lang.org/", :title => "Ruby")
150
+ end
151
+
152
+ def setup_comments
153
+ @comments = Groonga["Comments"]
154
+ @comments.add(:bookmark => @groonga,
155
+ :content => "full-text search")
156
+ @comments.add(:bookmark => @groonga,
157
+ :content => "column store")
158
+ @comments.add(:bookmark => @ruby,
159
+ :content => "object oriented script language")
160
+ end
161
+
162
+ def test_string
163
+ grouped_records = @comments.group("bookmark").collect do |record|
164
+ bookmark = record.key
165
+ [
166
+ record.n_sub_records,
167
+ bookmark["title"],
168
+ bookmark.key,
169
+ ]
170
+ end
171
+ assert_equal([
172
+ [2, "groonga", "http://groonga.org/"],
173
+ [1, "Ruby", "http://ruby-lang.org/"],
174
+ ],
175
+ grouped_records)
176
+ end
177
+
178
+ def test_array
179
+ grouped_records = @comments.group(["bookmark"]).collect do |record|
180
+ bookmark = record.key
181
+ [
182
+ record.n_sub_records,
183
+ bookmark["title"],
184
+ bookmark.key,
185
+ ]
186
+ end
187
+ assert_equal([
188
+ [2, "groonga", "http://groonga.org/"],
189
+ [1, "Ruby", "http://ruby-lang.org/"],
190
+ ],
191
+ grouped_records)
192
+ end
193
+
194
+ def test_accessor
195
+ grouped_records = @comments.group("bookmark._key").collect do |record|
196
+ [
197
+ record.n_sub_records,
198
+ record.key
199
+ ]
200
+ end
201
+ assert_equal([
202
+ [2, "http://groonga.org/"],
203
+ [1, "http://ruby-lang.org/"],
204
+ ],
205
+ grouped_records)
206
+ end
207
+
208
+ def test_nonexistent
209
+ message = "unknown group key: <\"nonexistent\">: <#{@comments.inspect}>"
210
+ assert_raise(ArgumentError.new(message)) do
211
+ @comments.group("nonexistent")
212
+ end
213
+ end
214
+ end
215
+
216
+ class MultipleKeyTest < self
217
+ setup
218
+ def setup_schema
219
+ Groonga::Schema.define do |schema|
220
+ schema.create_table("Memos", :type => :hash) do |table|
221
+ table.short_text("tag")
222
+ table.int64("priority")
223
+ end
224
+ end
225
+ end
226
+
227
+ setup
228
+ def setup_data
229
+ setup_memos
230
+ end
231
+
232
+ def setup_memos
233
+ @memos = Groonga["Memos"]
234
+ @memos.add("Groonga1",
235
+ :tag => "Groonga",
236
+ :priority => 10)
237
+ @memos.add("Groonga2",
238
+ :tag => "Groonga",
239
+ :priority => 20)
240
+ @memos.add("Mroonga1",
241
+ :tag => "Mroonga",
242
+ :priority => 10)
243
+ @memos.add("Mroonga2",
244
+ :tag => "Mroonga",
245
+ :priority => 10)
246
+ end
247
+
248
+ def test_two_keys
249
+ keys = ["tag", "priority"]
250
+ grouped_records = @memos.group(keys).collect do |record|
251
+ sub_record = record.sub_records.first
252
+ [
253
+ record.n_sub_records,
254
+ sub_record.tag,
255
+ sub_record.priority,
256
+ ]
257
+ end
258
+
259
+ assert_equal([
260
+ [1, "Groonga", 10],
261
+ [1, "Groonga", 20],
262
+ [2, "Mroonga", 10],
263
+ ],
264
+ grouped_records)
265
+ end
266
+ end
267
+
268
+ class CalculationTest < self
269
+ setup
270
+ def setup_schema
271
+ Groonga::Schema.define do |schema|
272
+ schema.create_table("Tags", :type => :hash)
273
+
274
+ schema.create_table("Memos", :type => :hash) do |table|
275
+ table.reference("tag")
276
+ table.int64("priority")
277
+ end
278
+ end
279
+ end
280
+
281
+ setup
282
+ def setup_data
283
+ setup_tags
284
+ setup_memos
285
+ end
286
+
287
+ def setup_tags
288
+ @tags = Groonga["Tags"]
289
+ @groonga = @tags.add("Groonga")
290
+ @mroonga = @tags.add("Mroonga")
291
+ @rroonga = @tags.add("Rroonga")
292
+ end
293
+
294
+ def setup_memos
295
+ @memos = Groonga["Memos"]
296
+ @memos.add("Groonga1",
297
+ :tag => @groonga,
298
+ :priority => 10)
299
+ @memos.add("Groonga2",
300
+ :tag => @groonga,
301
+ :priority => 20)
302
+ @memos.add("Groonga3",
303
+ :tag => @groonga,
304
+ :priority => 40)
305
+ @memos.add("Mroonga1",
306
+ :tag => @mroonga,
307
+ :priority => 50)
308
+ @memos.add("Mroonga2",
309
+ :tag => @mroonga,
310
+ :priority => 25)
311
+ @memos.add("Mroonga3",
312
+ :tag => @mroonga,
313
+ :priority => 10)
314
+ @memos.add("Rroonga1",
315
+ :tag => @rroonga,
316
+ :priority => 25)
317
+ @memos.add("Rroonga2",
318
+ :tag => @rroonga,
319
+ :priority => -25)
320
+ @memos.add("Rroonga3",
321
+ :tag => @rroonga,
322
+ :priority => 0)
323
+ end
324
+
325
+ def test_max
326
+ grouped_records = @memos.group("tag",
327
+ :calc_target => "priority",
328
+ :calc_types => [:max]).collect do |group|
329
+ tag = group.key
330
+ [
331
+ tag.key,
332
+ group.max,
333
+ ]
334
+ end
335
+
336
+ assert_equal([
337
+ ["Groonga", 40],
338
+ ["Mroonga", 50],
339
+ ["Rroonga", 25],
340
+ ],
341
+ grouped_records)
342
+ end
343
+
344
+ def test_all_types
345
+ grouped_records = @memos.group("tag",
346
+ :calc_target => "priority",
347
+ :calc_types => [:max, :min, :sum, :average]).collect do |group|
348
+ tag = group.key
349
+ [
350
+ tag.key,
351
+ group.max,
352
+ group.min,
353
+ group.sum,
354
+ group.average.round(3),
355
+ ]
356
+ end
357
+
358
+ assert_equal([
359
+ ["Groonga", 40, 10, 70, 23.333],
360
+ ["Mroonga", 50, 10, 85, 28.333],
361
+ ["Rroonga", 25, -25, 0, 0.0],
362
+ ],
363
+ grouped_records)
364
+ end
365
+ end
366
+ end