Skip to content

Commit

Permalink
view.rb: added :only option to filter views by meta name
Browse files Browse the repository at this point in the history
  • Loading branch information
Oleg Andreev committed Apr 29, 2008
1 parent ffd6043 commit 6e8e60a
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 11 deletions.
46 changes: 41 additions & 5 deletions lib/strokedb/views/store_ext.rb
@@ -1,19 +1,55 @@
module StrokeDB
class Store

# Tells store to update a view on document save.
# Tells a store to update a view on document save.
#
def register_view(v) #:nodoc:
@registered_views ||= [].to_set
@registered_views << v
def register_view(v, metas = nil) #:nodoc:
initialize_views_list
if !metas || metas.empty?
@registered_views[:rest] << v
else
metas.each do |meta_name|
meta_name = meta_name.name if meta_name.is_a?(Meta)
meta_name = meta_name.to_s
@registered_views[meta_name] ||= [].to_set
@registered_views[meta_name] << v
end
end
end

# This is called when new document version is created.
#
def update_views!(doc) #:nodoc:
(@registered_views || []).each do |view|
# Update generic views
@registered_views[:rest].each do |view|
view.update(doc)
end
doc.metas.each do |meta|
views = @registered_views[meta.name]
if views
views.each do |view|
view.update(doc)
end
end
end
end

# Lazy initialization (to avoid Store polluting)
#
alias :work_update_views! :update_views!
def update_views!(doc)
initialize_views_list
class << self
alias :update_views! :work_update_views!
end
update_views!(doc)
end

def initialize_views_list
@registered_views ||= {
:rest => [].to_set
# meta_name => [...].to_set
}
end
end
end
6 changes: 2 additions & 4 deletions lib/strokedb/views/view.rb
Expand Up @@ -33,6 +33,7 @@ module StrokeDB
if initialization_block = viewdoc.instance_variable_get(:@initialization_block) || initialization_block = VIEW_CACHE[viewdoc.uuid]
initialization_block.call(viewdoc)
end
viewdoc.store.register_view(viewdoc, viewdoc['only'])
end

after_save do |viewdoc|
Expand Down Expand Up @@ -271,12 +272,9 @@ def new(*args, &block)
unless v = find(options['uuid'])
v = original_new(store, options, &block)
end

store.register_view(v)

v
end

alias :define :new
alias :define! :create!

Expand Down
53 changes: 51 additions & 2 deletions spec/lib/strokedb/views/view_spec.rb
Expand Up @@ -26,7 +26,6 @@
end

it "should raise exception when #map is used" do
pending "TODO: option :only for a viewdoc"
Comment = Meta.new
@post_comments = View.define!(:name => "post_comments_invalid", :only => ["comment"])
c = Comment.new :text => "hello"
Expand Down Expand Up @@ -87,9 +86,59 @@ def view.map(uuid, doc)
@view.find(:key => @article2, :offset => 1, :limit => 2).should == [@comment22]
@view.find(:key => @article3, :offset => 1, :limit => 2).should == [ ]
end

end


describe View, "with :only option" do
before(:each) do
setup_default_store
block = proc {|view|
view.updated = "false"
class << view
def map(uuid, doc)
# puts "!!!!!!!!"
# puts "#{name}: #{doc.inspect}"
self.updated.replace "true"
nil # don't index
end
def updated?
self.updated == "true"
end
end
}
module A; end
A.send!(:remove_const, 'Article') if defined?(A::Article)
A.send!(:remove_const, 'SponsoredArticle') if defined?(A::SponsoredArticle)
A.send!(:remove_const, 'Comment') if defined?(A::Comment)

module A
Article = Meta.new
SponsoredArticle = Meta.new
Comment = Meta.new
end

@generic = View.new("generic", &block)
@comments = View.new("comments", :only => ["Comment"], &block)
@c_and_a = View.new("comments_and_articles", :only => ["Comment", "Article"], &block)
@sponsored = View.new("sponsored", :only => ["SponsoredArticle"], &block)
end
it "should update articles only" do
a = (A::Article + A::SponsoredArticle).create!(:title => "This is a sponsored article")
@generic.should be_updated
@comments.should_not be_updated
@c_and_a.should be_updated
@sponsored.should be_updated
end
it "should update comments only" do
c = A::Comment.create!(:text => "Hello")
@generic.should be_updated
@comments.should be_updated
@c_and_a.should be_updated
@sponsored.should_not be_updated
end
end


describe View, "with block defined and saved" do

before(:each) do
Expand Down

0 comments on commit 6e8e60a

Please sign in to comment.