Skip to content

Commit

Permalink
refactored key API for views (no "")
Browse files Browse the repository at this point in the history
  • Loading branch information
Oleg Andreev committed May 2, 2008
1 parent df5fd18 commit 607d8a6
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 64 deletions.
24 changes: 15 additions & 9 deletions lib/strokedb/views/view.rb
Expand Up @@ -104,25 +104,27 @@ def clear!
def find(key = nil, options = {})

if !key || key.is_a?(Hash)
options = key || {}
options = (key || {}).stringify_keys
else
startk, endk = traverse_key(key)
options = (options || {}).stringify_keys
options['key'] ||= key
end
options = DEFAULT_FIND_OPTIONS.merge(options)

if key = options['key']
startk, endk = traverse_key(key)
options['start_key'] ||= !startk.blank? && startk || nil
options['end_key'] ||= !endk.blank? && endk || nil
end

options = DEFAULT_FIND_OPTIONS.merge(options.stringify_keys)

start_key = options['start_key']
end_key = options['end_key']
key = options['key']
limit = options['limit']
offset = options['offset']
reverse = options['reverse']
with_keys = options['with_keys']

ugly_find(start_key, end_key, key, limit, offset, reverse, with_keys)
ugly_find(start_key, end_key, limit, offset, reverse, with_keys)
end

# Traverses a user-friendly key in a #find method.
Expand Down Expand Up @@ -153,11 +155,10 @@ def traverse_key(key, sk = [], ek = [], s_inf = nil, e_inf = nil)
# than a regular #find(options = {}) [probably insignificantly faster, TODO: check this]
# Some arguments can be nils.
#
def ugly_find(start_key, end_key, key, limit, offset, reverse, with_keys)
def ugly_find(start_key, end_key, limit, offset, reverse, with_keys)

array = storage.find(start_key && encode_key(start_key),
end_key && encode_key(end_key),
key && encode_key(key),
end_key && encode_key(end_key),
limit,
offset,
reverse,
Expand Down Expand Up @@ -254,6 +255,11 @@ def decode_key(string_key)
DefaultKeyEncoder.decode(string_key)
end

# FIXME: for the "versions" strategy we must store UUID.VERSION
# instead of UUID only. Maybe, we should store UUID.VERSION always,
# or rely on some uuid_version method (which is different for
# Document and VersionedDocument)
# We should think about it.
def encode_value(value)
(value.is_a?(Document) ? value : RawData(value).save!).raw_uuid
end
Expand Down
3 changes: 1 addition & 2 deletions lib/strokedb/views/view_storage.rb
Expand Up @@ -19,8 +19,7 @@ def set_options(options)

#
#
def find(start_key, end_key, key, limit, offset, reverse, with_keys)
start_key = end_key = key if key
def find(start_key, end_key, limit, offset, reverse, with_keys)
@list.search(start_key, end_key, limit, offset, reverse, with_keys)
end

Expand Down
68 changes: 15 additions & 53 deletions spec/lib/strokedb/views/view_storage_spec.rb
Expand Up @@ -19,17 +19,10 @@
@insertion = lambda {|key, val| @view_storage.insert([[key, val]]) }
end

it "should store reference to a Document" do
pending "move this spec to view_spec"
@value = Document.new
@insertion.call('key',@value)
@view_storage.find(nil, nil, 'key', nil, nil, false, false).to_set.should == [@value].to_set
end

it "should store reference to an arbitrary data" do
@value = "some data"
@insertion.call('key',@value)
@view_storage.find(nil, nil, 'key', nil, nil, false, false).to_set.should == [@value].to_set
@view_storage.find('key', 'key', nil, nil, false, false).to_set.should == [@value].to_set
end

end
Expand All @@ -46,19 +39,11 @@
end
end

it "should store references to Documents" do
pending "move this spec to view_spec"
@value_1 = Document.new
@value_2 = Document.new
@insertion.call(['key','another_key'],[@value_1, @value_2])
@view_storage.find('another_key', 'key', nil, nil, nil, false, false).to_set.should == [@value_1, @value_2].to_set
end

it "should store references to an arbitrary data items" do
@value_1 = "some data"
@value_2 = "another data"
@insertion.call(['key','another_key'],[@value_1, @value_2])
@view_storage.find('another_key', 'key', nil, nil, nil, false, false).to_set.should == [@value_1, @value_2].to_set
@view_storage.find('another_key', 'key', nil, nil, false, false).to_set.should == [@value_1, @value_2].to_set
end

end
Expand All @@ -73,25 +58,14 @@
@replacement = lambda {|oldkey, oldval, key, val| @view_storage.replace([[oldkey, oldval]],[[key, val]]) }
end

it "should replace existing reference to Document if such pair exists already" do
pending "move this spec to view_spec"
@value_1 = Document.new
@value_2 = Document.new

@insertion.call('key',@value_1)
@replacement.call('key',@value_1, 'key',@value_2)

@view_storage.find(nil, nil, 'key', nil, nil, false, false).to_set.should == [@value_2].to_set
end

it "should replace existing reference to an arbitrary data item if such pair exists already" do
@value_1 = "some data"
@value_2 = "another data"

@insertion.call('key',@value_1)
@replacement.call('key',@value_1, 'key',@value_2)

@view_storage.find(nil, nil, 'key', nil, nil, false, false).to_set.should == [@value_2].to_set
@view_storage.find('key', 'key', nil, nil, false, false).to_set.should == [@value_2].to_set
end

end
Expand All @@ -116,18 +90,6 @@
end
end

it "should replace existing references to Document if such pairs exist already" do
pending "move this spec to view_spec"
@value_1 = Document.new
@value_2 = Document.new

@insertion.call(['key','another_key'],[@value_1, @value_2])
@replacement.call(['key','another_key'],[@value_1, @value_2],['key','another_key'],[@value_2, @value_1])

@view_storage.find(nil, nil, 'key', nil, nil, false, false).to_set.should == [@value_2].to_set
@view_storage.find(nil, nil, 'another_key', nil, nil, false, false).to_set.should == [@value_1].to_set
end

it "should replace existing references to an arbitrary data item if such pairs exist already" do
@value_1 = "some data"
@value_2 = "another data"
Expand All @@ -137,8 +99,8 @@
@insertion.call(['key','another_key'],[@value_1, @value_2])
@replacement.call(['key','another_key'],[@value_1, @value_2], ['key','another_key'],[@value_2, @value_1])

@view_storage.find(nil, nil, 'key', nil, nil, false, false).to_set.should == [@value_2].to_set
@view_storage.find(nil, nil, 'another_key', nil, nil, false, false).to_set.should == [@value_1].to_set
@view_storage.find('key', 'key', nil, nil, false, false).to_set.should == [@value_2].to_set
@view_storage.find('another_key','another_key', nil, nil, false, false).to_set.should == [@value_1].to_set
end

end
Expand All @@ -161,40 +123,40 @@
end

it "should be able to find entry with specific key" do
@view_storage.find(nil, nil, DefaultKeyEncoder.encode(50), nil, nil, false, false).to_set.should == [50].to_set
@view_storage.find(DefaultKeyEncoder.encode(50), DefaultKeyEncoder.encode(50), nil, nil, false, false).to_set.should == [50].to_set
end

it "should be able to find entries with specific key range" do
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, nil, false, false).to_set.should == (3..77).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, false, false).to_set.should == (3..77).to_set
end

