minuteman 0.0.2 → 0.1.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/Gemfile.lock +1 -1
- data/README.md +23 -1
- data/lib/minuteman/bit_operations.rb +13 -2
- data/minuteman.gemspec +1 -1
- data/test/unit/minuteman_test.rb +26 -0
- metadata +2 -2
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -101,7 +101,19 @@ today_events.include?(User.all.map(&:id))
|
|
101
101
|
|
102
102
|
## Bitwise operations
|
103
103
|
|
104
|
-
You can intersect sets using AND(`&`), OR(`|`), NOT(`-`) and XOR(`^`).
|
104
|
+
You can intersect sets using bitwise AND(`&`), OR(`|`), NOT(`-`) and XOR(`^`).
|
105
|
+
Also you can use plus(`+`) and minus(`-`) operations.
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
set1 + set2
|
109
|
+
set1 - set2
|
110
|
+
set1 & set2
|
111
|
+
set1 | set2
|
112
|
+
set1 ^ set2
|
113
|
+
-set1
|
114
|
+
```
|
115
|
+
|
116
|
+
### Example
|
105
117
|
|
106
118
|
```ruby
|
107
119
|
invited = analytics.month("email:invitation", Time.now.utc)
|
@@ -113,3 +125,13 @@ successful_buys_after_invitation.include?(user.id)
|
|
113
125
|
# Clean up all the operations cache
|
114
126
|
analytics.reset_operations_cache
|
115
127
|
```
|
128
|
+
|
129
|
+
Also you can write more complex set operations
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
invited = analytics.month("email:invitation")
|
133
|
+
from_adsense = analytics.month("adsense:promo")
|
134
|
+
successful_buys = analytics.month("buy:complete")
|
135
|
+
|
136
|
+
conversion_rate = (invited | from_adsense) & successful_buys
|
137
|
+
```
|
@@ -29,6 +29,12 @@ class Minuteman
|
|
29
29
|
bit_operation("NOT", key)
|
30
30
|
end
|
31
31
|
|
32
|
+
# Public: Calculates the substract of one set to another
|
33
|
+
#
|
34
|
+
def -(timespan)
|
35
|
+
self ^ (self & timespan)
|
36
|
+
end
|
37
|
+
|
32
38
|
# Public: Calculates the XOR against another timespan
|
33
39
|
#
|
34
40
|
# timespan: Another BitOperations enabled class
|
@@ -44,6 +50,7 @@ class Minuteman
|
|
44
50
|
def |(timespan)
|
45
51
|
bit_operation("OR", [key, timespan.key])
|
46
52
|
end
|
53
|
+
alias :+ :|
|
47
54
|
|
48
55
|
# Public: Calculates the AND against another timespan
|
49
56
|
#
|
@@ -76,11 +83,15 @@ class Minuteman
|
|
76
83
|
#
|
77
84
|
def bit_operation(type, events)
|
78
85
|
key = destination_key(type, Array(events))
|
79
|
-
|
80
|
-
BitOperation.new(
|
86
|
+
redis.bitop(type, key, events)
|
87
|
+
BitOperation.new(redis, key)
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|
91
|
+
# Public: The result of intersecting results
|
92
|
+
# redis - The Redis connection
|
93
|
+
# key - The key where the result it's stored
|
94
|
+
#
|
84
95
|
class BitOperation < Struct.new(:redis, :key)
|
85
96
|
include BitOperations
|
86
97
|
end
|
data/minuteman.gemspec
CHANGED
data/test/unit/minuteman_test.rb
CHANGED
@@ -110,4 +110,30 @@ describe Minuteman do
|
|
110
110
|
assert !not_operation.include?(2)
|
111
111
|
end
|
112
112
|
|
113
|
+
it "should have an alias for the OR operator" do
|
114
|
+
or_operation = @week_events + @last_week_events
|
115
|
+
|
116
|
+
assert @week_events.include?(2)
|
117
|
+
assert @last_week_events.include?(2)
|
118
|
+
assert !@last_week_events.include?(12)
|
119
|
+
|
120
|
+
assert_equal 3, or_operation.length
|
121
|
+
|
122
|
+
assert or_operation.include?(12)
|
123
|
+
assert or_operation.include?(2)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should accept the substraction of a set" do
|
127
|
+
substract_operation = @year_events - @week_events
|
128
|
+
|
129
|
+
assert @week_events.include?(2)
|
130
|
+
assert @year_events.include?(2)
|
131
|
+
assert !substract_operation.include?(2)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should accept multiple consecutive operations" do
|
135
|
+
multi_operation = @week_events & @last_week_events | @year_events
|
136
|
+
|
137
|
+
assert_kind_of Minuteman::BitOperation, multi_operation
|
138
|
+
end
|
113
139
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minuteman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|