odba 1.1.8 → 1.2.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/.github/workflows/devenv.yml +30 -0
- data/.github/workflows/ruby.yml +8 -7
- data/.gitignore +11 -0
- data/{History.txt → History.md} +43 -19
- data/README.md +79 -2
- data/Rakefile +3 -15
- data/devenv.lock +171 -0
- data/devenv.nix +53 -0
- data/devenv.yaml +8 -0
- data/lib/odba/cache.rb +401 -344
- data/lib/odba/cache_entry.rb +42 -31
- data/lib/odba/connection_pool.rb +99 -72
- data/lib/odba/drbwrapper.rb +26 -18
- data/lib/odba/id_server.rb +20 -20
- data/lib/odba/index.rb +249 -215
- data/lib/odba/index_definition.rb +17 -17
- data/lib/odba/marshal.rb +15 -14
- data/lib/odba/odba.rb +40 -32
- data/lib/odba/odba_error.rb +4 -2
- data/lib/odba/persistable.rb +460 -414
- data/lib/odba/storage.rb +328 -277
- data/lib/odba/stub.rb +166 -153
- data/lib/odba/version.rb +1 -1
- data/lib/odba.rb +9 -9
- data/odba.gemspec +8 -3
- data/test/example.rb +47 -0
- data/test/helper.rb +6 -0
- data/test/suite.rb +7 -0
- data/test/test_array.rb +38 -33
- data/test/test_cache.rb +657 -622
- data/test/test_cache_entry.rb +51 -71
- data/test/test_connection_pool.rb +70 -25
- data/test/test_drbwrapper.rb +24 -19
- data/test/test_hash.rb +98 -89
- data/test/test_id_server.rb +30 -32
- data/test/test_index.rb +191 -158
- data/test/test_marshal.rb +15 -25
- data/test/test_persistable.rb +378 -369
- data/test/test_storage.rb +510 -471
- data/test/test_stub.rb +147 -135
- metadata +63 -20
- data/Guide.txt +0 -36
- data/Manifest.txt +0 -38
- data/install.rb +0 -1098
- data/lib/odba/18_19_loading_compatibility.rb +0 -77
data/test/test_storage.rb
CHANGED
|
@@ -1,233 +1,241 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
# TestStorage -- odba -- 10.05.2004 -- hwyss@ywesee.com rwaltert@ywesee.com mwalder@ywesee.com
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
$: << File.expand_path('../lib/', File.dirname(__FILE__))
|
|
7
|
-
|
|
8
|
-
require 'minitest/autorun'
|
|
9
|
-
require 'flexmock/test_unit'
|
|
10
|
-
require 'flexmock'
|
|
11
|
-
require 'odba/storage'
|
|
3
|
+
require_relative "helper"
|
|
4
|
+
require "odba/storage"
|
|
12
5
|
|
|
13
6
|
module ODBA
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
7
|
+
class Storage
|
|
8
|
+
public :restore_max_id
|
|
9
|
+
attr_writer :next_id
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class TestStorage < Test::Unit::TestCase
|
|
19
13
|
include FlexMock::TestCase
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
def setup
|
|
15
|
+
@storage = ODBA::Storage.instance
|
|
16
|
+
@dbi = flexmock("DBI")
|
|
17
|
+
@storage.dbi = @dbi
|
|
18
|
+
end
|
|
19
|
+
|
|
25
20
|
def teardown
|
|
26
21
|
super
|
|
27
22
|
end
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
|
|
24
|
+
def test_bulk_restore
|
|
25
|
+
dbi = flexmock("dbi")
|
|
26
|
+
array = [1, 23, 4]
|
|
27
|
+
@storage.dbi = dbi
|
|
28
|
+
dbi.should_receive(:select_all).times(1).and_return { |query|
|
|
29
|
+
refute_nil(query.index("IN (1,23,4)"))
|
|
30
|
+
[]
|
|
31
|
+
}
|
|
32
|
+
@storage.bulk_restore(array)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_delete_persistable
|
|
36
|
+
dbi = flexmock("dbi")
|
|
37
|
+
@storage.dbi = dbi
|
|
38
|
+
expected1 = <<-SQL
|
|
42
39
|
DELETE FROM object_connection WHERE origin_id = ?
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
SQL
|
|
41
|
+
dbi.should_receive(:do).once.with(expected1, 2).times(1).and_return do
|
|
42
|
+
assert true
|
|
43
|
+
end
|
|
44
|
+
expected2 = <<-SQL
|
|
48
45
|
DELETE FROM object_connection WHERE target_id = ?
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
SQL
|
|
47
|
+
dbi.should_receive(:do).once.with(expected2, 2).times(1).and_return do
|
|
48
|
+
assert true
|
|
49
|
+
end
|
|
50
|
+
expected3 = <<-SQL
|
|
54
51
|
DELETE FROM collection WHERE odba_id = ?
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
SQL
|
|
53
|
+
dbi.should_receive(:do).once.with(expected3, 2).times(1).and_return do
|
|
54
|
+
assert true
|
|
55
|
+
end
|
|
56
|
+
expected4 = <<-SQL
|
|
60
57
|
DELETE FROM object WHERE odba_id = ?
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
58
|
+
SQL
|
|
59
|
+
dbi.should_receive(:do).once.with(expected4, 2).times(1).and_return do
|
|
60
|
+
assert true
|
|
61
|
+
end
|
|
62
|
+
@storage.delete_persistable(2)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_restore_prefetchable
|
|
66
|
+
dbi = flexmock("dbi")
|
|
67
|
+
rows = flexmock("row")
|
|
68
|
+
@storage.dbi = dbi
|
|
69
|
+
dbi.should_receive(:select_all).times(1).and_return { |sql|
|
|
70
|
+
assert_equal("\t\t\t\tSELECT odba_id, content FROM object WHERE prefetchable = true\n", sql)
|
|
71
|
+
rows
|
|
72
|
+
}
|
|
73
|
+
@storage.restore_prefetchable
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_bulk_restore_empty
|
|
77
|
+
dbi = flexmock("dbi")
|
|
78
|
+
array = []
|
|
79
|
+
@storage.dbi = dbi
|
|
80
|
+
@storage.bulk_restore(array)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_create_index
|
|
84
|
+
dbi = flexmock("dbi")
|
|
85
|
+
@storage.dbi = dbi
|
|
86
|
+
sql = <<-SQL
|
|
87
87
|
CREATE INDEX IF NOT EXISTS origin_id_index_name
|
|
88
88
|
ON index_name(origin_id)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
89
|
+
SQL
|
|
90
|
+
dbi.should_receive(:do).times(1).with(sql).and_return do
|
|
91
|
+
assert true
|
|
92
|
+
end
|
|
93
|
+
sql = <<-SQL
|
|
94
94
|
CREATE INDEX IF NOT EXISTS search_term_index_name
|
|
95
95
|
ON index_name(search_term)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
96
|
+
SQL
|
|
97
|
+
dbi.should_receive(:do).times(1).with(sql).and_return do
|
|
98
|
+
assert true
|
|
99
|
+
end
|
|
100
|
+
sql = " DROP TABLE IF EXISTS index_name;\n"
|
|
101
|
+
dbi.should_receive(:do).once.with(sql)
|
|
102
|
+
sql = " CREATE INDEX IF NOT EXISTS target_id_index_name\n ON index_name(target_id)\n"
|
|
103
|
+
dbi.should_receive(:do).once.with(sql)
|
|
104
|
+
sql = " CREATE TABLE IF NOT EXISTS index_name (\n origin_id INTEGER,\n search_term TEXT,\n target_id INTEGER\n ) ;\n"
|
|
105
|
+
dbi.should_receive(:do).once.with(sql)
|
|
106
|
+
@storage.create_index("index_name")
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_next_id
|
|
110
|
+
@storage.next_id = 1
|
|
111
|
+
assert_equal(2, @storage.next_id)
|
|
112
|
+
assert_equal(3, @storage.next_id)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_store__1
|
|
116
|
+
dbi = flexmock("dbi")
|
|
117
|
+
@storage.dbi = dbi
|
|
118
|
+
dbi.should_receive(:select_one).times(1).and_return { |query, id|
|
|
119
|
+
assert_equal("SELECT name FROM object WHERE odba_id = ?",
|
|
120
|
+
query)
|
|
121
|
+
assert_equal(1, id)
|
|
122
|
+
nil
|
|
123
|
+
}
|
|
124
|
+
dbi.should_receive(:do).times(1).and_return { |query, id, dump, name, prefetch, klass|
|
|
125
|
+
expected = <<-SQL
|
|
124
126
|
INSERT INTO object (odba_id, content, name, prefetchable, extent)
|
|
125
127
|
VALUES (?, ?, ?, ?, ?)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
128
|
+
SQL
|
|
129
|
+
assert_equal(expected, query)
|
|
130
|
+
assert_equal(1, id)
|
|
131
|
+
assert_equal("foodump", dump)
|
|
132
|
+
assert_equal("foo", name)
|
|
133
|
+
assert_equal(true, prefetch)
|
|
134
|
+
assert_equal("FlexMock", klass)
|
|
135
|
+
}
|
|
136
|
+
@storage.store(1, "foodump", "foo", true, FlexMock)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_store__2
|
|
140
|
+
dbi = flexmock("dbi")
|
|
141
|
+
@storage.dbi = dbi
|
|
142
|
+
dbi.should_receive(:select_one).times(1).and_return { |query, id|
|
|
143
|
+
assert_equal("SELECT name FROM object WHERE odba_id = ?",
|
|
144
|
+
query)
|
|
145
|
+
assert_equal(1, id)
|
|
146
|
+
["name"]
|
|
147
|
+
}
|
|
148
|
+
dbi.should_receive(:do).times(1).and_return { |query, dump, name, prefetch, klass, id|
|
|
149
|
+
expected = <<-SQL
|
|
147
150
|
UPDATE object SET
|
|
148
151
|
content = ?,
|
|
149
152
|
name = ?,
|
|
150
153
|
prefetchable = ?,
|
|
151
154
|
extent = ?
|
|
152
155
|
WHERE odba_id = ?
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
156
|
+
SQL
|
|
157
|
+
assert_equal(expected, query)
|
|
158
|
+
assert_equal(1, id)
|
|
159
|
+
assert_equal("foodump", dump)
|
|
160
|
+
assert_equal("foo", name)
|
|
161
|
+
assert_equal(true, prefetch)
|
|
162
|
+
assert_equal("FlexMock", klass)
|
|
163
|
+
}
|
|
164
|
+
@storage.store(1, "foodump", "foo", true, FlexMock)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_store__3__name_only_set_in_db
|
|
168
|
+
dbi = flexmock("dbi")
|
|
169
|
+
@storage.dbi = dbi
|
|
170
|
+
dbi.should_receive(:select_one).times(1).and_return { |query, id|
|
|
171
|
+
assert_equal("SELECT name FROM object WHERE odba_id = ?",
|
|
172
|
+
query)
|
|
173
|
+
assert_equal(1, id)
|
|
174
|
+
{"name" => "name_in_db"}
|
|
175
|
+
}
|
|
176
|
+
dbi.should_receive(:do).times(1).and_return { |query, dump, name, prefetch, klass, id|
|
|
177
|
+
expected = <<-SQL
|
|
174
178
|
UPDATE object SET
|
|
175
179
|
content = ?,
|
|
176
180
|
name = ?,
|
|
177
181
|
prefetchable = ?,
|
|
178
182
|
extent = ?
|
|
179
183
|
WHERE odba_id = ?
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
184
|
+
SQL
|
|
185
|
+
assert_equal(expected, query)
|
|
186
|
+
assert_equal(1, id)
|
|
187
|
+
assert_equal("foodump", dump)
|
|
188
|
+
assert_equal("name_in_db", name)
|
|
189
|
+
assert_equal(true, prefetch)
|
|
190
|
+
assert_equal("FlexMock", klass)
|
|
191
|
+
}
|
|
192
|
+
@storage.store(1, "foodump", nil, true, FlexMock)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_restore
|
|
196
|
+
dbi = flexmock
|
|
197
|
+
@storage.dbi = dbi
|
|
198
|
+
dbi.should_receive(:select_one).times(1).and_return { |arg, name| ["dump"] }
|
|
199
|
+
assert_equal("dump", @storage.restore(1))
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def test_restore_named
|
|
203
|
+
dbi = flexmock
|
|
204
|
+
@storage.dbi = dbi
|
|
205
|
+
dbi.should_receive(:select_one).times(1).and_return { |arg, name| ["dump"] }
|
|
206
|
+
assert_equal("dump", @storage.restore_named("foo"))
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def test_max_id
|
|
210
|
+
dbi = flexmock
|
|
211
|
+
row = flexmock
|
|
212
|
+
@storage.dbi = dbi
|
|
213
|
+
dbi.should_receive(:select_one).and_return { |var|
|
|
214
|
+
row
|
|
215
|
+
}
|
|
216
|
+
# this test behaves differently, eg. run it with --seed 100 and --seed 34074
|
|
217
|
+
# As I have not time to find a work-around for the Singleton used in Storage
|
|
218
|
+
# I found a way to make test pass with both seeds
|
|
219
|
+
row.should_receive(:first).and_return { 23 }
|
|
220
|
+
result = [23, 3].index(@storage.max_id)
|
|
221
|
+
refute_nil(result)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def test_restore_max_id__nil
|
|
225
|
+
dbi = flexmock
|
|
226
|
+
row = flexmock
|
|
227
|
+
@storage.dbi = dbi
|
|
228
|
+
dbi.should_receive(:select_one).times(1).and_return { |var|
|
|
229
|
+
row
|
|
230
|
+
}
|
|
231
|
+
row.should_receive(:first).times(1).and_return {}
|
|
232
|
+
id = @storage.restore_max_id
|
|
233
|
+
assert_equal(0, id)
|
|
234
|
+
end
|
|
235
|
+
|
|
228
236
|
def test_retrieve
|
|
229
237
|
dbi = flexmock("dbi")
|
|
230
|
-
|
|
238
|
+
flexmock
|
|
231
239
|
@storage.dbi = dbi
|
|
232
240
|
sql = <<-SQL
|
|
233
241
|
SELECT target_id, COUNT(target_id) AS relevance
|
|
@@ -235,13 +243,14 @@ module ODBA
|
|
|
235
243
|
WHERE search_term LIKE ?
|
|
236
244
|
GROUP BY target_id
|
|
237
245
|
SQL
|
|
238
|
-
dbi.should_receive(:select_all).with(sql,
|
|
246
|
+
dbi.should_receive(:select_all).with(sql, "foo%")
|
|
239
247
|
.and_return { assert(true) }
|
|
240
|
-
@storage.retrieve_from_index("index","foo")
|
|
248
|
+
@storage.retrieve_from_index("index", "foo")
|
|
241
249
|
end
|
|
250
|
+
|
|
242
251
|
def test_retrieve_exact
|
|
243
252
|
dbi = flexmock("dbi")
|
|
244
|
-
|
|
253
|
+
flexmock
|
|
245
254
|
@storage.dbi = dbi
|
|
246
255
|
sql = <<-SQL
|
|
247
256
|
SELECT target_id, COUNT(target_id) AS relevance
|
|
@@ -249,13 +258,14 @@ module ODBA
|
|
|
249
258
|
WHERE search_term LIKE ?
|
|
250
259
|
GROUP BY target_id
|
|
251
260
|
SQL
|
|
252
|
-
dbi.should_receive(:select_all).with(sql,
|
|
261
|
+
dbi.should_receive(:select_all).with(sql, "foo")
|
|
253
262
|
.and_return { assert(true) }
|
|
254
|
-
@storage.retrieve_from_index("index","foo", true)
|
|
263
|
+
@storage.retrieve_from_index("index", "foo", true)
|
|
255
264
|
end
|
|
265
|
+
|
|
256
266
|
def test_retrieve_one
|
|
257
267
|
dbi = flexmock("dbi")
|
|
258
|
-
|
|
268
|
+
flexmock
|
|
259
269
|
@storage.dbi = dbi
|
|
260
270
|
sql = <<-SQL << " LIMIT 1"
|
|
261
271
|
SELECT target_id, COUNT(target_id) AS relevance
|
|
@@ -263,33 +273,35 @@ module ODBA
|
|
|
263
273
|
WHERE search_term LIKE ?
|
|
264
274
|
GROUP BY target_id
|
|
265
275
|
SQL
|
|
266
|
-
dbi.should_receive(:select_all).with(sql,
|
|
276
|
+
dbi.should_receive(:select_all).with(sql, "foo%")
|
|
267
277
|
.and_return { assert(true) }
|
|
268
|
-
@storage.retrieve_from_index("index","foo", false, 1)
|
|
278
|
+
@storage.retrieve_from_index("index", "foo", false, 1)
|
|
269
279
|
end
|
|
270
|
-
def test_update_index
|
|
271
|
-
dbi = flexmock("dbi")
|
|
272
|
-
rows = [3]
|
|
273
|
-
@storage.dbi = dbi
|
|
274
280
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
281
|
+
def test_update_index
|
|
282
|
+
dbi = flexmock("dbi")
|
|
283
|
+
@storage.dbi = dbi
|
|
284
|
+
|
|
285
|
+
# insert query
|
|
286
|
+
dbi.should_receive(:do).times(1).and_return { |sql, id, term, target_id|
|
|
287
|
+
refute_nil(sql.index("INSERT INTO"))
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
@storage.update_index("foo", 2, "baz", 3)
|
|
291
|
+
end
|
|
279
292
|
|
|
280
|
-
@storage.update_index("foo", 2,"baz", 3)
|
|
281
|
-
end
|
|
282
293
|
def test_update_index__without_target_id
|
|
283
|
-
sql = <<-
|
|
294
|
+
sql = <<-SQL
|
|
284
295
|
UPDATE index SET search_term=?
|
|
285
296
|
WHERE origin_id=?
|
|
286
297
|
SQL
|
|
287
|
-
|
|
288
|
-
@dbi.should_receive(:do).once.with(sql,
|
|
298
|
+
flexmock("StatementHandle")
|
|
299
|
+
@dbi.should_receive(:do).once.with(sql, "term", 2).times(1).and_return do
|
|
289
300
|
assert true
|
|
290
301
|
end
|
|
291
302
|
@storage.update_index("index", 2, "term", nil)
|
|
292
303
|
end
|
|
304
|
+
|
|
293
305
|
def test_delete_index_origin
|
|
294
306
|
dbi = flexmock("dbi")
|
|
295
307
|
@storage.dbi = dbi
|
|
@@ -301,250 +313,267 @@ module ODBA
|
|
|
301
313
|
dbi.should_receive(:do).and_return { |sql, id, term|
|
|
302
314
|
assert_equal(expected, sql)
|
|
303
315
|
assert_equal(2, id)
|
|
304
|
-
assert_equal(
|
|
316
|
+
assert_equal("search-term", term)
|
|
305
317
|
}
|
|
306
|
-
@storage.index_delete_origin("foo", 2,
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
318
|
+
@storage.index_delete_origin("foo", 2, "search-term")
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def test_retrieve_connected_objects
|
|
322
|
+
dbi = flexmock("dbi")
|
|
323
|
+
@storage.dbi = dbi
|
|
324
|
+
dbi.should_receive(:select_all).and_return { |sql, target_id|
|
|
325
|
+
refute_nil(sql.index("SELECT origin_id FROM object_connection"))
|
|
326
|
+
assert_equal(target_id, 1)
|
|
327
|
+
}
|
|
328
|
+
@storage.retrieve_connected_objects(1)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def test_index_delete_target
|
|
332
|
+
dbi = flexmock("dbi")
|
|
333
|
+
flexmock("sth")
|
|
334
|
+
@storage.dbi = dbi
|
|
335
|
+
sql = <<-SQL
|
|
322
336
|
DELETE FROM foo_index
|
|
323
337
|
WHERE origin_id = ?
|
|
324
338
|
AND search_term = ?
|
|
325
339
|
AND target_id = ?
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
340
|
+
SQL
|
|
341
|
+
dbi.should_receive(:do).once.with(sql, 6, "search-term", 5).times(1).and_return do
|
|
342
|
+
assert true
|
|
343
|
+
end
|
|
344
|
+
@storage.index_delete_target("foo_index", 6, "search-term", 5)
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def test_drop_index
|
|
348
|
+
dbi = flexmock("dbi")
|
|
349
|
+
@storage.dbi = dbi
|
|
350
|
+
sql = "DROP TABLE IF EXISTS foo_index"
|
|
351
|
+
dbi.should_receive(:do).once.with(sql).and_return do
|
|
352
|
+
assert true
|
|
353
|
+
end
|
|
354
|
+
@storage.drop_index("foo_index")
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
def test_retrieve_from_fulltext_index
|
|
358
|
+
dbi = flexmock("dbi")
|
|
359
|
+
@storage.dbi = dbi
|
|
360
|
+
dbi.should_receive(:select_all).and_return { |sql, d1, t1, d2, t2|
|
|
361
|
+
assert_equal('\(+\)-cloprostenolum&natricum', t1)
|
|
362
|
+
[]
|
|
363
|
+
}
|
|
364
|
+
@storage.retrieve_from_fulltext_index("index_name",
|
|
365
|
+
"(+)-cloprostenolum natricum", "default_german")
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def test_retrieve_from_fulltext_index__2
|
|
369
|
+
dbi = flexmock("dbi")
|
|
370
|
+
@storage.dbi = dbi
|
|
371
|
+
dbi.should_receive(:select_all).and_return { |sql, d1, t1, d2, t2|
|
|
372
|
+
assert_equal('phenylbutazonum&calcicum&\(2\:1\)', t1)
|
|
373
|
+
[]
|
|
374
|
+
}
|
|
375
|
+
@storage.retrieve_from_fulltext_index("index_name",
|
|
376
|
+
"phenylbutazonum&calcicum&(2:1)", "default_german")
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def test_retrieve_from_fulltext_index__umlaut
|
|
380
|
+
dbi = flexmock("dbi")
|
|
381
|
+
@storage.dbi = dbi
|
|
382
|
+
dbi.should_receive(:select_all).and_return { |sql, d1, t1, d2, t2|
|
|
383
|
+
assert_equal("dràgées&ähnlïch&kömprüssèn&ëtç", t1)
|
|
384
|
+
[]
|
|
385
|
+
}
|
|
386
|
+
@storage.retrieve_from_fulltext_index("index_name",
|
|
387
|
+
"dràgées ähnlïch kömprüssèn ëtç", "default_german")
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
def test_ensure_object_connections
|
|
391
|
+
dbi = flexmock("dbi")
|
|
392
|
+
@storage.dbi = dbi
|
|
393
|
+
sql = <<-SQL
|
|
375
394
|
SELECT target_id FROM object_connection
|
|
376
395
|
WHERE origin_id = ?
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
396
|
+
SQL
|
|
397
|
+
dbi.should_receive(:select_all).with(sql, 123).and_return {
|
|
398
|
+
assert(true)
|
|
399
|
+
[[1], [3], [5], [7], [9]]
|
|
400
|
+
}
|
|
401
|
+
sql = <<-SQL
|
|
383
402
|
DELETE FROM object_connection
|
|
384
403
|
WHERE origin_id = ? AND target_id IN (7,9)
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
404
|
+
SQL
|
|
405
|
+
dbi.should_receive(:do).once.with(sql, 123).and_return {
|
|
406
|
+
assert(true)
|
|
407
|
+
}
|
|
408
|
+
sql = <<-SQL
|
|
390
409
|
INSERT INTO object_connection (origin_id, target_id)
|
|
391
410
|
VALUES (?, ?)
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
411
|
+
SQL
|
|
412
|
+
sth = flexmock("sth")
|
|
413
|
+
dbi.should_receive(:prepare).with(sql).and_return(sth)
|
|
414
|
+
sth.should_receive(:execute).with(123, 2).times(1).and_return {
|
|
415
|
+
assert(true)
|
|
416
|
+
}
|
|
417
|
+
sth.should_receive(:execute).with(123, 4).times(1).and_return {
|
|
418
|
+
assert(true)
|
|
419
|
+
}
|
|
420
|
+
sth.should_receive(:execute).with(123, 6).times(1).and_return {
|
|
421
|
+
assert(true)
|
|
422
|
+
}
|
|
423
|
+
sth.should_receive(:finish).times(1)
|
|
424
|
+
@storage.ensure_object_connections(123, [1, 2, 2, 3, 4, 4, 5, 6, 6])
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def test_transaction_returns_blockval_even_if_dbi_does_not
|
|
428
|
+
@dbi.should_receive(:transaction).and_return { |block|
|
|
429
|
+
block.call({})
|
|
430
|
+
false
|
|
403
431
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
@dbi.should_receive(:transaction).and_return { |block|
|
|
409
|
-
block.call({})
|
|
410
|
-
false
|
|
411
|
-
}
|
|
412
|
-
res = @storage.transaction { "foo" }
|
|
413
|
-
assert_equal("foo", res)
|
|
414
|
-
end
|
|
432
|
+
res = @storage.transaction { "foo" }
|
|
433
|
+
assert_equal("foo", res)
|
|
434
|
+
end
|
|
435
|
+
|
|
415
436
|
def test_create_condition_index
|
|
416
437
|
definition = [
|
|
417
|
-
[:foo,
|
|
418
|
-
[:bar,
|
|
438
|
+
[:foo, "Integer"],
|
|
439
|
+
[:bar, "Date"]
|
|
419
440
|
]
|
|
420
|
-
sql =
|
|
421
|
-
CREATE TABLE IF NOT EXISTS conditions (
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
);
|
|
441
|
+
sql = <<~SQL
|
|
442
|
+
CREATE TABLE IF NOT EXISTS conditions (
|
|
443
|
+
origin_id INTEGER,
|
|
444
|
+
foo Integer,
|
|
445
|
+
bar Date,
|
|
446
|
+
target_id INTEGER
|
|
447
|
+
);
|
|
427
448
|
SQL
|
|
428
449
|
@dbi.should_receive(:do).once.with(sql).and_return do
|
|
429
450
|
assert true
|
|
430
451
|
end
|
|
431
|
-
sql =
|
|
432
|
-
CREATE INDEX IF NOT EXISTS origin_id_conditions ON conditions(origin_id);
|
|
452
|
+
sql = <<~SQL
|
|
453
|
+
CREATE INDEX IF NOT EXISTS origin_id_conditions ON conditions(origin_id);
|
|
433
454
|
SQL
|
|
434
455
|
@dbi.should_receive(:do).once.with(sql).and_return do
|
|
435
456
|
assert true
|
|
436
457
|
end
|
|
437
|
-
sql =
|
|
438
|
-
CREATE INDEX IF NOT EXISTS foo_conditions ON conditions(foo);
|
|
458
|
+
sql = <<~SQL
|
|
459
|
+
CREATE INDEX IF NOT EXISTS foo_conditions ON conditions(foo);
|
|
439
460
|
SQL
|
|
440
461
|
@dbi.should_receive(:do).once.with(sql).and_return do
|
|
441
462
|
assert true
|
|
442
463
|
end
|
|
443
|
-
sql =
|
|
444
|
-
CREATE INDEX IF NOT EXISTS bar_conditions ON conditions(bar);
|
|
464
|
+
sql = <<~SQL
|
|
465
|
+
CREATE INDEX IF NOT EXISTS bar_conditions ON conditions(bar);
|
|
445
466
|
SQL
|
|
446
467
|
@dbi.should_receive(:do).once.with(sql).and_return do
|
|
447
468
|
assert true
|
|
448
469
|
end
|
|
449
|
-
sql =
|
|
450
|
-
CREATE INDEX IF NOT EXISTS target_id_conditions ON conditions(target_id);
|
|
470
|
+
sql = <<~SQL
|
|
471
|
+
CREATE INDEX IF NOT EXISTS target_id_conditions ON conditions(target_id);
|
|
451
472
|
SQL
|
|
452
473
|
@dbi.should_receive(:do).once.with(sql).and_return do
|
|
453
474
|
assert true
|
|
454
475
|
end
|
|
455
|
-
@storage.create_condition_index(
|
|
476
|
+
@storage.create_condition_index("conditions", definition)
|
|
456
477
|
end
|
|
478
|
+
|
|
457
479
|
def test_create_fulltext_index
|
|
458
|
-
|
|
480
|
+
flexmock("StatementHandle")
|
|
459
481
|
@dbi.should_receive(:do).once.with("DROP TABLE IF EXISTS fulltext;\n")
|
|
460
482
|
sql = "CREATE INDEX IF NOT EXISTS origin_id_fulltext ON fulltext(origin_id);\n"
|
|
461
483
|
@dbi.should_receive(:do).once.with(sql).and_return
|
|
462
484
|
sql = "CREATE INDEX IF NOT EXISTS target_id_fulltext ON fulltext(target_id);\n"
|
|
463
485
|
@dbi.should_receive(:do).once.with(sql).and_return
|
|
464
|
-
sql = "CREATE TABLE IF NOT EXISTS fulltext (\n origin_id INTEGER,\n search_term tsvector,\n target_id INTEGER\n)
|
|
486
|
+
sql = "CREATE TABLE IF NOT EXISTS fulltext (\n origin_id INTEGER,\n search_term tsvector,\n target_id INTEGER\n) ;\n"
|
|
465
487
|
@dbi.should_receive(:do).once.with(sql).and_return
|
|
466
488
|
sql = "CREATE INDEX IF NOT EXISTS search_term_fulltext\nON fulltext USING gist(search_term);\n"
|
|
467
489
|
@dbi.should_receive(:do).once.with(sql).and_return
|
|
468
|
-
@storage.create_fulltext_index(
|
|
490
|
+
@storage.create_fulltext_index("fulltext")
|
|
469
491
|
end
|
|
492
|
+
|
|
470
493
|
def test_extent_ids
|
|
471
|
-
sql = <<-
|
|
494
|
+
sql = <<-SQL
|
|
472
495
|
SELECT odba_id FROM object WHERE extent = ?
|
|
473
496
|
SQL
|
|
474
|
-
@dbi.should_receive(:select_all).with(sql,
|
|
497
|
+
@dbi.should_receive(:select_all).with(sql, "Object").and_return {
|
|
475
498
|
[[1], [2], [3], [4], [5]]
|
|
476
499
|
}
|
|
477
|
-
expected = [1,2,3,4,5]
|
|
500
|
+
expected = [1, 2, 3, 4, 5]
|
|
478
501
|
assert_equal(expected, @storage.extent_ids(Object))
|
|
479
502
|
end
|
|
503
|
+
|
|
480
504
|
def test_collection_fetch
|
|
481
|
-
sql = <<-
|
|
505
|
+
sql = <<-SQL
|
|
482
506
|
SELECT value FROM collection
|
|
483
507
|
WHERE odba_id = ? AND key = ?
|
|
484
508
|
SQL
|
|
485
|
-
@dbi.should_receive(:select_one).with(sql, 34,
|
|
509
|
+
@dbi.should_receive(:select_one).with(sql, 34, "key_dump").and_return {
|
|
486
510
|
["dump"]
|
|
487
511
|
}
|
|
488
512
|
assert_equal("dump", @storage.collection_fetch(34, "key_dump"))
|
|
489
513
|
end
|
|
514
|
+
|
|
490
515
|
def test_collection_remove
|
|
491
|
-
sql = <<-
|
|
516
|
+
sql = <<-SQL
|
|
492
517
|
DELETE FROM collection
|
|
493
518
|
WHERE odba_id = ? AND key = ?
|
|
494
519
|
SQL
|
|
495
|
-
|
|
496
|
-
@dbi.should_receive(:do).once.with(sql, 34,
|
|
520
|
+
flexmock("StatementHandle")
|
|
521
|
+
@dbi.should_receive(:do).once.with(sql, 34, "key_dump").and_return do
|
|
497
522
|
assert true
|
|
498
523
|
end
|
|
499
524
|
@storage.collection_remove(34, "key_dump")
|
|
500
525
|
end
|
|
526
|
+
|
|
501
527
|
def test_collection_store
|
|
502
|
-
sql = <<-
|
|
528
|
+
sql = <<-SQL
|
|
503
529
|
INSERT INTO collection (odba_id, key, value)
|
|
504
530
|
VALUES (?, ?, ?)
|
|
505
531
|
SQL
|
|
506
|
-
|
|
507
|
-
@dbi.should_receive(:do).once.with(sql, 34,
|
|
532
|
+
flexmock("StatementHandle")
|
|
533
|
+
@dbi.should_receive(:do).once.with(sql, 34, "key_dump", "dump").and_return do
|
|
508
534
|
assert true
|
|
509
535
|
end
|
|
510
|
-
@storage.collection_store(34, "key_dump",
|
|
536
|
+
@storage.collection_store(34, "key_dump", "dump")
|
|
511
537
|
end
|
|
538
|
+
|
|
512
539
|
def test_index_fetch_keys
|
|
513
|
-
sql = <<-
|
|
540
|
+
sql = <<-SQL
|
|
514
541
|
SELECT DISTINCT search_term AS key
|
|
515
542
|
FROM index
|
|
516
543
|
ORDER BY key
|
|
517
544
|
SQL
|
|
518
|
-
@dbi.should_receive(:select_all).with(sql).and_return {
|
|
519
|
-
[[
|
|
545
|
+
@dbi.should_receive(:select_all).with(sql).and_return {
|
|
546
|
+
[["key1"], ["key2"], ["key3"]]
|
|
520
547
|
}
|
|
521
|
-
assert_equal(%w
|
|
522
|
-
|
|
523
|
-
sql = <<-
|
|
548
|
+
assert_equal(%w[key1 key2 key3],
|
|
549
|
+
@storage.index_fetch_keys("index"))
|
|
550
|
+
sql = <<-SQL
|
|
524
551
|
SELECT DISTINCT substr(search_term, 1, 2) AS key
|
|
525
552
|
FROM index
|
|
526
553
|
ORDER BY key
|
|
527
554
|
SQL
|
|
528
|
-
@dbi.should_receive(:select_all).with(sql).and_return {
|
|
529
|
-
[[
|
|
555
|
+
@dbi.should_receive(:select_all).with(sql).and_return {
|
|
556
|
+
[["k1"], ["k2"], ["k3"]]
|
|
530
557
|
}
|
|
531
|
-
assert_equal(%w
|
|
532
|
-
|
|
558
|
+
assert_equal(%w[k1 k2 k3],
|
|
559
|
+
@storage.index_fetch_keys("index", 2))
|
|
533
560
|
end
|
|
561
|
+
|
|
534
562
|
def test_index_target_ids
|
|
535
|
-
sql = <<-
|
|
563
|
+
sql = <<-SQL
|
|
536
564
|
SELECT DISTINCT target_id, search_term
|
|
537
565
|
FROM index
|
|
538
566
|
WHERE origin_id=?
|
|
539
567
|
SQL
|
|
540
|
-
@dbi.should_receive(:select_all).with(sql, 5).and_return {
|
|
541
|
-
[[1,
|
|
568
|
+
@dbi.should_receive(:select_all).with(sql, 5).and_return {
|
|
569
|
+
[[1, "search-term"], [2, "search-term"], [3, "search-term"]]
|
|
542
570
|
}
|
|
543
|
-
expected = [[1,
|
|
544
|
-
assert_equal(expected, @storage.index_target_ids(
|
|
571
|
+
expected = [[1, "search-term"], [2, "search-term"], [3, "search-term"]]
|
|
572
|
+
assert_equal(expected, @storage.index_target_ids("index", 5))
|
|
545
573
|
end
|
|
574
|
+
|
|
546
575
|
def test_retrieve_from_condition_index
|
|
547
|
-
sql = <<-
|
|
576
|
+
sql = <<-SQL
|
|
548
577
|
SELECT target_id, COUNT(target_id) AS relevance
|
|
549
578
|
FROM index
|
|
550
579
|
WHERE TRUE
|
|
@@ -554,78 +583,85 @@ CREATE INDEX IF NOT EXISTS target_id_conditions ON conditions(target_id);
|
|
|
554
583
|
AND cond4 > ?
|
|
555
584
|
GROUP BY target_id
|
|
556
585
|
SQL
|
|
557
|
-
@dbi.should_receive(:select_all)
|
|
558
|
-
.with(sql,
|
|
586
|
+
@dbi.should_receive(:select_all)
|
|
587
|
+
.with(sql, "foo", "bar%", "5").and_return {
|
|
559
588
|
assert(true)
|
|
560
589
|
}
|
|
561
590
|
conds = [
|
|
562
|
-
[
|
|
563
|
-
[
|
|
564
|
-
[
|
|
565
|
-
[
|
|
591
|
+
["cond1", "foo"],
|
|
592
|
+
["cond2", nil],
|
|
593
|
+
["cond3", {"condition" => "LIKE", "value" => "bar"}],
|
|
594
|
+
["cond4", {"condition" => ">", "value" => 5}]
|
|
566
595
|
]
|
|
567
|
-
@storage.retrieve_from_condition_index(
|
|
568
|
-
sql <<
|
|
569
|
-
@dbi.should_receive(:select_all)
|
|
570
|
-
.with(sql,
|
|
596
|
+
@storage.retrieve_from_condition_index("index", conds)
|
|
597
|
+
sql << " LIMIT 1"
|
|
598
|
+
@dbi.should_receive(:select_all)
|
|
599
|
+
.with(sql, "foo", "bar%", 5).and_return {
|
|
571
600
|
assert(true)
|
|
572
601
|
}
|
|
573
|
-
@storage.retrieve_from_condition_index(
|
|
602
|
+
@storage.retrieve_from_condition_index("index", conds, 1)
|
|
574
603
|
end
|
|
604
|
+
|
|
575
605
|
def test_setup__object
|
|
576
|
-
tables = %w
|
|
606
|
+
tables = %w[object_connection collection]
|
|
577
607
|
@dbi.should_receive(:tables).and_return(tables)
|
|
578
|
-
sql =
|
|
579
|
-
CREATE TABLE IF NOT EXISTS object (
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
);
|
|
584
|
-
CREATE INDEX IF NOT EXISTS prefetchable_index ON object(prefetchable);
|
|
585
|
-
CREATE INDEX IF NOT EXISTS extent_index ON object(extent);
|
|
608
|
+
sql = <<~SQL
|
|
609
|
+
CREATE TABLE IF NOT EXISTS object (
|
|
610
|
+
odba_id INTEGER NOT NULL, content TEXT,
|
|
611
|
+
name TEXT, prefetchable BOOLEAN, extent TEXT,
|
|
612
|
+
PRIMARY KEY(odba_id), UNIQUE(name)
|
|
613
|
+
);
|
|
614
|
+
CREATE INDEX IF NOT EXISTS prefetchable_index ON object(prefetchable);
|
|
615
|
+
CREATE INDEX IF NOT EXISTS extent_index ON object(extent);
|
|
586
616
|
SQL
|
|
587
617
|
@dbi.should_receive(:execute).with(sql).and_return {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
col
|
|
618
|
+
assert(true)
|
|
619
|
+
}
|
|
620
|
+
col = flexmock("Column")
|
|
621
|
+
col.should_receive(:name).and_return("extent")
|
|
591
622
|
@dbi.should_receive(:columns).and_return([col])
|
|
592
623
|
@storage.setup
|
|
593
624
|
end
|
|
625
|
+
|
|
594
626
|
def test_setup__object_connection
|
|
595
|
-
tables = %w
|
|
627
|
+
tables = %w[object collection]
|
|
596
628
|
@dbi.should_receive(:tables).and_return(tables)
|
|
597
|
-
sql =
|
|
598
|
-
CREATE TABLE IF NOT EXISTS object_connection (
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
);
|
|
602
|
-
CREATE INDEX IF NOT EXISTS target_id_index ON object_connection(target_id);
|
|
629
|
+
sql = <<~SQL
|
|
630
|
+
CREATE TABLE IF NOT EXISTS object_connection (
|
|
631
|
+
origin_id integer, target_id integer,
|
|
632
|
+
PRIMARY KEY(origin_id, target_id)
|
|
633
|
+
);
|
|
634
|
+
CREATE INDEX IF NOT EXISTS target_id_index ON object_connection(target_id);
|
|
603
635
|
SQL
|
|
604
636
|
@dbi.should_receive(:execute).with(sql).and_return {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
col
|
|
637
|
+
assert(true)
|
|
638
|
+
}
|
|
639
|
+
col = flexmock("Column")
|
|
640
|
+
col.should_receive(:name).and_return("extent")
|
|
608
641
|
@dbi.should_receive(:columns).and_return([col])
|
|
609
642
|
@storage.setup
|
|
610
643
|
end
|
|
644
|
+
|
|
611
645
|
def test_setup__collection
|
|
612
|
-
tables = %w
|
|
646
|
+
tables = %w[object object_connection]
|
|
613
647
|
@dbi.should_receive(:tables).and_return(tables)
|
|
614
|
-
sql =
|
|
615
|
-
CREATE TABLE IF NOT EXISTS collection (
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
);
|
|
648
|
+
sql = <<~SQL
|
|
649
|
+
CREATE TABLE IF NOT EXISTS collection (
|
|
650
|
+
odba_id integer NOT NULL, key text, value text,
|
|
651
|
+
PRIMARY KEY(odba_id, key)
|
|
652
|
+
);
|
|
619
653
|
SQL
|
|
620
654
|
@dbi.should_receive(:execute).with(sql).and_return {
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
col
|
|
655
|
+
assert(true)
|
|
656
|
+
}
|
|
657
|
+
col = flexmock("Column")
|
|
658
|
+
col.should_receive(:name).and_return("extent")
|
|
624
659
|
@dbi.should_receive(:columns).and_return([col])
|
|
625
660
|
@storage.setup
|
|
626
661
|
end
|
|
662
|
+
|
|
627
663
|
def test_setup__extent
|
|
628
|
-
tables = %w
|
|
664
|
+
tables = %w[object object_connection collection]
|
|
629
665
|
@dbi.should_receive(:tables).and_return(tables)
|
|
630
666
|
sql = "CREATE TABLE IF NOT EXISTS object_connection (\n origin_id integer, target_id integer,\n PRIMARY KEY(origin_id, target_id)\n);\n"
|
|
631
667
|
@dbi.should_receive(:do).once.with(sql).and_return(true)
|
|
@@ -637,159 +673,162 @@ CREATE TABLE IF NOT EXISTS collection (
|
|
|
637
673
|
@dbi.should_receive(:columns).and_return([])
|
|
638
674
|
@storage.setup
|
|
639
675
|
end
|
|
676
|
+
|
|
640
677
|
def test_update_condition_index__with_target_id
|
|
641
|
-
|
|
642
|
-
sql =
|
|
643
|
-
INSERT INTO index (origin_id, target_id, foo, bar)
|
|
644
|
-
VALUES (?, ?, ?, ?)
|
|
678
|
+
flexmock("StatementHandle")
|
|
679
|
+
sql = <<~SQL
|
|
680
|
+
INSERT INTO index (origin_id, target_id, foo, bar)
|
|
681
|
+
VALUES (?, ?, ?, ?)
|
|
645
682
|
SQL
|
|
646
|
-
@dbi.should_receive(:do).once.with(sql, 12, 15, 14,
|
|
683
|
+
@dbi.should_receive(:do).once.with(sql, 12, 15, 14, "blur").times(1).and_return {
|
|
647
684
|
assert(true)
|
|
648
685
|
}
|
|
649
686
|
terms = [
|
|
650
|
-
[
|
|
651
|
-
[
|
|
687
|
+
["foo", 14],
|
|
688
|
+
["bar", "blur"]
|
|
652
689
|
]
|
|
653
|
-
@storage.update_condition_index(
|
|
690
|
+
@storage.update_condition_index("index", 12, terms, 15)
|
|
654
691
|
end
|
|
692
|
+
|
|
655
693
|
def test_update_condition_index__without_target_id
|
|
656
|
-
|
|
657
|
-
sql =
|
|
658
|
-
UPDATE index SET foo=?, bar=?
|
|
659
|
-
WHERE origin_id = ?
|
|
694
|
+
flexmock("StatementHandle")
|
|
695
|
+
sql = <<~SQL
|
|
696
|
+
UPDATE index SET foo=?, bar=?
|
|
697
|
+
WHERE origin_id = ?
|
|
660
698
|
SQL
|
|
661
|
-
@dbi.should_receive(:do).once.with(sql, 14,
|
|
699
|
+
@dbi.should_receive(:do).once.with(sql, 14, "blur", 12).times(1).and_return {
|
|
662
700
|
assert(true)
|
|
663
701
|
}
|
|
664
702
|
terms = [
|
|
665
|
-
[
|
|
666
|
-
[
|
|
703
|
+
["foo", 14],
|
|
704
|
+
["bar", "blur"]
|
|
667
705
|
]
|
|
668
|
-
@storage.update_condition_index(
|
|
706
|
+
@storage.update_condition_index("index", 12, terms, nil)
|
|
669
707
|
end
|
|
708
|
+
|
|
670
709
|
def test_update_fulltext_index__with_target_id
|
|
671
|
-
|
|
710
|
+
flexmock("StatementHandle")
|
|
672
711
|
sql = "INSERT INTO index (origin_id, search_term, target_id)\nVALUES (?, to_tsvector(?), ?)\n"
|
|
673
712
|
@dbi.should_receive(:do).once.with(sql, "12", "some text", 15)
|
|
674
|
-
@storage.update_fulltext_index(
|
|
713
|
+
@storage.update_fulltext_index("index", 12, "some text", 15)
|
|
675
714
|
end
|
|
715
|
+
|
|
676
716
|
def test_update_fulltext_index__without_target_id
|
|
677
|
-
|
|
717
|
+
flexmock("StatementHandle")
|
|
678
718
|
sql = "UPDATE index SET search_term=to_tsvector(?)\nWHERE origin_id=?\n"
|
|
679
719
|
@dbi.should_receive(:do).once.with(sql, "some text", 12).and_return {
|
|
680
720
|
assert(true)
|
|
681
721
|
}
|
|
682
|
-
@storage.update_fulltext_index(
|
|
722
|
+
@storage.update_fulltext_index("index", 12, "some text", nil)
|
|
683
723
|
end
|
|
724
|
+
|
|
684
725
|
def test_condition_index_delete
|
|
685
|
-
sql =
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
sql = "DELETE FROM index WHERE origin_id = ? AND c2 = ? AND c1 = ?"
|
|
690
|
-
@dbi.should_receive(:do).once.with(sql.chomp, 3, 7, 'f').times(1).and_return(true)
|
|
691
|
-
else
|
|
692
|
-
sql = "DELETE FROM index WHERE origin_id = ? AND c1 = ? AND c2 = ?"
|
|
693
|
-
@dbi.should_receive(:do).once.with(sql.chomp, 3, 'f', 7).times(1).and_return(true)
|
|
694
|
-
end
|
|
695
|
-
handle = flexmock('DBHandle')
|
|
696
|
-
@storage.condition_index_delete('index', 3, {'c1' => 'f','c2' => 7})
|
|
726
|
+
sql = "DELETE FROM index WHERE origin_id = ? AND c1 = ? AND c2 = ?"
|
|
727
|
+
@dbi.should_receive(:do).once.with(sql.chomp, 3, "f", 7).times(1).and_return(true)
|
|
728
|
+
flexmock("DBHandle")
|
|
729
|
+
@storage.condition_index_delete("index", 3, {"c1" => "f", "c2" => 7})
|
|
697
730
|
end
|
|
731
|
+
|
|
698
732
|
def test_condition_index_delete__with_target_id
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
else
|
|
704
|
-
sql = "DELETE FROM index WHERE origin_id = ? AND c1 = ? AND c2 = ? AND target_id = ?"
|
|
705
|
-
@dbi.should_receive(:do).once.with(sql.chomp, 3, 'f', 7, 4).times(1).and_return(true)
|
|
706
|
-
end
|
|
707
|
-
@storage.condition_index_delete('index', 3, {'c1' => 'f','c2' => 7}, 4)
|
|
733
|
+
flexmock("DBHandle")
|
|
734
|
+
sql = "DELETE FROM index WHERE origin_id = ? AND c1 = ? AND c2 = ? AND target_id = ?"
|
|
735
|
+
@dbi.should_receive(:do).once.with(sql.chomp, 3, "f", 7, 4).times(1).and_return(true)
|
|
736
|
+
@storage.condition_index_delete("index", 3, {"c1" => "f", "c2" => 7}, 4)
|
|
708
737
|
end
|
|
738
|
+
|
|
709
739
|
def test_condition_index_ids__origin_id
|
|
710
740
|
sql = <<-SQL
|
|
711
741
|
SELECT DISTINCT *
|
|
712
742
|
FROM index
|
|
713
743
|
WHERE origin_id=?
|
|
714
744
|
SQL
|
|
715
|
-
@dbi.should_receive(:select_all).with(sql, 5)
|
|
745
|
+
@dbi.should_receive(:select_all).with(sql, 5)
|
|
716
746
|
.times(1).and_return { assert(true) }
|
|
717
|
-
@storage.condition_index_ids(
|
|
747
|
+
@storage.condition_index_ids("index", 5, "origin_id")
|
|
718
748
|
end
|
|
749
|
+
|
|
719
750
|
def test_condition_index_ids__target_id
|
|
720
751
|
sql = <<-SQL
|
|
721
752
|
SELECT DISTINCT *
|
|
722
753
|
FROM index
|
|
723
754
|
WHERE target_id=?
|
|
724
755
|
SQL
|
|
725
|
-
@dbi.should_receive(:select_all).with(sql, 5)
|
|
756
|
+
@dbi.should_receive(:select_all).with(sql, 5)
|
|
726
757
|
.times(1).and_return { assert(true) }
|
|
727
|
-
@storage.condition_index_ids(
|
|
758
|
+
@storage.condition_index_ids("index", 5, "target_id")
|
|
728
759
|
end
|
|
760
|
+
|
|
729
761
|
def test_ensure_target_id_index
|
|
730
762
|
sql = <<-SQL
|
|
731
763
|
CREATE INDEX IF NOT EXISTS target_id_index
|
|
732
764
|
ON index(target_id)
|
|
733
765
|
SQL
|
|
734
|
-
@dbi.should_receive(:execute).with(sql).and_return {
|
|
735
|
-
|
|
736
|
-
|
|
766
|
+
@dbi.should_receive(:execute).with(sql).and_return {
|
|
767
|
+
raise DBI::Error
|
|
768
|
+
}
|
|
769
|
+
@storage.ensure_target_id_index("index")
|
|
737
770
|
end
|
|
771
|
+
|
|
738
772
|
def test_fulltext_index_delete__origin
|
|
739
773
|
sql = <<-SQL
|
|
740
774
|
DELETE FROM index
|
|
741
775
|
WHERE origin_id = ?
|
|
742
776
|
SQL
|
|
743
|
-
@dbi.should_receive(:do).once.with(sql, 4)
|
|
777
|
+
@dbi.should_receive(:do).once.with(sql, 4)
|
|
744
778
|
.times(1).and_return { assert(true) }
|
|
745
|
-
@storage.fulltext_index_delete(
|
|
779
|
+
@storage.fulltext_index_delete("index", 4, "origin_id")
|
|
746
780
|
end
|
|
781
|
+
|
|
747
782
|
def test_fulltext_index_delete__target
|
|
748
783
|
sql = <<-SQL
|
|
749
784
|
DELETE FROM index
|
|
750
785
|
WHERE target_id = ?
|
|
751
786
|
SQL
|
|
752
|
-
@dbi.should_receive(:do).once.with(sql, 4)
|
|
787
|
+
@dbi.should_receive(:do).once.with(sql, 4)
|
|
753
788
|
.times(1).and_return { assert(true) }
|
|
754
|
-
@storage.fulltext_index_delete(
|
|
789
|
+
@storage.fulltext_index_delete("index", 4, "target_id")
|
|
755
790
|
end
|
|
791
|
+
|
|
756
792
|
def test_fulltext_index_target_ids
|
|
757
793
|
sql = <<-SQL
|
|
758
794
|
SELECT DISTINCT target_id
|
|
759
795
|
FROM index
|
|
760
796
|
WHERE origin_id=?
|
|
761
797
|
SQL
|
|
762
|
-
@dbi.should_receive(:select_all).with(sql, 4)
|
|
798
|
+
@dbi.should_receive(:select_all).with(sql, 4)
|
|
763
799
|
.times(1).and_return { assert(true) }
|
|
764
|
-
@storage.fulltext_index_target_ids(
|
|
800
|
+
@storage.fulltext_index_target_ids("index", 4)
|
|
765
801
|
end
|
|
802
|
+
|
|
766
803
|
def test_index_origin_ids
|
|
767
804
|
sql = <<-SQL
|
|
768
805
|
SELECT DISTINCT origin_id, search_term
|
|
769
806
|
FROM index
|
|
770
807
|
WHERE target_id=?
|
|
771
808
|
SQL
|
|
772
|
-
@dbi.should_receive(:select_all).with(sql, 4)
|
|
809
|
+
@dbi.should_receive(:select_all).with(sql, 4)
|
|
773
810
|
.times(1).and_return { assert(true) }
|
|
774
|
-
@storage.index_origin_ids(
|
|
811
|
+
@storage.index_origin_ids("index", 4)
|
|
775
812
|
end
|
|
813
|
+
|
|
776
814
|
def test_delete_index_element__origin
|
|
777
|
-
|
|
815
|
+
flexmock("DB-Handle")
|
|
778
816
|
@dbi.should_receive(:do).once.with(<<-SQL, 15).times(1).and_return {
|
|
779
817
|
DELETE FROM index WHERE origin_id = ?
|
|
780
818
|
SQL
|
|
781
819
|
assert(true)
|
|
782
820
|
}
|
|
783
|
-
@storage.delete_index_element(
|
|
821
|
+
@storage.delete_index_element("index", 15, "origin_id")
|
|
784
822
|
end
|
|
823
|
+
|
|
785
824
|
def test_delete_index_element__target
|
|
786
|
-
|
|
825
|
+
flexmock("DB-Handle")
|
|
787
826
|
@dbi.should_receive(:do).once.with(<<-SQL, 15).times(1).and_return {
|
|
788
827
|
DELETE FROM index WHERE target_id = ?
|
|
789
828
|
SQL
|
|
790
829
|
assert(true)
|
|
791
830
|
}
|
|
792
|
-
@storage.delete_index_element(
|
|
831
|
+
@storage.delete_index_element("index", 15, "target_id")
|
|
793
832
|
end
|
|
794
|
-
|
|
833
|
+
end
|
|
795
834
|
end
|