ohm 0.0.19 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +32 -8
- data/lib/ohm.rb +11 -6
- data/test/indices_test.rb +8 -8
- data/test/model_test.rb +10 -1
- metadata +2 -2
data/README.markdown
CHANGED
@@ -159,8 +159,37 @@ Ohm maintains different sets of objects ids for quick lookups.
|
|
159
159
|
For example, in the example above, the index on the name attribute will
|
160
160
|
allow for searches like Event.find(:name, "some value").
|
161
161
|
|
162
|
-
Note that the `
|
163
|
-
corresponding index to
|
162
|
+
Note that the `assert_unique` validation and the methods `find`, `search` and `filter` need a
|
163
|
+
corresponding index in order to work.
|
164
|
+
|
165
|
+
### Finding
|
166
|
+
|
167
|
+
You can find a collection of records with the `find` method:
|
168
|
+
|
169
|
+
# This returns a collection of users with the username "Albert"
|
170
|
+
User.find(username: "Albert")
|
171
|
+
|
172
|
+
### Searching and filtering
|
173
|
+
|
174
|
+
# This returns a collection of users with usernames "Albert" or "Benoit"
|
175
|
+
User.search(username: ["Albert", "Benoit"]) do |search_results|
|
176
|
+
@users = search_results.all
|
177
|
+
end
|
178
|
+
|
179
|
+
# This returns a collection of users with usernames "Albert" or "Benoit",
|
180
|
+
# but only those with the account enabled.
|
181
|
+
User.search(username: ["Albert", "Benoit"]) do |search_results|
|
182
|
+
search_results.filter(account: "enabled") do |filter_results|
|
183
|
+
@users = filter_results.all
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
Important: note that both `search` and `filter` yield the results
|
188
|
+
to a block. This is important because the set of results is stored
|
189
|
+
for the duration of the block (to allow for chaining of searches and
|
190
|
+
filters), but is deleted once the block ends. The `.all` is necessary
|
191
|
+
for retrieving the actual instances, as keeping a reference to a set
|
192
|
+
that is going to be deleted would only return empty sets.
|
164
193
|
|
165
194
|
Validations
|
166
195
|
-----------
|
@@ -237,12 +266,7 @@ Given the following example:
|
|
237
266
|
If all the assertions fail, the following errors will be present:
|
238
267
|
|
239
268
|
obj.errors
|
240
|
-
# => [[:foo, :not_present], [:bar, :not_numeric], [:baz, :format], [
|
241
|
-
|
242
|
-
Note that the error for assert_unique wraps the field in an array.
|
243
|
-
The purpose for this is to standardize the format for both single and
|
244
|
-
multicolumn indexes.
|
245
|
-
|
269
|
+
# => [[:foo, :not_present], [:bar, :not_numeric], [:baz, :format], [:qux, :not_unique]]
|
246
270
|
|
247
271
|
Presenting errors
|
248
272
|
-----------------
|
data/lib/ohm.rb
CHANGED
@@ -229,8 +229,15 @@ module Ohm
|
|
229
229
|
# @see Ohm::Model.filter
|
230
230
|
# @yield [results] Results of the filtering. Beware that the set of results is deleted from Redis when the block ends.
|
231
231
|
# @example
|
232
|
+
# Event.filter(public: true) do |filter_results|
|
233
|
+
# @events = filter_results.all
|
234
|
+
# end
|
235
|
+
#
|
236
|
+
# # You can also combine search and filter
|
232
237
|
# Event.search(day: "2009-09-11") do |search_results|
|
233
|
-
#
|
238
|
+
# search_results.filter(public: true) do |filter_results|
|
239
|
+
# @events = filter_results.all
|
240
|
+
# end
|
234
241
|
# end
|
235
242
|
def filter(hash, &block)
|
236
243
|
apply(:sinterstore, keys(hash).push(key), &block)
|
@@ -242,9 +249,7 @@ module Ohm
|
|
242
249
|
# @yield [results] Results of the search. Beware that the set of results is deleted from Redis when the block ends.
|
243
250
|
# @example
|
244
251
|
# Event.search(day: "2009-09-11") do |search_results|
|
245
|
-
# search_results.
|
246
|
-
# events = filter_results.all
|
247
|
-
# end
|
252
|
+
# events = search_results.all
|
248
253
|
# end
|
249
254
|
def search(hash, &block)
|
250
255
|
apply(:sunionstore, keys(hash), &block)
|
@@ -257,7 +262,7 @@ module Ohm
|
|
257
262
|
# Apply a redis operation on a collection of sets. Note that
|
258
263
|
# the resulting set is removed inmediatly after use.
|
259
264
|
def apply(operation, source, &block)
|
260
|
-
target = source.join(operation)
|
265
|
+
target = source.join(operation.to_s)
|
261
266
|
db.send(operation, target, *source)
|
262
267
|
set = self.class.new(db, target, model)
|
263
268
|
block.call(set)
|
@@ -536,7 +541,7 @@ module Ohm
|
|
536
541
|
end
|
537
542
|
|
538
543
|
def ==(other)
|
539
|
-
other.key == key
|
544
|
+
other.kind_of?(self.class) && other.key == key
|
540
545
|
rescue ModelIsNew
|
541
546
|
false
|
542
547
|
end
|
data/test/indices_test.rb
CHANGED
@@ -112,9 +112,9 @@ class IndicesTest < Test::Unit::TestCase
|
|
112
112
|
end
|
113
113
|
|
114
114
|
setup do
|
115
|
-
@event1 = Event.create(timeline
|
116
|
-
@event2 = Event.create(timeline
|
117
|
-
@event3 = Event.create(timeline
|
115
|
+
@event1 = Event.create(:timeline => 1)
|
116
|
+
@event2 = Event.create(:timeline => 1)
|
117
|
+
@event3 = Event.create(:timeline => 2)
|
118
118
|
@event1.days = [1, 2]
|
119
119
|
@event2.days = [2, 3]
|
120
120
|
@event3.days = [3, 4]
|
@@ -124,27 +124,27 @@ class IndicesTest < Test::Unit::TestCase
|
|
124
124
|
end
|
125
125
|
|
126
126
|
should "intersect multiple sets of results" do
|
127
|
-
Event.filter(timeline
|
127
|
+
Event.filter(:timeline => 1, :days => [1, 2]) do |set|
|
128
128
|
assert_equal [@event1], set
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
should "group multiple sets of results" do
|
133
|
-
Event.search(days
|
133
|
+
Event.search(:days => [1, 2]) do |set|
|
134
134
|
assert_equal [@event1, @event2], set
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
138
|
should "combine intersections and unions" do
|
139
|
-
Event.search(days
|
140
|
-
events.filter(timeline
|
139
|
+
Event.search(:days => [1, 2, 3]) do |events|
|
140
|
+
events.filter(:timeline => 1) do |result|
|
141
141
|
assert_equal [@event1, @event2], result
|
142
142
|
end
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
146
|
should "work with strings that generate a new line when encoded" do
|
147
|
-
user = User.create(email
|
147
|
+
user = User.create(:email => "foo@bar", :update => "CORRECTED - UPDATE 2-Suspected US missile strike kills 5 in Pakistan")
|
148
148
|
assert_equal [user], User.find(:update, "CORRECTED - UPDATE 2-Suspected US missile strike kills 5 in Pakistan")
|
149
149
|
end
|
150
150
|
end
|
data/test/model_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
+
require "ostruct"
|
2
3
|
|
3
4
|
class Post < Ohm::Model
|
4
5
|
attribute :body
|
@@ -227,7 +228,7 @@ class TestRedis < Test::Unit::TestCase
|
|
227
228
|
Person.create :name => "B"
|
228
229
|
Person.create :name => "A"
|
229
230
|
|
230
|
-
assert_equal "A", Person.all.sort_by(:name, get
|
231
|
+
assert_equal "A", Person.all.sort_by(:name, :get => "Person:*:name", :order => "ALPHA").first
|
231
232
|
end
|
232
233
|
end
|
233
234
|
|
@@ -489,5 +490,13 @@ class TestRedis < Test::Unit::TestCase
|
|
489
490
|
should "not be comparable to instances of other models" do
|
490
491
|
assert_not_equal @user, Event.create(:name => "Ruby Tuesday")
|
491
492
|
end
|
493
|
+
|
494
|
+
should "be comparable to non-models" do
|
495
|
+
assert_not_equal @user, 1
|
496
|
+
assert_not_equal @user, true
|
497
|
+
|
498
|
+
# Not equal although the other object responds to #key.
|
499
|
+
assert_not_equal @user, OpenStruct.new(:key => @user.send(:key))
|
500
|
+
end
|
492
501
|
end
|
493
502
|
end
|
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: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Martens
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-09-
|
13
|
+
date: 2009-09-16 00:00:00 -03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|