Skip to content

Commit

Permalink
adds removing deleted documents from view results when include_docs=true
Browse files Browse the repository at this point in the history
  • Loading branch information
langalex committed Nov 17, 2012
1 parent df02e1a commit 74445d0
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Gemfile.lock
Expand Up @@ -48,7 +48,7 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
couch_potato! couch_potato!
rake rake
rspec (>= 2.0) rspec (~> 2.11.0)
therubyracer therubyracer
timecop timecop
tzinfo tzinfo
22 changes: 11 additions & 11 deletions lib/couch_potato/view/custom_view_spec.rb
Expand Up @@ -8,35 +8,35 @@ class CustomViewSpec < BaseViewSpec
def map_function def map_function
options[:map] options[:map]
end end

def reduce_function def reduce_function
options[:reduce] options[:reduce]
end end

def view_parameters def view_parameters
{:include_docs => options[:include_docs] || false}.merge(super) {:include_docs => options[:include_docs] || false}.merge(super)
end end

def process_results(results) def process_results(results)
if count? if count?
results['rows'].first.try(:[], 'value') || 0 results['rows'].first.try(:[], 'value') || 0
else else
results['rows'].map do |row| results['rows'].map do |row|
if row['doc'].instance_of?(klass) if row['doc'].instance_of?(klass)
row['doc'] row['doc']
else else
klass.json_create row['doc'] || row['value'].merge(:_id => row['id'] || row['key']) result = row['doc'] || (row['value'].merge(:_id => row['id'] || row['key']) unless view_parameters[:include_docs])
klass.json_create result if result
end end
end end.compact
end end
end end

private private

def count? def count?
view_parameters[:reduce] view_parameters[:reduce]
end end

end end
end end
end end
4 changes: 3 additions & 1 deletion lib/couch_potato/view/model_view_spec.rb
Expand Up @@ -140,7 +140,9 @@ def process_results(results)
if count? if count?
results['rows'].first.try(:[], 'value') || 0 results['rows'].first.try(:[], 'value') || 0
else else
results['rows'].map { |row| row['doc'] || row['id'] } results['rows'].map {|row|
row['doc'] || (row['id'] unless view_parameters[:include_docs])
}.compact
end end
end end


Expand Down
24 changes: 24 additions & 0 deletions spec/unit/custom_view_spec_spec.rb
@@ -0,0 +1,24 @@
require 'spec_helper'

describe CouchPotato::View::CustomViewSpec, '#process_results' do
it 'returns the documents' do
spec = CouchPotato::View::CustomViewSpec.new(Child, 'all', {}, {})
processed_results = spec.process_results('rows' => [{'doc' => {JSON.create_id => 'Child'}}])

expect(processed_results.map{|row| row.class}).to eql([Child])
end

it 'returns values where there are no documents' do
spec = CouchPotato::View::CustomViewSpec.new(Child, 'all', {}, {:include_docs => false})
processed_results = spec.process_results('rows' => [{'value' => {JSON.create_id => 'Child'}}])

expect(processed_results.map{|row| row.class}).to eql([Child])
end

it 'filters out rows without documents when include_docs=true (i.e. doc has been deleted)' do
spec = CouchPotato::View::CustomViewSpec.new(Child, 'all', {}, {:include_docs => true})
processed_results = spec.process_results('rows' => [{'value' => {JSON.create_id => 'Child'}}])

expect(processed_results).to be_empty
end
end
25 changes: 24 additions & 1 deletion spec/unit/model_view_spec_spec.rb
@@ -1,6 +1,29 @@
require 'spec_helper' require 'spec_helper'


describe CouchPotato::View::ModelViewSpec, 'map_function' do describe CouchPotato::View::ModelViewSpec, '#process_results' do
it 'returns the documents' do
spec = CouchPotato::View::ModelViewSpec.new(Object, 'all', {}, {})
processed_results = spec.process_results('rows' => [{'doc' => 'doc-1'}])

expect(processed_results).to eql(['doc-1'])
end

it 'returns ids where there are no documents' do
spec = CouchPotato::View::ModelViewSpec.new(Object, 'all', {}, {:include_docs => false})
processed_results = spec.process_results('rows' => [{'id' => 'doc-1'}])

expect(processed_results).to eql(['doc-1'])
end

it 'filters out rows without documents when include_docs=true (i.e. doc has been deleted)' do
spec = CouchPotato::View::ModelViewSpec.new(Object, 'all', {}, {:include_docs => true})
processed_results = spec.process_results('rows' => [{'id' => 'doc-1'}])

expect(processed_results).to be_empty
end
end

describe CouchPotato::View::ModelViewSpec, '#map_function' do
it "should include conditions" do it "should include conditions" do
spec = CouchPotato::View::ModelViewSpec.new Object, 'all', {:conditions => 'doc.closed = true'}, {} spec = CouchPotato::View::ModelViewSpec.new Object, 'all', {:conditions => 'doc.closed = true'}, {}
spec.map_function.should include('if(doc.ruby_class && doc.ruby_class == \'Object\' && (doc.closed = true))') spec.map_function.should include('if(doc.ruby_class && doc.ruby_class == \'Object\' && (doc.closed = true))')
Expand Down
11 changes: 11 additions & 0 deletions spec/views_spec.rb
Expand Up @@ -278,4 +278,15 @@ class Coworker
@db.view(Coworker.all(:list => :append_doe)).first.name.should == 'joe doe' @db.view(Coworker.all(:list => :append_doe)).first.name.should == 'joe doe'
end end
end end

describe 'with stale views' do
it 'does not return deleted documents' do
build = Build.new
@db.save_document! build
@db.view(Build.timeline)
@db.destroy build

expect(@db.view(Build.timeline(:stale => 'ok'))).to be_empty
end
end
end end

0 comments on commit 74445d0

Please sign in to comment.