easyredis 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -43,7 +43,7 @@ We can now make post objects:
43
43
  Posts are automatically given ids that we can then use to retrive them:
44
44
 
45
45
  id = p.id
46
- p = Post[id] # or Post.find(id)
46
+ p = Post.find(id)
47
47
  p.title # => "My First Post"
48
48
 
49
49
  We also get a created_at field for free that we can sort by.
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('easyredis','0.0.2') do |p|
5
+ Echoe.new('easyredis','0.0.3') do |p|
6
6
  p.description = "simple framework designed to make using redis as a database simpler"
7
7
  p.url = "https://github.com/alecbenzer/easyredis"
8
8
  p.author = "Alec Benzer"
@@ -15,17 +15,17 @@ end
15
15
  require 'benchmark'
16
16
  require './tests/test'
17
17
 
18
- $names = ["Bill","Bob","John","Jack","Alec","Mark","Nick","Evan","Eamon","Joe","Vikram"]
19
-
20
18
  def rand_name
21
- $names[rand*$names.size]
19
+ length = 2
20
+ chars = []
21
+ length.times { chars << (rand(26) + 65).chr }
22
+ chars.join
22
23
  end
23
24
 
25
+
24
26
  namespace :bm do
25
27
  task :clear do
26
- count = Man.count
27
-
28
- puts "destroying #{$count} previous entries"
28
+ puts "destroying #{Man.count} previous entries"
29
29
  Benchmark.bm do |bm|
30
30
  bm.report { Man.destroy_all }
31
31
  end
@@ -34,43 +34,54 @@ namespace :bm do
34
34
  task :add do
35
35
  count = ENV["count"] ? ENV["count"].to_i : 25000
36
36
  puts "adding #{count} new entries"
37
- Benchmark.bm do |bm|
38
- bm.report { count.times { m = Man.new ; m.name = rand_name } }
37
+ time = Benchmark::Tms.new
38
+ count.times do
39
+ name = rand_name
40
+ age = rand(100)
41
+ time += Benchmark.measure { m = Man.new ; m.name = name ; m.age = age }
39
42
  end
43
+ puts time.format
40
44
  end
41
45
 
42
46
  task :populate => [:clear, :add]
43
47
 
44
- task :sort do
45
- puts "sorting #{Man.count} entries by name"
46
- Benchmark.bm do |bm|
47
- #bm.report("ruby:") { Man.all.sort_by { |m| m.name } }
48
- #bm.report("redis:") { Man.sort_by(:name) }
49
- bm.report { Man.sort_by(:name) }
50
- end
51
- end
52
-
53
48
  task :search do
54
49
  puts "searching #{Man.count} entries by a particular name"
50
+ name = Man.rand.name
55
51
  Benchmark.bm do |bm|
56
- name = rand_name
57
- #bm.report("ruby:") { Man.all.select {|m| m.name == name} }
58
- #bm.report("redis:") { Man.search_by(:name,name) }
59
52
  bm.report { Man.search_by(:name,name) }
60
53
  end
61
54
  end
62
55
 
56
+ task :singlesearch do
57
+ puts "seaching #{Man.count} entries by a particular age"
58
+ puts "NOTE: this metric is only relevant if Model#search is not detecting single-field searches and using Model#search_by"
59
+ age = rand(100)
60
+ t1 = Benchmark.measure { Man.search(:age => age) }
61
+ t2 = Benchmark.measure { Man.search_by(:age,age) }
62
+ puts "Model#search:"
63
+ puts t1.format
64
+ puts "Model#search_by:"
65
+ puts t2.format
66
+ puts "search is #{((t1.real/t2.real) - 1)*100}% slower"
67
+ end
68
+
69
+ task :multisearch do
70
+ man = Man.rand
71
+ name = man.name
72
+ age = man.age
73
+ count = 0
74
+ time = Benchmark.measure { count = Man.search(:name => name, :age => age).size }
75
+ puts "retrived #{count} out of #{Man.count} entries in:"
76
+ puts time.format
77
+ end
78
+
63
79
  task :find do
64
- puts "finding one of #{Man.count} entry by name"
80
+ puts "finding one of #{Man.count} entries by name"
81
+ name = Man.rand.name
65
82
  Benchmark.bm do |bm|
66
- name = rand_name
67
- #bm.report("redis:") { Man.find_by(:name,name) }
68
83
  bm.report { Man.find_by(:name,name) }
69
84
  end
70
85
  end
71
86
 
72
87
  end
73
-
74
- task :doc do
75
- puts `rdoc lib/ --title "EasyRedis"`
76
- end
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{easyredis}
5
- s.version = "0.0.2"
5
+ s.version = "0.0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Alec Benzer"]
9
- s.date = %q{2011-02-05}
9
+ s.date = %q{2011-02-06}
10
10
  s.description = %q{simple framework designed to make using redis as a database simpler}
11
11
  s.email = %q{alecbezer @nospam@ gmail.com}
12
12
  s.extra_rdoc_files = ["README.md", "lib/easyredis.rb"]
@@ -45,6 +45,8 @@ module EasyRedis
45
45
  end
46
46
 
47
47
  # connect to a redis server
48
+ #
49
+ # takes the same options that Redis#new does from the redis gem
48
50
  def self.connect(options = {})
49
51
  @redis = Redis.new(options)
50
52
  end
@@ -93,21 +95,28 @@ module EasyRedis
93
95
  offset = index