it "should be able to find entries with only start boundary range" do
@view_storage.find(DefaultKeyEncoder.encode(77), nil, nil, nil, nil, false, false).to_set.should == (77..100).to_set
@view_storage.find(DefaultKeyEncoder.encode(77), nil, nil, nil, false, false).to_set.should == (77..100).to_set
end

it "should be able to find entries with only end boundary range" do
@view_storage.find(nil, DefaultKeyEncoder.encode(77), nil, nil, nil, false, false).to_set.should == (1..77).to_set
@view_storage.find(nil, DefaultKeyEncoder.encode(77), nil, nil, false, false).to_set.should == (1..77).to_set
end

it "should be able to limit results if there is more results than allowed" do
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, 50, nil, false, false).to_set.should == (3..52).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), 50, nil, false, false).to_set.should == (3..52).to_set
end

it "should not limit results if there is less results than allowed" do
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, 100, nil, false, false).to_set.should == (3..77).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), 100, nil, false, false).to_set.should == (3..77).to_set
end

it "should not skip some results if offset is 0 or nil" do
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, nil, false, false).to_set.should == (3..77).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, 0, false, false).to_set.should == (3..77).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, false, false).to_set.should == (3..77).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, 0, false, false).to_set.should == (3..77).to_set
end

it "should skip some results if offset is specified" do
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, 3, false, false).to_set.should == (6..77).to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, 3, false, false).to_set.should == (6..77).to_set
end

it "should return both keys and values if told so" do
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, nil, false, true).to_set.should == (3..77).to_a.map {|i| [DefaultKeyEncoder.encode(i),i]}.to_set
@view_storage.find(DefaultKeyEncoder.encode(3), DefaultKeyEncoder.encode(77), nil, nil, false, true).to_set.should == (3..77).to_a.map {|i| [DefaultKeyEncoder.encode(i),i]}.to_set
end

end

0 comments on commit 607d8a6

Please sign in to comment.