Merge branch 'master' of git://github.com/couchrest/couchrest

This commit is contained in:
Sam Lown 2010-03-30 20:57:22 +00:00
commit 1b019fa3fe
11 changed files with 222 additions and 113 deletions

View file

@ -44,7 +44,14 @@ module CouchRest
CouchRest.get url
end
end
# Query a CouchDB-Lucene search view
def search(name, params={})
# -> http://localhost:5984/yourdb/_fti/YourDesign/by_name?include_docs=true&q=plop*'
url = CouchRest.paramify_url "#{root}/_fti/#{name}", params
CouchRest.get url
end
# load a set of documents by passing an array of ids
def get_bulk(ids)
documents(:keys => ids, :include_docs => true)
@ -297,15 +304,13 @@ module CouchRest
end
# Replicates via "pulling" from another database to this database. Makes no attempt to deal with conflicts.
def replicate_from other_db
raise ArgumentError, "must provide a CouchReset::Database" unless other_db.kind_of?(CouchRest::Database)
CouchRest.post "#{@host}/_replicate", :source => other_db.root, :target => name
def replicate_from other_db, continuous=false
replicate other_db, continuous, :target => name
end
# Replicates via "pushing" to another database. Makes no attempt to deal with conflicts.
def replicate_to other_db
raise ArgumentError, "must provide a CouchReset::Database" unless other_db.kind_of?(CouchRest::Database)
CouchRest.post "#{@host}/_replicate", :target => other_db.root, :source => name
def replicate_to other_db, continuous=false
replicate other_db, continuous, :source => name
end
# DELETE the database itself. This is not undoable and could be rather
@ -317,6 +322,19 @@ module CouchRest
private
def replicate other_db, continuous, options
raise ArgumentError, "must provide a CouchReset::Database" unless other_db.kind_of?(CouchRest::Database)
raise ArgumentError, "must provide a target or source option" unless (options.key?(:target) || options.key?(:source))
payload = options
if options.has_key?(:target)
payload[:source] = other_db.root
else
payload[:target] = other_db.root
end
payload[:continuous] = continuous
CouchRest.post "#{@host}/_replicate", payload
end
def clear_extended_doc_fresh_cache
::CouchRest::ExtendedDocument.subclasses.each{|klass| klass.design_doc_fresh = false if klass.respond_to?(:design_doc_fresh=) }
end

View file

@ -42,7 +42,12 @@ module CouchRest
#
# Defaults are used if these options are not specified.
def paginated_each(options, &block)
proxy = create_collection_proxy(options)
search = options.delete(:search)
unless search == true
proxy = create_collection_proxy(options)
else
proxy = create_search_collection_proxy(options)
end
proxy.paginated_each(options, &block)
end
@ -61,6 +66,11 @@ module CouchRest
CollectionProxy.new(database, design_doc, view_name, view_options, self)
end
def create_search_collection_proxy(options)
design_doc, search_name, search_options = parse_search_options(options)
CollectionProxy.new(@database, design_doc, search_name, search_options, self, :search)
end
def parse_view_options(options)
design_doc = options.delete(:design_doc)
raise ArgumentError, 'design_doc is required' if design_doc.nil?
@ -75,6 +85,18 @@ module CouchRest
[design_doc, view_name, view_options]
end
def parse_search_options(options)
design_doc = options.delete(:design_doc)
raise ArgumentError, 'design_doc is required' if design_doc.nil?
search_name = options.delete(:view_name)
raise ArgumentError, 'search_name is required' if search_name.nil?
search_options = options.clone
[design_doc, search_name, search_options]
end
end
class CollectionProxy
@ -91,11 +113,12 @@ module CouchRest
#
# The CollectionProxy provides support for paginating over a collection
# via the paginate, and paginated_each methods.
def initialize(database, design_doc, view_name, view_options = {}, container_class = nil)
def initialize(database, design_doc, view_name, view_options = {}, container_class = nil, query_type = :view)
raise ArgumentError, "database is a required parameter" if database.nil?
@database = database
@container_class = container_class
@query_type = query_type
strip_pagination_options(view_options)
@view_options = view_options
@ -110,10 +133,22 @@ module CouchRest
# See Collection.paginate
def paginate(options = {})
page, per_page = parse_options(options)
results = @database.view(@view_name, pagination_options(page, per_page))
results = @database.send(@query_type, @view_name, pagination_options(page, per_page))
remember_where_we_left_off(results, page)
results = convert_to_container_array(results)
results
instances = convert_to_container_array(results)
begin
if Kernel.const_get('WillPaginate')
total_rows = results['total_rows'].to_i
paginated = WillPaginate::Collection.create(page, per_page, total_rows) do |pager|
pager.replace(instances)
end
return paginated
end
rescue NameError
# When not using will_paginate, not much we could do about this. :x
end
return instances
end
# See Collection.paginated_each
@ -152,7 +187,8 @@ module CouchRest
def load_target
unless loaded?
results = @database.view(@view_name, @view_options)
@view_options.merge!({:include_docs => true}) if @query_type == :search
results = @database.send(@query_type, @view_name, @view_options)
@target = convert_to_container_array(results)
end
@loaded = true
@ -189,7 +225,7 @@ module CouchRest
def pagination_options(page, per_page)
view_options = @view_options.clone
if @last_key && @last_docid && @last_page == page - 1
if @query_type == :view && @last_key && @last_docid && @last_page == page - 1
key = view_options.delete(:key)
end_key = view_options[:endkey] || key
options = { :startkey => @last_key, :endkey => end_key, :startkey_docid => @last_docid, :limit => per_page, :skip => 1 }

View file

@ -39,7 +39,7 @@ if RUBY_VERSION.to_f < 1.9
if IO.select([@io], nil, nil, @read_timeout)
retry
else
raise Timeout::Error
raise Timeout::Error, "IO timeout"
end
end
else