94
96
  self[offset...(offset+limit)]
95
97
  elsif index.is_a? Range
96
- a = index.begin
97
- b = index.end
98
- b -= 1 if index.exclude_end?
99
- ids = []
100
- if @order == :asc
101
- ids = EasyRedis.redis.zrange(@klass.sort_prefix(@field),a,b)
102
- elsif @order == :desc
103
- ids = EasyRedis.redis.zrevrange(@klass.sort_prefix(@field),a,b)
104
- end
105
- ids.map{|i|@klass.new(i)}
98
+ access(index)
106
99
  elsif index.is_a? Integer
107
100
  self[index..index].first
108
101
  end
109
102
  end
110
103
 
104
+ # helper method for []
105
+ #
106
+ # takes a range and returns corresponding elements
107
+ def access(range)
108
+ a = range.begin
109
+ b = range.end
110
+ b -= 1 if index.exclude_end?
111
+ ids = []
112
+ if @order == :asc
113
+ ids = EasyRedis.redis.zrange(@klass.sort_prefix(@field),a,b)
114
+ elsif @order == :desc
115
+ ids = EasyRedis.redis.zrevrange(@klass.sort_prefix(@field),a,b)
116
+ end
117
+ ids.map{|i|@klass.new(i)}
118
+ end
119
+
111
120
  # iterate through all members of this sort
112
121
  def each
113
122
  self[0..-1].each { |o| yield o }
@@ -130,6 +139,14 @@ module EasyRedis
130
139
  end
131
140
  end
132
141
 
142
+ def last(n = nil)
143
+ if n
144
+ self[-n..-1]
145
+ else
146
+ self[-1]
147
+ end
148
+ end
149
+
133
150
  def inspect
134
151
  "#<EasyRedis::Sort model=#{@klass.name}, field=#{@field.to_s}, order=#{@order.to_s}>"
135
152
  end
@@ -143,6 +160,8 @@ module EasyRedis
143
160
 
144
161
  # add a field to the model
145
162
  def self.field(name)
163
+ @@fields ||= []
164
+ @@fields << name.to_sym
146
165
  name = name.to_s
147
166
  getter = name
148
167
  setter = name + "="
@@ -185,6 +204,18 @@ module EasyRedis
185
204
  self.sort_by :created_at, options
186
205
  end
187
206
 
207
+ def self.first(n = nil)
208
+ self.all.first(n)
209
+ end
210
+
211
+ def self.last(n = nil)
212
+ self.all.last(n)
213
+ end
214
+
215
+ def self.rand
216
+ self[Kernel.rand(self.count)]
217
+ end
218
+
188
219
  # find an instance of this model based on its id
189
220
  def self.find(id)
190
221
  if EasyRedis.redis.zscore(prefix.pluralize,id)
@@ -194,9 +225,8 @@ module EasyRedis
194
225
  end
195
226
  end
196
227
 
197
- # alias for Model#find
198
- def self.[](id)
199
- find(id)
228
+ def self.[](index,amt=nil)
229
+ self.all[index,amt]
200
230
  end
201
231
 
202
232
  # get all entries where field matches val
@@ -207,12 +237,23 @@ module EasyRedis
207
237
  ids = EasyRedis.redis.zrangebyscore(sort_prefix(field),scr,scr,proc_options(options))
208
238
  ids.map{|i| new(i) }
209
239
  end
210
-
240
+
211
241
  # get the first entry where field matches val
212
242
  def self.find_by(field,val)
213
243
  search_by(field,val,:limit => 1).first
214
244
  end
215
245
 
246
+ def self.search(params)
247
+ return search_by(*params.first) if params.size == 1 # comment out for benchmarking purposes
248
+ result_set = nil
249
+ params.each do |field,value|
250
+ scr = EasyRedis.score(value)
251
+ ids = EasyRedis.redis.zrangebyscore(sort_prefix(field),scr,scr)
252
+ result_set = result_set ? (result_set & Set.new(ids)) : Set.new(ids)
253
+ end
254
+ result_set.map{|i|new(i)}
255
+ end
256
+
216
257
  # get all entries, sorted by the given field
217
258
  def self.sort_by(field,options = {:order => :asc})
218
259
  EasyRedis::Sort.new(field,options[:order],self)
@@ -284,7 +325,7 @@ module EasyRedis
284
325
  def [](field)
285
326
  EasyRedis.redis.hget(key_name,field)
286
327
  end
287
-
328
+
288
329
  # directly change a field of this entry's redis hash
289
330
  #
290
331
  # note that you cannot access created_at or id with these methods
@@ -311,6 +352,13 @@ module EasyRedis
311
352
  "#<#{self.class.name}:#{@id}>"
312
353
  end
313
354
 
355
+ # clears all fields, causing future gets to reretrive them from redis
356
+ def clear
357
+ @@fields.each do |field|
358
+ self.instance_variable_set("@"+field.to_s,nil)
359
+ end
360
+ end
361
+
314
362
 
315
363
  private
316
364
 
@@ -2,9 +2,10 @@ require './lib/easyredis'
2
2
 
3
3
  class Man < EasyRedis::Model
4
4
  field :name
5
- field :friend
5
+ field :age
6
6
 
7
7
  sort_on :name
8
+ sort_on :age
8
9
  end
9
10
 
10
11
  EasyRedis.connect
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: easyredis
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alec Benzer
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-02-05 00:00:00 -05:00
13
+ date: 2011-02-06 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency