ohm 1.0.1 → 1.0.2
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.
- data/lib/ohm.rb +45 -19
- data/test/indices.rb +32 -0
- data/test/model.rb +2 -1
- metadata +31 -11
data/lib/ohm.rb
CHANGED
@@ -1286,27 +1286,34 @@ module Ohm
|
|
1286
1286
|
def __save__
|
1287
1287
|
Transaction.new do |t|
|
1288
1288
|
t.watch(*_unique_keys)
|
1289
|
-
|
1289
|
+
|
1290
|
+
if not new?
|
1291
|
+
t.watch(key)
|
1292
|
+
t.watch(key[:_indices]) if model.indices.any?
|
1293
|
+
t.watch(key[:_uniques]) if model.uniques.any?
|
1294
|
+
end
|
1290
1295
|
|
1291
1296
|
t.before do
|
1292
1297
|
_initialize_id if new?
|
1293
1298
|
end
|
1294
1299
|
|
1295
|
-
|
1300
|
+
_uniques = nil
|
1296
1301
|
uniques = nil
|
1302
|
+
_indices = nil
|
1297
1303
|
indices = nil
|
1298
1304
|
|
1299
1305
|
t.read do
|
1300
1306
|
_verify_uniques
|
1301
|
-
|
1307
|
+
_uniques = db.hgetall(key[:_uniques])
|
1308
|
+
_indices = db.smembers(key[:_indices])
|
1302
1309
|
uniques = _read_index_type(:uniques)
|
1303
1310
|
indices = _read_index_type(:indices)
|
1304
1311
|
end
|
1305
1312
|
|
1306
1313
|
t.write do
|
1307
1314
|
db.sadd(model.key[:all], id)
|
1308
|
-
_delete_uniques(
|
1309
|
-
_delete_indices(
|
1315
|
+
_delete_uniques(_uniques)
|
1316
|
+
_delete_indices(_indices)
|
1310
1317
|
_save
|
1311
1318
|
_save_indices(indices)
|
1312
1319
|
_save_uniques(uniques)
|
@@ -1324,13 +1331,23 @@ module Ohm
|
|
1324
1331
|
#
|
1325
1332
|
def delete
|
1326
1333
|
transaction do |t|
|
1327
|
-
|
1328
|
-
|
1334
|
+
_uniques = nil
|
1335
|
+
_indices = nil
|
1336
|
+
|
1337
|
+
t.watch(*_unique_keys)
|
1338
|
+
|
1339
|
+
t.watch(key)
|
1340
|
+
t.watch(key[:_indices]) if model.indices.any?
|
1341
|
+
t.watch(key[:_uniques]) if model.uniques.any?
|
1342
|
+
|
1343
|
+
t.read do
|
1344
|
+
_uniques = db.hgetall(key[:_uniques])
|
1345
|
+
_indices = db.smembers(key[:_indices])
|
1329
1346
|
end
|
1330
1347
|
|
1331
|
-
t.write do
|
1332
|
-
_delete_uniques(
|
1333
|
-
_delete_indices(
|
1348
|
+
t.write do
|
1349
|
+
_delete_uniques(_uniques)
|
1350
|
+
_delete_indices(_indices)
|
1334
1351
|
model.collections.each { |e| db.del(key[e]) }
|
1335
1352
|
db.srem(model.key[:all], id)
|
1336
1353
|
db.del(key[:counters])
|
@@ -1470,28 +1487,37 @@ module Ohm
|
|
1470
1487
|
|
1471
1488
|
def _save_uniques(uniques)
|
1472
1489
|
uniques.each do |att, val|
|
1473
|
-
|
1490
|
+
unique = model.key[:uniques][att]
|
1491
|
+
|
1492
|
+
db.hset(unique, val, id)
|
1493
|
+
db.hset(key[:_uniques], unique, val)
|
1474
1494
|
end
|
1475
1495
|
end
|
1476
1496
|
|
1477
|
-
def _delete_uniques(
|
1478
|
-
|
1479
|
-
db.hdel(
|
1497
|
+
def _delete_uniques(_uniques)
|
1498
|
+
_uniques.each do |unique, val|
|
1499
|
+
db.hdel(unique, val)
|
1500
|
+
db.hdel(key[:_uniques], unique)
|
1480
1501
|
end
|
1481
1502
|
end
|
1482
1503
|
|
1483
|
-
def _delete_indices(
|
1484
|
-
|
1485
|
-
|
1486
|
-
|
1487
|
-
db.srem(model.key[:indices][att][val], id)
|
1504
|
+
def _delete_indices(_indices)
|
1505
|
+
_indices.each do |index|
|
1506
|
+
db.srem(index, id)
|
1507
|
+
db.srem(key[:_indices], index)
|
1488
1508
|
end
|
1509
|
+
# model.indices.each do |att|
|
1510
|
+
# val = atts[att.to_s]
|
1511
|
+
|
1512
|
+
# db.srem(model.key[:indices][att][val], id)
|
1513
|
+
# end
|
1489
1514
|
end
|
1490
1515
|
|
1491
1516
|
def _save_indices(indices)
|
1492
1517
|
indices.each do |att, val|
|
1493
1518
|
model.toindices(att, val).each do |index|
|
1494
1519
|
db.sadd(index, id)
|
1520
|
+
db.sadd(key[:_indices], index)
|
1495
1521
|
end
|
1496
1522
|
end
|
1497
1523
|
end
|
data/test/indices.rb
CHANGED
@@ -95,3 +95,35 @@ test "allow indexing by an arbitrary attribute" do
|
|
95
95
|
assert [@user1, @user2] == gmail.sort_by { |u| u.id }
|
96
96
|
assert [@user3] == User.find(:email_provider => "yahoo.com").to_a
|
97
97
|
end
|
98
|
+
|
99
|
+
scope do
|
100
|
+
# Just to give more context around this bug, basically it happens
|
101
|
+
# when you define a virtual unique or index.
|
102
|
+
#
|
103
|
+
# Previously it was unable to cleanup the indices mainly because
|
104
|
+
# it relied on the attributes being set.
|
105
|
+
class Node < Ohm::Model
|
106
|
+
index :available
|
107
|
+
attribute :capacity
|
108
|
+
|
109
|
+
unique :available
|
110
|
+
|
111
|
+
def available
|
112
|
+
capacity.to_i <= 90
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
test "index bug" do
|
117
|
+
n = Node.create
|
118
|
+
n.update(capacity: 91)
|
119
|
+
|
120
|
+
assert_equal 0, Node.find(available: true).size
|
121
|
+
end
|
122
|
+
|
123
|
+
test "uniques bug" do
|
124
|
+
n = Node.create
|
125
|
+
n.update(capacity: 91)
|
126
|
+
|
127
|
+
assert_equal nil, Node.with(:available, true)
|
128
|
+
end
|
129
|
+
end
|
data/test/model.rb
CHANGED
@@ -347,7 +347,8 @@ test "be no leftover keys" do
|
|
347
347
|
assert_equal [], Ohm.redis.keys("*")
|
348
348
|
|
349
349
|
Foo.create(:name => "Bar")
|
350
|
-
expected = %w[Foo:1 Foo:all Foo:id Foo:indices:name:Bar]
|
350
|
+
expected = %w[Foo:1 Foo:1:_indices Foo:all Foo:id Foo:indices:name:Bar]
|
351
|
+
|
351
352
|
assert expected.sort == Ohm.redis.keys("*").sort
|
352
353
|
|
353
354
|
Foo[1].delete
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-05-
|
14
|
+
date: 2012-05-25 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: redis
|
18
|
-
requirement:
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
@@ -23,10 +23,15 @@ dependencies:
|
|
23
23
|
version: '2.2'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements:
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '2.2'
|
27
32
|
- !ruby/object:Gem::Dependency
|
28
33
|
name: nest
|
29
|
-
requirement:
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
30
35
|
none: false
|
31
36
|
requirements:
|
32
37
|
- - ~>
|
@@ -34,10 +39,15 @@ dependencies:
|
|
34
39
|
version: '1.0'
|
35
40
|
type: :runtime
|
36
41
|
prerelease: false
|
37
|
-
version_requirements:
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
38
48
|
- !ruby/object:Gem::Dependency
|
39
49
|
name: scrivener
|
40
|
-
requirement:
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
41
51
|
none: false
|
42
52
|
requirements:
|
43
53
|
- - ~>
|
@@ -45,10 +55,15 @@ dependencies:
|
|
45
55
|
version: 0.0.3
|
46
56
|
type: :runtime
|
47
57
|
prerelease: false
|
48
|
-
version_requirements:
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.0.3
|
49
64
|
- !ruby/object:Gem::Dependency
|
50
65
|
name: cutest
|
51
|
-
requirement:
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
52
67
|
none: false
|
53
68
|
requirements:
|
54
69
|
- - ~>
|
@@ -56,7 +71,12 @@ dependencies:
|
|
56
71
|
version: '0.1'
|
57
72
|
type: :development
|
58
73
|
prerelease: false
|
59
|
-
version_requirements:
|
74
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ~>
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.1'
|
60
80
|
description: Ohm is a library that allows to store an object in Redis, a persistent
|
61
81
|
key-value database. It includes an extensible list of validations and has very good
|
62
82
|
performance.
|
@@ -115,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
135
|
version: '0'
|
116
136
|
requirements: []
|
117
137
|
rubyforge_project: ohm
|
118
|
-
rubygems_version: 1.8.
|
138
|
+
rubygems_version: 1.8.23
|
119
139
|
signing_key:
|
120
140
|
specification_version: 3
|
121
141
|
summary: Object-hash mapping library for Redis.
|