redpear 0.4.3 → 0.5.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.
- data/lib/redpear/column.rb +6 -3
- data/lib/redpear/finders.rb +1 -1
- data/lib/redpear/index.rb +3 -3
- data/lib/redpear/members.rb +56 -10
- data/lib/redpear/persistence.rb +11 -6
- data/lib/redpear/schema/collection.rb +2 -10
- data/lib/redpear/schema.rb +10 -3
- data/lib/redpear/zindex.rb +26 -0
- data/lib/redpear/zmembers.rb +68 -0
- data/lib/redpear.rb +2 -0
- metadata +18 -16
data/lib/redpear/column.rb
CHANGED
@@ -2,9 +2,12 @@ class Redpear::Column < String
|
|
2
2
|
attr_reader :type, :model
|
3
3
|
|
4
4
|
# Creates a new column.
|
5
|
-
# @param [Redpear::Model] model
|
6
|
-
#
|
7
|
-
# @param [
|
5
|
+
# @param [Redpear::Model] model
|
6
|
+
# the model the column is associated with
|
7
|
+
# @param [String] name
|
8
|
+
# the column name
|
9
|
+
# @param [Symbol] type
|
10
|
+
# the column type (:string (default), :counter, :integer, :timestamp)
|
8
11
|
def initialize(model, name, type = nil)
|
9
12
|
super name.to_s
|
10
13
|
@model = model
|
data/lib/redpear/finders.rb
CHANGED
data/lib/redpear/index.rb
CHANGED
@@ -14,11 +14,11 @@ class Redpear::Index < Redpear::Column
|
|
14
14
|
#
|
15
15
|
# index = Comment.columns.lookup["post_id"]
|
16
16
|
# index.nest(123) # => "comments:[post_id]:123"
|
17
|
-
# index.nest(nil) # =>
|
18
|
-
# index.nest("") # =>
|
17
|
+
# index.nest(nil) # => "comments:[post_id]:_"
|
18
|
+
# index.nest("") # => "comments:[post_id]:_"
|
19
19
|
#
|
20
20
|
def nest(value)
|
21
|
-
|
21
|
+
value = "_" if value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
22
22
|
namespace[value]
|
23
23
|
end
|
24
24
|
|
data/lib/redpear/members.rb
CHANGED
@@ -1,37 +1,83 @@
|
|
1
1
|
class Redpear::Members
|
2
2
|
include Enumerable
|
3
3
|
|
4
|
+
attr_reader :nest
|
5
|
+
|
6
|
+
# Constructor
|
7
|
+
# @param [Redpear::Nest] nest
|
8
|
+
# the nest object
|
4
9
|
def initialize(nest)
|
5
|
-
@nest
|
6
|
-
@members = Set.new unless @nest
|
10
|
+
@nest = nest
|
7
11
|
end
|
8
12
|
|
13
|
+
# @return [Boolean] true if member have been loaded
|
9
14
|
def loaded?
|
10
15
|
!@members.nil?
|
11
16
|
end
|
12
17
|
|
18
|
+
# @yield [String] do something with each member
|
13
19
|
def each(&block)
|
14
20
|
members.each(&block)
|
15
21
|
end
|
16
22
|
|
17
|
-
|
18
|
-
|
23
|
+
# @param [String] value
|
24
|
+
# check if this value is a member
|
25
|
+
# @return [Boolean] true if members contain the value
|
26
|
+
def include?(value)
|
27
|
+
loaded? ? @members.include?(value.to_s) : is_member?(value)
|
19
28
|
end
|
20
29
|
|
30
|
+
# @return [Set] the actual members
|
21
31
|
def members
|
22
|
-
@members ||=
|
32
|
+
@members ||= nest.smembers.to_set
|
23
33
|
end
|
24
34
|
|
35
|
+
# @return [Integer] then count of members
|
25
36
|
def count
|
26
|
-
members.
|
37
|
+
@count ||= loaded? ? @members.size : cardinality
|
27
38
|
end
|
39
|
+
alias_method :size, :count
|
28
40
|
|
29
|
-
|
30
|
-
|
41
|
+
# Compares members
|
42
|
+
# @param [Object] other the object to compare with
|
43
|
+
# @return [Boolean] true if same as other
|
44
|
+
def ==(other)
|
45
|
+
case other
|
46
|
+
when Redpear::Members
|
47
|
+
other.members == members
|
48
|
+
when Set
|
49
|
+
other == members
|
50
|
+
when Array
|
51
|
+
other.to_set == members
|
52
|
+
else
|
53
|
+
super
|
54
|
+
end
|
31
55
|
end
|
32
56
|
|
33
|
-
|
34
|
-
|
57
|
+
# Is the value a member? This method is not cached, try using #include? instead.
|
58
|
+
# @param [String] value
|
59
|
+
def is_member?(value)
|
60
|
+
nest.sismember(value)
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Integer] the cardinaliry of this set.
|
64
|
+
# This method is not cached, try using #count instead.
|
65
|
+
def cardinality
|
66
|
+
nest.scard
|
67
|
+
end
|
68
|
+
|
69
|
+
# Add a member to this set
|
70
|
+
# @param [Model] record
|
71
|
+
def add(record)
|
72
|
+
@members << record.id if loaded?
|
73
|
+
nest.sadd(record.id)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Remove a member from this set
|
77
|
+
# @param [Model] record
|
78
|
+
def remove(record)
|
79
|
+
@members.delete(record.id) if loaded?
|
80
|
+
nest.srem(record.id)
|
35
81
|
end
|
36
82
|
|
37
83
|
end
|
data/lib/redpear/persistence.rb
CHANGED
@@ -52,7 +52,7 @@ module Redpear::Persistence
|
|
52
52
|
|
53
53
|
# Load attributes from DB (destructive)
|
54
54
|
def refresh_attributes
|
55
|
-
update nest.mapped_hmget(*
|
55
|
+
update nest.mapped_hmget(*__loadable_attributes__) if persisted?
|
56
56
|
@__loaded__ = true
|
57
57
|
self
|
58
58
|
end
|
@@ -69,7 +69,7 @@ module Redpear::Persistence
|
|
69
69
|
|
70
70
|
transaction do
|
71
71
|
nest.mapped_hmset __persistable_attributes__
|
72
|
-
|
72
|
+
__relevant_member_sets__.each {|s| s.add(self) }
|
73
73
|
expire options[:expire]
|
74
74
|
yield(self) if block
|
75
75
|
end
|
@@ -86,7 +86,7 @@ module Redpear::Persistence
|
|
86
86
|
|
87
87
|
transaction do
|
88
88
|
nest.del
|
89
|
-
|
89
|
+
__relevant_member_sets__.each {|s| s.remove(self) }
|
90
90
|
end
|
91
91
|
|
92
92
|
true
|
@@ -118,7 +118,7 @@ module Redpear::Persistence
|
|
118
118
|
def after_destroy
|
119
119
|
end
|
120
120
|
|
121
|
-
|
121
|
+
protected
|
122
122
|
|
123
123
|
# Attributes that can be persisted
|
124
124
|
def __persistable_attributes__
|
@@ -130,6 +130,11 @@ module Redpear::Persistence
|
|
130
130
|
result
|
131
131
|
end
|
132
132
|
|
133
|
+
# Attributes that can be loaded
|
134
|
+
def __loadable_attributes__
|
135
|
+
self.class.columns.names
|
136
|
+
end
|
137
|
+
|
133
138
|
def __persistable_value__(value)
|
134
139
|
case value
|
135
140
|
when Time
|
@@ -140,8 +145,8 @@ module Redpear::Persistence
|
|
140
145
|
end
|
141
146
|
|
142
147
|
# Return relevant set nests
|
143
|
-
def
|
144
|
-
@
|
148
|
+
def __relevant_member_sets__
|
149
|
+
@__relevant_member_sets__ ||= [self.class.members] + self.class.columns.indices.map {|i| i.members(self[i]) if self[i] }.compact
|
145
150
|
end
|
146
151
|
|
147
152
|
end
|
@@ -2,17 +2,9 @@
|
|
2
2
|
class Redpear::Schema::Collection < Array
|
3
3
|
|
4
4
|
# @param [multiple] the column definition. Please see Redpear::Column#initialize
|
5
|
-
def
|
5
|
+
def store(klass, *args)
|
6
6
|
reset!
|
7
|
-
|
8
|
-
self << col
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# @param [multiple] the index definition. Please see Redpear::Column#initialize
|
13
|
-
def index(*args)
|
14
|
-
reset!
|
15
|
-
Redpear::Index.new(*args).tap do |col|
|
7
|
+
klass.new(*args).tap do |col|
|
16
8
|
self << col
|
17
9
|
end
|
18
10
|
end
|
data/lib/redpear/schema.rb
CHANGED
@@ -11,14 +11,21 @@ module Redpear::Schema
|
|
11
11
|
|
12
12
|
# @param [multiple] the column definition. Please see Redpear::Column#initialize
|
13
13
|
def column(*args)
|
14
|
-
columns.
|
14
|
+
columns.store(Redpear::Column, self, *args).tap do |col|
|
15
15
|
__define_attribute_accessors__(col)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
# @param [multiple] the index definition. Please see Redpear::
|
19
|
+
# @param [multiple] the index definition. Please see Redpear::Index#initialize
|
20
20
|
def index(*args)
|
21
|
-
columns.
|
21
|
+
columns.store(Redpear::Index, self, *args).tap do |col|
|
22
|
+
__define_attribute_accessors__(col)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param [multiple] the sorted index definition. Please see Redpear::ZIndex#initialize
|
27
|
+
def zindex(*args)
|
28
|
+
columns.store(Redpear::ZIndex, self, *args).tap do |col|
|
22
29
|
__define_attribute_accessors__(col)
|
23
30
|
end
|
24
31
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Redpear::ZIndex < Redpear::Index
|
2
|
+
|
3
|
+
attr_reader :callback
|
4
|
+
|
5
|
+
# Creates a new ZIndex.
|
6
|
+
# @param [Redpear::Model] model
|
7
|
+
# the model the column is associated with
|
8
|
+
# @param [String] name
|
9
|
+
# the column name
|
10
|
+
# @param [Symbol] callback
|
11
|
+
# method to be call on the object, to determine the score
|
12
|
+
# @param [Symbol] type
|
13
|
+
# the column type (:string (default), :counter, :integer, :timestamp)
|
14
|
+
def initialize(model, name, callback, type = nil)
|
15
|
+
super(model, name, type)
|
16
|
+
@callback = callback
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param [String] value
|
20
|
+
# the index value
|
21
|
+
# @return [Redpear::SortedMembers] the IDs of all existing records for a given index value
|
22
|
+
def members(value)
|
23
|
+
Redpear::ZMembers.new nest(value), callback
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class Redpear::ZMembers < Redpear::Members
|
2
|
+
|
3
|
+
# Constructor
|
4
|
+
# @param [Redpear::Nest] nest
|
5
|
+
# the nest object
|
6
|
+
# @param [Symbol] callback
|
7
|
+
# the method to use for scoring when members are added
|
8
|
+
def initialize(nest, callback)
|
9
|
+
super(nest)
|
10
|
+
@callback = callback.to_sym
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Hash] the actual members
|
14
|
+
def members
|
15
|
+
@members ||= range.to_set
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param [Hash] options
|
19
|
+
# @option [Integer] start, start index, defaults to 0
|
20
|
+
# @option [Integer] stop, stop index, defaults to -1
|
21
|
+
# @returns [Hash] range of members, lowest rank first
|
22
|
+
def range(options = {})
|
23
|
+
options = options.merge(:start => 0, :stop => -1)
|
24
|
+
nest.zrange options.delete(:start), options.delete(:stop), options
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param [Hash] options
|
28
|
+
# @option [Integer] start, start index, defaults to 0
|
29
|
+
# @option [Integer] stop, stop index, defaults to -1
|
30
|
+
# @returns [Hash] range or members, highest rank first
|
31
|
+
def reverse_range(options = {})
|
32
|
+
options = options.merge(:start => 0, :stop => -1)
|
33
|
+
nest.zrevrange options.delete(:start), options.delete(:stop), options
|
34
|
+
end
|
35
|
+
|
36
|
+
# Is the value a member? This method is not cached, try using #include? instead.
|
37
|
+
# @param [String] value
|
38
|
+
def is_member?(value)
|
39
|
+
!!nest.zscore(value)
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [Integer] the cardinality of this set.
|
43
|
+
# This method is not cached, try using #count instead.
|
44
|
+
def cardinality
|
45
|
+
nest.zcard
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Integer] the score for a member
|
49
|
+
# This method is not cached.
|
50
|
+
def score(value)
|
51
|
+
nest.zscore(value)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Add a member to this set
|
55
|
+
# @param [Model] record
|
56
|
+
def add(record)
|
57
|
+
@members << record.id if loaded?
|
58
|
+
nest.zadd(record.send(@callback), record.id)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Remove a member from this set
|
62
|
+
# @param [Model] record
|
63
|
+
def remove(record, score = 0)
|
64
|
+
@members.delete(record.id) if loaded?
|
65
|
+
nest.zrem(record.id)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/lib/redpear.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redpear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-12-01 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
16
|
-
requirement: &
|
16
|
+
requirement: &19999180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.2.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *19999180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nest
|
27
|
-
requirement: &
|
27
|
+
requirement: &19998660 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.1.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *19998660
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &19998180 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *19998180
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
|
-
requirement: &
|
49
|
+
requirement: &19997620 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *19997620
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &19997060 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *19997060
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: fakeredis
|
71
|
-
requirement: &
|
71
|
+
requirement: &19996200 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *19996200
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: shoulda-matchers
|
82
|
-
requirement: &
|
82
|
+
requirement: &19995740 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *19995740
|
91
91
|
description: Simple, elegant & efficient ORM for Redis
|
92
92
|
email: dimitrij@blacksquaremedia.com
|
93
93
|
executables: []
|
@@ -99,9 +99,11 @@ files:
|
|
99
99
|
- lib/redpear/schema/collection.rb
|
100
100
|
- lib/redpear/core_ext/stringify_keys.rb
|
101
101
|
- lib/redpear/concern.rb
|
102
|
+
- lib/redpear/zmembers.rb
|
102
103
|
- lib/redpear/namespace.rb
|
103
104
|
- lib/redpear/nest.rb
|
104
105
|
- lib/redpear/finders.rb
|
106
|
+
- lib/redpear/zindex.rb
|
105
107
|
- lib/redpear/persistence.rb
|
106
108
|
- lib/redpear/expiration.rb
|
107
109
|
- lib/redpear/column.rb
|