grn_mini 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/HISTORY.md +45 -0
- data/README.md +141 -30
- data/lib/grn_mini.rb +18 -1
- data/lib/grn_mini/array.rb +8 -74
- data/lib/grn_mini/hash.rb +6 -69
- data/lib/grn_mini/table.rb +91 -0
- data/lib/grn_mini/version.rb +1 -1
- data/test/test_grn_mini_array.rb +261 -31
- data/test/test_grn_mini_hash.rb +142 -23
- data/test/test_micro_blog.rb +67 -0
- metadata +6 -3
- data/sample/mini-directory-search.rb +0 -153
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3573d54bbab536ecc6429349a5326bce7f07e6b
|
4
|
+
data.tar.gz: e8d6c8f86a4b732aea1d84f6aee06ab8521fda97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7471f3cf1a8e784d1aad28d94d84f174aa19fb31a570d4a9b6e2dfd339a15e33341e39c43e0b14134db64deafb05fdc2cca51feded94a679df8179f01bc60bc
|
7
|
+
data.tar.gz: b0ecedae697ebc81e318c815488188db3744b87bac42fc91970b46b41c7158bf3cac1194784d058f8d8b3794eb1d9cf3bbd86d742535c33eaeaee3fea3eb26f7
|
data/HISTORY.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# HISTORY - grn_mini
|
2
|
+
|
3
|
+
## 0.4 - 2014/02/01
|
4
|
+
|
5
|
+
- GrnMini
|
6
|
+
- Add GrnMini::create_or_open(db_name)
|
7
|
+
- Add GrnMini::tmpdb
|
8
|
+
|
9
|
+
- GrnMini::Table
|
10
|
+
- Extract common function of Array and Hash
|
11
|
+
- Array < Table
|
12
|
+
- Hash < Table
|
13
|
+
- Add Table#setup_columns
|
14
|
+
- Specification of column types explicitly
|
15
|
+
- Support cross-reference between table
|
16
|
+
- Support new column type
|
17
|
+
- VECTOR_COLUMN
|
18
|
+
- GrnMini::Table, Groonga::Table (with define_index_column)
|
19
|
+
- "BOOL"
|
20
|
+
- GrnMini::Table#select
|
21
|
+
- Support block argument
|
22
|
+
- Quit the support of {default_column: "text”}
|
23
|
+
|
24
|
+
- GrnMini::Array
|
25
|
+
- Array.new(database_name) -> Array.new(table_name)
|
26
|
+
- Remove Array::tmpdb
|
27
|
+
|
28
|
+
- GrnMini::Hash
|
29
|
+
- Hash.new(database_name) -> Hash.new(table_name)
|
30
|
+
- Remove Hash::tmpdb
|
31
|
+
|
32
|
+
- README.md
|
33
|
+
- Fix to the new API sample code
|
34
|
+
|
35
|
+
## 0.3 - 2014/01/10
|
36
|
+
|
37
|
+
- Support GrnMini::Hash
|
38
|
+
|
39
|
+
## 0.2 - 2014/01/07
|
40
|
+
|
41
|
+
- Support snippet
|
42
|
+
|
43
|
+
## 0.1 - 2014/01/05
|
44
|
+
|
45
|
+
- 1st Release
|
data/README.md
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
# GrnMini
|
2
2
|
|
3
|
-
Groonga(Rroonga) wrapper for
|
4
|
-
|
5
|
-
|
3
|
+
Groonga(Rroonga) wrapper for using easily.
|
4
|
+
|
5
|
+
- Automatic generation of the column with data type
|
6
|
+
- Specification of column types explicitly
|
7
|
+
- Advanced Search Query
|
8
|
+
- Persistence
|
9
|
+
- Sort
|
10
|
+
- Grouping (Drill Down)
|
11
|
+
- Snippets
|
12
|
+
- Pagination
|
13
|
+
- Cooperation between multiple tables
|
6
14
|
|
7
15
|
## Installation
|
8
16
|
|
@@ -14,7 +22,7 @@ Groonga(Rroonga) for using easily. You can add the data in the column without sp
|
|
14
22
|
|
15
23
|
```ruby
|
16
24
|
require 'grn_mini'
|
17
|
-
|
25
|
+
GrnMini::create_or_open("test.db")
|
18
26
|
```
|
19
27
|
|
20
28
|
### Add the record with the number column and text column.
|
@@ -22,6 +30,7 @@ array = GrnMini::Array.new("test.db")
|
|
22
30
|
Determine the column type when you first call "GrnMini::Array#add". (Add inverted index if data type is "string".)
|
23
31
|
|
24
32
|
```ruby
|
33
|
+
array = GrnMini::Array.new
|
25
34
|
array.add(text: "aaa", number: 1)
|
26
35
|
```
|
27
36
|
|
@@ -37,14 +46,16 @@ array.size #=> 3
|
|
37
46
|
|
38
47
|
```ruby
|
39
48
|
require 'grn_mini'
|
40
|
-
|
49
|
+
GrnMini::create_or_open("test.db")
|
50
|
+
array = GrnMini::Array.new
|
41
51
|
array.size #=> 3
|
42
52
|
```
|
43
53
|
|
44
54
|
### Create a temporary database. (Useful for testing)
|
45
55
|
|
46
56
|
```ruby
|
47
|
-
GrnMini::
|
57
|
+
GrnMini::tmpdb do
|
58
|
+
array = GrnMini::Array.new
|
48
59
|
array << {text: "aaa", number: 1}
|
49
60
|
array << {text: "bbb", number: 2}
|
50
61
|
array << {text: "ccc", number: 3}
|
@@ -56,8 +67,8 @@ end
|
|
56
67
|
|
57
68
|
```ruby
|
58
69
|
require 'grn_mini'
|
59
|
-
|
60
|
-
hash = GrnMini::Hash.new
|
70
|
+
GrnMini::create_or_open("test.db")
|
71
|
+
hash = GrnMini::Hash.new
|
61
72
|
|
62
73
|
# Add
|
63
74
|
hash["a"] = {text:"aaa", number:1}
|
@@ -71,10 +82,57 @@ hash["b"].text #=> "bbb"
|
|
71
82
|
hash["b"].text = "BBB"
|
72
83
|
```
|
73
84
|
|
85
|
+
## Specify table name.
|
86
|
+
Default table name is "Array"(GrnMini::Array) or "Hash"(GrnMini::Hash).
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
GrnMini::tmpdb do
|
90
|
+
array = GrnMini::Array.new("Users")
|
91
|
+
array << {text: "aaa", number: 1}
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
## Specification of column types explicitly
|
96
|
+
|
97
|
+
Use GrnMini::Table#setup_columns.
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
GrnMini::tmpdb do
|
101
|
+
array = GrnMini::Array.new
|
102
|
+
|
103
|
+
# Specify dummy data
|
104
|
+
array.setup_columns(filename: "",
|
105
|
+
int: 0,
|
106
|
+
float: 0.0,
|
107
|
+
time: Time.new,
|
108
|
+
)
|
109
|
+
|
110
|
+
array << {filename: "a.txt", int: 1, float: 1.5, time: Time.at(1999)}
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
114
|
+
The following is the same meaning.
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
GrnMini::tmpdb do
|
118
|
+
array = GrnMini::Array.new
|
119
|
+
# Automatic generation of the column with data type
|
120
|
+
array << {filename: "a.txt", int: 1, float: 1.5, time: Time.at(1999)}
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
GrnMini::Table#setup_columns is useful for below.
|
125
|
+
|
126
|
+
- Specification of column types explicitly
|
127
|
+
- Refer to itself
|
128
|
+
- Cross-reference between tables
|
129
|
+
- See "Cooperation between multiple tables"
|
130
|
+
|
74
131
|
## Data Type
|
75
132
|
|
76
133
|
```ruby
|
77
|
-
GrnMini::
|
134
|
+
GrnMini::tmpdb do
|
135
|
+
array = GrnMini::Array.new
|
78
136
|
array << {filename: "a.txt", int: 1, float: 1.5, time: Time.at(1999)}
|
79
137
|
array << {filename: "b.doc", int: 2, float: 2.5, time: Time.at(2000)}
|
80
138
|
|
@@ -105,7 +163,8 @@ See also [8.4. Data type — Groonga documentation](http://groonga.org/docs/refe
|
|
105
163
|
```ruby
|
106
164
|
require 'grn_mini'
|
107
165
|
|
108
|
-
|
166
|
+
GrnMini::create_or_open("test2.db")
|
167
|
+
array = GrnMini::Array.new
|
109
168
|
array << {name:"Tanaka", age: 11, height: 162.5}
|
110
169
|
array << {name:"Suzuki", age: 31, height: 170.0}
|
111
170
|
```
|
@@ -156,7 +215,9 @@ array.first.attributes #=> {"_id"=>2, "age"=>31, "height"=>170.0, "name"=>"Haya
|
|
156
215
|
It is also possible to pass the block.
|
157
216
|
|
158
217
|
```ruby
|
159
|
-
GrnMini::
|
218
|
+
GrnMini::tmpdb do
|
219
|
+
array = GrnMini::Array.new
|
220
|
+
|
160
221
|
array << {name:"Tanaka", age: 11, height: 162.5}
|
161
222
|
array << {name:"Suzuki", age: 31, height: 170.0}
|
162
223
|
array << {name:"Hayashi", age: 20, height: 165.0}
|
@@ -173,41 +234,44 @@ end
|
|
173
234
|
## Search
|
174
235
|
|
175
236
|
Use GrnMini::Array#select method.
|
176
|
-
`:text` column is set to the `:default_column` implicitly.
|
177
237
|
|
178
238
|
```ruby
|
179
|
-
GrnMini::
|
239
|
+
GrnMini::tmpdb do
|
240
|
+
array = GrnMini::Array.new
|
241
|
+
|
180
242
|
array << {text:"aaa", number:1}
|
181
243
|
array << {text:"bbb", number:20}
|
182
244
|
array << {text:"bbb ccc", number:2}
|
183
245
|
array << {text:"bbb", number:15}
|
184
246
|
array << {text:"ccc", number:3}
|
185
247
|
|
186
|
-
results = array.select("aaa")
|
248
|
+
results = array.select("text:aaa")
|
187
249
|
results.map {|record| record.attributes} #=> [{"_id"=>1, "_key"=>{"_id"=>1, "number"=>1, "text"=>"aaa"}, "_score"=>1}]
|
188
250
|
|
189
251
|
# AND
|
190
|
-
results = array.select("bbb ccc")
|
252
|
+
results = array.select("text:@bbb text:@ccc")
|
191
253
|
results.map {|record| record.attributes} #=> [{"_id"=>2, "_key"=>{"_id"=>3, "number"=>2, "text"=>"bbb ccc"}, "_score"=>2}]
|
192
254
|
|
193
255
|
# Specify column
|
194
|
-
results = array.select("bbb number:<10")
|
256
|
+
results = array.select("text:@bbb number:<10")
|
195
257
|
results.map {|record| record.attributes} #=> [{"_id"=>2, "_key"=>{"_id"=>3, "number"=>2, "text"=>"bbb ccc"}, "_score"=>2}]
|
196
258
|
|
197
259
|
# AND, OR, Grouping
|
198
|
-
results = array.select("bbb (number:<= 10 OR number:>=20)")
|
260
|
+
results = array.select("text:@bbb (number:<= 10 OR number:>=20)")
|
199
261
|
results.map {|record| record.attributes} #=> [{"_id"=>2, "_key"=>{"_id"=>3, "number"=>2, "text"=>"bbb ccc"}, "_score"=>2}, {"_id"=>4, "_key"=>{"_id"=>2, "number"=>20, "text"=>"bbb"}, "_score"=>2}]
|
200
262
|
|
201
263
|
# NOT
|
202
|
-
results = array.select("bbb - ccc")
|
264
|
+
results = array.select("text:@bbb - text:@ccc")
|
203
265
|
results.map {|record| record.attributes} #=> [{"_id"=>1, "_key"=>{"_id"=>2, "number"=>20, "text"=>"bbb"}, "_score"=>1}, {"_id"=>3, "_key"=>{"_id"=>4, "number"=>15, "text"=>"bbb"}, "_score"=>1}]
|
204
266
|
end
|
205
267
|
```
|
206
268
|
|
207
|
-
|
269
|
+
Use `:default_column` option.
|
208
270
|
|
209
271
|
```ruby
|
210
|
-
GrnMini::
|
272
|
+
GrnMini::tmpdb do
|
273
|
+
array = GrnMini::Array.new
|
274
|
+
|
211
275
|
array << {text: "txt", filename:"a.txt"}
|
212
276
|
array << {text: "txt", filename:"a.doc"}
|
213
277
|
array << {text: "txt", filename:"a.rb"}
|
@@ -229,7 +293,9 @@ See also [8.10.1. Query syntax](http://groonga.org/docs/reference/grn_expr/query
|
|
229
293
|
Specify column name to sort.
|
230
294
|
|
231
295
|
```ruby
|
232
|
-
GrnMini::
|
296
|
+
GrnMini::tmpdb do
|
297
|
+
array = GrnMini::Array.new
|
298
|
+
|
233
299
|
array << {name:"Tanaka", age: 11, height: 162.5}
|
234
300
|
array << {name:"Suzuki", age: 31, height: 170.0}
|
235
301
|
array << {name:"Hayashi", age: 21, height: 175.4}
|
@@ -263,7 +329,9 @@ sorted.map {|r| {name: r.name, age: r.age}}
|
|
263
329
|
Drill down aka.
|
264
330
|
|
265
331
|
```ruby
|
266
|
-
GrnMini::
|
332
|
+
GrnMini::tmpdb do
|
333
|
+
array = GrnMini::Array.new
|
334
|
+
|
267
335
|
array << {text:"aaaa.txt", suffix:"txt", type:1}
|
268
336
|
array << {text:"aaaa.doc", suffix:"doc", type:2}
|
269
337
|
array << {text:"aabb.txt", suffix:"txt", type:2}
|
@@ -279,13 +347,15 @@ end
|
|
279
347
|
Grouping from selection results.
|
280
348
|
|
281
349
|
```ruby
|
282
|
-
GrnMini::
|
350
|
+
GrnMini::tmpdb do
|
351
|
+
array = GrnMini::Array.new
|
352
|
+
|
283
353
|
array << {text:"aaaa", suffix:"txt"}
|
284
354
|
array << {text:"aaaa", suffix:"doc"}
|
285
355
|
array << {text:"aaaa", suffix:"txt"}
|
286
356
|
array << {text:"cccc", suffix:"txt"}
|
287
357
|
|
288
|
-
results = array.select("aa")
|
358
|
+
results = array.select("text:@aa")
|
289
359
|
groups = GrnMini::Util::group_with_sort(results, "suffix")
|
290
360
|
|
291
361
|
groups.size #=> 2
|
@@ -300,7 +370,9 @@ Display of keyword surrounding text. It is often used in search engine.
|
|
300
370
|
Use `GrnMini::Util::text_snippet_from_selection_results`.
|
301
371
|
|
302
372
|
```ruby
|
303
|
-
GrnMini::
|
373
|
+
GrnMini::tmpdb do
|
374
|
+
array = GrnMini::Array.new
|
375
|
+
|
304
376
|
array << {text: <<EOF, filename: "aaa.txt"}
|
305
377
|
[1] This is a pen pep pea pek pet.
|
306
378
|
------------------------------
|
@@ -314,7 +386,7 @@ GrnMini::Array.tmpdb do |array|
|
|
314
386
|
------------------------------
|
315
387
|
EOF
|
316
388
|
|
317
|
-
results = array.select("This pen")
|
389
|
+
results = array.select("text:@This pen")
|
318
390
|
snippet = GrnMini::Util::text_snippet_from_selection_results(results)
|
319
391
|
|
320
392
|
record = results.first
|
@@ -328,14 +400,16 @@ end
|
|
328
400
|
`GrnMini::Util::html_snippet_from_selection_results` is HTML escaped.
|
329
401
|
|
330
402
|
```ruby
|
331
|
-
GrnMini::
|
403
|
+
GrnMini::tmpdb do
|
404
|
+
array = GrnMini::Array.new
|
405
|
+
|
332
406
|
array << {text: <<EOF, filename: "aaa.txt"}
|
333
407
|
<html>
|
334
408
|
<div>This is a pen pep pea pek pet.</div>
|
335
409
|
</html>
|
336
410
|
EOF
|
337
411
|
|
338
|
-
results = array.select("This pen")
|
412
|
+
results = array.select("text:@This pen")
|
339
413
|
snippet = GrnMini::Util::html_snippet_from_selection_results(results, '<span class="strong">', '</span>') # Default value is '<strong>', '</strong>'
|
340
414
|
|
341
415
|
record = results.first
|
@@ -352,7 +426,9 @@ See also [Groonga::Expression#snippet](http://ranguba.org/rroonga/en/Groonga/Exp
|
|
352
426
|
#paginate is more convenient than #sort if you want a pagination.
|
353
427
|
|
354
428
|
```ruby
|
355
|
-
GrnMini::
|
429
|
+
GrnMini::tmpdb do
|
430
|
+
array = GrnMini::Array.new
|
431
|
+
|
356
432
|
array << {text: "aaaa", filename: "1.txt"}
|
357
433
|
array << {text: "aaaa aaaa", filename: "2a.txt"}
|
358
434
|
array << {text: "aaaa aaaa aaaa", filename: "3.txt"}
|
@@ -362,7 +438,7 @@ GrnMini::Array.tmpdb do |array|
|
|
362
438
|
array << {text: "aaaa aaaa", filename: "2e.txt"}
|
363
439
|
array << {text: "aaaa aaaa", filename: "2f.txt"}
|
364
440
|
|
365
|
-
results = array.select("aaaa")
|
441
|
+
results = array.select("text:@aaaa")
|
366
442
|
|
367
443
|
# -- page1 --
|
368
444
|
page_entries = results.paginate([["_score", :desc]], :page => 1, :size => 5)
|
@@ -395,3 +471,38 @@ end
|
|
395
471
|
|
396
472
|
See also [Groonga::Table#pagenate](http://ranguba.org/rroonga/en/Groonga/Table.html#paginate-instance_method)
|
397
473
|
|
474
|
+
## Cooperation between multiple tables
|
475
|
+
|
476
|
+
Micro blog sample.
|
477
|
+
|
478
|
+
```ruby
|
479
|
+
GrnMini::tmpdb do
|
480
|
+
users = GrnMini::Hash.new("Users")
|
481
|
+
articles = GrnMini::Hash.new("Articles")
|
482
|
+
|
483
|
+
users.setup_columns(name: "", favorites: [articles])
|
484
|
+
articles.setup_columns(author: users, text: "")
|
485
|
+
|
486
|
+
users["aaa"] = {name: "Mr.A"}
|
487
|
+
users["bbb"] = {name: "Mr.B"}
|
488
|
+
users["ccc"] = {name: "Mr.C"}
|
489
|
+
|
490
|
+
articles["aaa:1"] = {author: "aaa", text: "111"}
|
491
|
+
articles["aaa:2"] = {author: "aaa", text: "222"}
|
492
|
+
articles["aaa:3"] = {author: "aaa", text: "333"}
|
493
|
+
articles["bbb:1"] = {author: "bbb", text: "111"}
|
494
|
+
articles["bbb:2"] = {author: "bbb", text: "222"}
|
495
|
+
articles["ccc:1"] = {author: "ccc", text: "111"}
|
496
|
+
|
497
|
+
users["aaa"].favorites = ["aaa:1", "bbb:2"]
|
498
|
+
users["bbb"].favorites = ["aaa:2"]
|
499
|
+
users["ccc"].favorites = ["aaa:1", "bbb:1", "ccc:1"]
|
500
|
+
|
501
|
+
# Search record.favorites
|
502
|
+
users.select { |record| record.favorites == "aaa:1" } #=> ["aaa", "ccc"]
|
503
|
+
users.select { |record| record.favorites == "aaa:2" } #=> ["bbb"]
|
504
|
+
|
505
|
+
# Search record.favorites.text
|
506
|
+
users.select { |record| record.favorites.text =~ "111" } #=> ["aaa", "ccc"]
|
507
|
+
end
|
508
|
+
```
|
data/lib/grn_mini.rb
CHANGED
@@ -2,7 +2,24 @@ require "grn_mini/version"
|
|
2
2
|
require "grn_mini/array"
|
3
3
|
require "grn_mini/hash"
|
4
4
|
require "grn_mini/util"
|
5
|
+
require 'groonga'
|
6
|
+
require 'tmpdir'
|
5
7
|
|
6
8
|
module GrnMini
|
7
|
-
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def create_or_open(path)
|
12
|
+
unless File.exist?(path)
|
13
|
+
Groonga::Database.create(path: path)
|
14
|
+
else
|
15
|
+
Groonga::Database.open(path)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def tmpdb
|
20
|
+
Dir.mktmpdir do |dir|
|
21
|
+
create_or_open(File.join(dir, "tmp.db"))
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
8
25
|
end
|
data/lib/grn_mini/array.rb
CHANGED
@@ -1,81 +1,23 @@
|
|
1
|
-
require 'grn_mini/
|
2
|
-
require 'groonga'
|
3
|
-
require 'tmpdir'
|
1
|
+
require 'grn_mini/table'
|
4
2
|
|
5
3
|
module GrnMini
|
6
|
-
class
|
7
|
-
attr_accessor :grn
|
8
|
-
include Enumerable
|
4
|
+
class NotSupportColumnType < RuntimeError; end
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(path)
|
18
|
-
unless File.exist?(path)
|
19
|
-
Groonga::Database.create(path: path)
|
20
|
-
else
|
21
|
-
Groonga::Database.open(path)
|
22
|
-
end
|
23
|
-
|
24
|
-
unless Groonga["Array"]
|
25
|
-
@grn = Groonga::Array.create(name: "Array", persistent: true)
|
26
|
-
@terms = Groonga::PatriciaTrie.create(name: "Terms", key_normalize: true, default_tokenizer: "TokenBigramSplitSymbolAlphaDigit")
|
27
|
-
else
|
28
|
-
@grn = Groonga["Array"]
|
29
|
-
@terms = Groonga["Terms"]
|
30
|
-
end
|
6
|
+
class Array < Table
|
7
|
+
def initialize(name = "Array")
|
8
|
+
super(name,
|
9
|
+
Groonga[name] || Groonga::Array.create(name: name, persistent: true))
|
31
10
|
end
|
32
11
|
|
33
12
|
def add(hash)
|
34
|
-
|
35
|
-
hash.each do |key, value|
|
36
|
-
column = key.to_s
|
37
|
-
|
38
|
-
# @todo Need define_index_column ?
|
39
|
-
if value.is_a?(Time)
|
40
|
-
@grn.define_column(column, "Time")
|
41
|
-
elsif value.is_a?(Float)
|
42
|
-
@grn.define_column(column, "Float")
|
43
|
-
elsif value.is_a?(Numeric)
|
44
|
-
@grn.define_column(column, "Int32")
|
45
|
-
else
|
46
|
-
@grn.define_column(column, "ShortText")
|
47
|
-
@terms.define_index_column("array_#{column}", @grn, source: "Array.#{column}", with_position: true)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
13
|
+
setup_columns(hash) unless @setup_columns_once
|
52
14
|
@grn.add(hash)
|
53
15
|
end
|
54
16
|
|
55
17
|
alias << add
|
56
18
|
|
57
|
-
def select(query, options = {default_column: "text"})
|
58
|
-
@grn.select(query, options)
|
59
|
-
end
|
60
|
-
|
61
|
-
def size
|
62
|
-
@grn.size
|
63
|
-
end
|
64
|
-
|
65
|
-
alias length size
|
66
|
-
|
67
|
-
def empty?
|
68
|
-
size == 0
|
69
|
-
end
|
70
|
-
|
71
|
-
def each
|
72
|
-
@grn.each do |record|
|
73
|
-
yield record
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
19
|
class IdIsGreaterThanZero < RuntimeError; end
|
78
|
-
|
20
|
+
|
79
21
|
def [](id)
|
80
22
|
raise IdIsGreaterThanZero if id == 0
|
81
23
|
@grn[id]
|
@@ -89,13 +31,5 @@ module GrnMini
|
|
89
31
|
@grn.delete(id)
|
90
32
|
end
|
91
33
|
end
|
92
|
-
|
93
|
-
def sort(keys, options = {})
|
94
|
-
@grn.sort(keys, options)
|
95
|
-
end
|
96
|
-
|
97
|
-
def group(key, options = {})
|
98
|
-
@grn.group(key, options)
|
99
|
-
end
|
100
34
|
end
|
101
35
|
end
|