bmg-redis 0.20.2 → 0.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bmg/redis/relation.rb +52 -18
- data/lib/bmg/redis/singleton.rb +35 -0
- data/lib/bmg/redis.rb +1 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '07189d7515f70a5d013486141404708cc364906f'
|
4
|
+
data.tar.gz: ded99a9c7d8ee20fd20e1566e2cd1029c06c4e11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c341c8049360086c7e1ce5ec14c1c15e33b079440e6cb1604072a61eb10f644029db5b4f2846e1ba6707bfab54712a82bf0181766f461bce7060abce1a2d6782
|
7
|
+
data.tar.gz: 4227490dfb2d323ffffb4924a5c9a6c2328662f50bbc8ea285e25df7d888a89126e584a71373ff745337dbf534a5134925e31515f823f243ced5e7abd703faea
|
data/lib/bmg/redis/relation.rb
CHANGED
@@ -29,39 +29,58 @@ module Bmg
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
### optimization
|
33
|
+
|
34
|
+
def _restrict(type, predicate)
|
35
|
+
return super unless key = full_and_only_key?(predicate)
|
36
|
+
|
37
|
+
redis_key = extract_key(key)
|
38
|
+
if tuple_str = redis.get(redis_key)
|
39
|
+
tuple = serializer.deserialize(tuple_str)
|
40
|
+
Singleton.new(type, self, tuple)
|
41
|
+
else
|
42
|
+
Bmg::Relation.empty
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
32
46
|
###
|
33
47
|
|
34
48
|
def insert(tuple_or_tuples)
|
35
49
|
case tuple_or_tuples
|
36
50
|
when Hash
|
37
|
-
|
38
|
-
serialized = serializer.serialize(tuple_or_tuples)
|
39
|
-
redis.set(key, serialized)
|
51
|
+
insert_one(tuple_or_tuples, redis)
|
40
52
|
else
|
41
|
-
|
42
|
-
|
53
|
+
redis.multi do |transaction|
|
54
|
+
tuple_or_tuples.each do |tuple|
|
55
|
+
insert_one(tuple, transaction)
|
56
|
+
end
|
43
57
|
end
|
44
58
|
end
|
45
59
|
self
|
46
60
|
end
|
47
61
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
62
|
+
def insert_one(tuple, redis)
|
63
|
+
key = extract_key(tuple)
|
64
|
+
serialized = serializer.serialize(tuple)
|
65
|
+
redis.set(key, serialized)
|
66
|
+
self
|
67
|
+
end
|
68
|
+
private :insert_one
|
51
69
|
|
52
|
-
|
70
|
+
def update(updating, predicate = Predicate.tautology)
|
71
|
+
updates = restrict(predicate).map do |tuple|
|
72
|
+
tuple.merge(updating)
|
53
73
|
end
|
54
|
-
|
74
|
+
insert(updates)
|
55
75
|
end
|
56
76
|
|
57
77
|
def delete(predicate = Predicate.tautology)
|
58
|
-
keys =
|
59
|
-
|
60
|
-
.
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
78
|
+
keys = restrict(predicate).each.map{|t| extract_key(t) }
|
79
|
+
redis.multi do |transaction|
|
80
|
+
keys.each_slice(1000) do |slice|
|
81
|
+
transaction.del(*slice)
|
82
|
+
end
|
83
|
+
end
|
65
84
|
self
|
66
85
|
end
|
67
86
|
|
@@ -99,10 +118,25 @@ module Bmg
|
|
99
118
|
options[:key_prefix] || "bmg"
|
100
119
|
end
|
101
120
|
|
121
|
+
def full_and_only_key?(predicate)
|
122
|
+
h = begin
|
123
|
+
predicate.to_hash
|
124
|
+
rescue ArgumentError
|
125
|
+
return false
|
126
|
+
end
|
127
|
+
|
128
|
+
return false unless h.keys == candidate_key
|
129
|
+
return false unless candidate_key.all?{|k|
|
130
|
+
h[k].is_a?(String) || h[k].is_a?(Integer)
|
131
|
+
}
|
132
|
+
|
133
|
+
h
|
134
|
+
end
|
135
|
+
|
102
136
|
def extract_key(tuple)
|
103
137
|
key = candidate_key
|
104
138
|
key = TupleAlgebra.project(tuple, key)
|
105
|
-
key =
|
139
|
+
key = key.to_json
|
106
140
|
"#{key_prefix}:#{key}"
|
107
141
|
end
|
108
142
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Bmg
|
2
|
+
module Redis
|
3
|
+
class Singleton
|
4
|
+
include Bmg::Relation
|
5
|
+
|
6
|
+
def initialize(type, parent, tuple)
|
7
|
+
@type = type
|
8
|
+
@parent = parent
|
9
|
+
@tuple = tuple
|
10
|
+
end
|
11
|
+
attr_accessor :type
|
12
|
+
|
13
|
+
def each
|
14
|
+
return to_enum unless block_given?
|
15
|
+
|
16
|
+
yield(@tuple) if @tuple
|
17
|
+
end
|
18
|
+
|
19
|
+
def insert(tuple_or_tuples)
|
20
|
+
@parent.insert(tuple_or_tuples)
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def update(updating, predicate = Predicate.tautology)
|
25
|
+
@parent.update(updating, predicate & type.predicate)
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete(predicate = Predicate.tautology)
|
30
|
+
@parent.delete(predicate & type.predicate)
|
31
|
+
end
|
32
|
+
|
33
|
+
end # class Singleton
|
34
|
+
end # module Redis
|
35
|
+
end # module Bmg
|
data/lib/bmg/redis.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bmg-redis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bmg
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.21.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.21.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: redis
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- lib/bmg/redis/serializer.rb
|
86
86
|
- lib/bmg/redis/serializer/json.rb
|
87
87
|
- lib/bmg/redis/serializer/marshal.rb
|
88
|
+
- lib/bmg/redis/singleton.rb
|
88
89
|
- tasks/gem.rake
|
89
90
|
- tasks/test.rake
|
90
91
|
homepage: http://github.com/enspirit/bmg-redis
|