From fbabdb19583198cf77add0b9cff354d70c45ff5a Mon Sep 17 00:00:00 2001 From: John Christopher Anderson Date: Fri, 9 Jan 2009 19:03:22 +0000 Subject: fixed _all_docs view to use the correct PassedEndFun for binary docid sorting git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@733116 13f79535-47bb-0310-9956-ffa450edef68 --- src/couchdb/couch_db_updater.erl | 14 ++++++++------ src/couchdb/couch_httpd_db.erl | 16 +++++++++++++++- src/couchdb/couch_httpd_view.erl | 13 +++++++++---- 3 files changed, 32 insertions(+), 11 deletions(-) (limited to 'src/couchdb') diff --git a/src/couchdb/couch_db_updater.erl b/src/couchdb/couch_db_updater.erl index 049a354e..94605a3c 100644 --- a/src/couchdb/couch_db_updater.erl +++ b/src/couchdb/couch_db_updater.erl @@ -14,6 +14,7 @@ -behaviour(gen_server). -export([btree_by_id_reduce/2,btree_by_seq_reduce/2]). +-export([less_docid/2]). -export([init/1,terminate/2,handle_call/3,handle_cast/2,code_change/3,handle_info/2]). -include("couch_db.hrl"). @@ -245,6 +246,12 @@ simple_upgrade_record(Old, New) -> lists:sublist(tuple_to_list(New), size(Old) + 1, size(New)-size(Old)), list_to_tuple(tuple_to_list(Old) ++ NewValuesTail). +% used for doc insertion, also for the PassedEndFun on all_docs view +less_docid(A, B) when A==B -> false; +less_docid(nil, _) -> true; % nil - special key sorts before all +less_docid({}, _) -> false; % {} -> special key sorts after all +less_docid(A, B) -> A < B. + init_db(DbName, Filepath, Fd, Header0) -> case element(2, Header0) of ?LATEST_DISK_VERSION -> ok; @@ -253,12 +260,7 @@ init_db(DbName, Filepath, Fd, Header0) -> Header = simple_upgrade_record(Header0, #db_header{}), {ok, SummaryStream} = couch_stream:open(Header#db_header.summary_stream_state, Fd), ok = couch_stream:set_min_buffer(SummaryStream, 10000), - Less = - fun(A,B) when A==B -> false; - (nil, _) -> true; % nil - special key sorts before all - ({}, _) -> false; % {} -> special key sorts after all - (A, B) -> A < B - end, + Less = fun less_docid/2, {ok, IdBtree} = couch_btree:open(Header#db_header.fulldocinfo_by_id_btree_state, Fd, [{split, fun(X) -> btree_by_id_split(X) end}, diff --git a/src/couchdb/couch_httpd_db.erl b/src/couchdb/couch_httpd_db.erl index df8eba80..5366da1e 100644 --- a/src/couchdb/couch_httpd_db.erl +++ b/src/couchdb/couch_httpd_db.erl @@ -268,6 +268,8 @@ all_docs_view(Req, Db, Keys) -> #view_query_args{ start_key = StartKey, start_docid = StartDocId, + end_key = EndKey, + end_docid = EndDocId, limit = Limit, skip = SkipCount, direction = Dir @@ -279,10 +281,22 @@ all_docs_view(Req, Db, Keys) -> end, FoldAccInit = {Limit, SkipCount, undefined, []}, + PassedEndFun = + case Dir of + fwd -> + fun(ViewKey, _ViewId) -> + couch_db_updater:less_docid(EndKey, ViewKey) + end; + rev-> + fun(ViewKey, _ViewId) -> + couch_db_updater:less_docid(ViewKey, EndKey) + end + end, + case Keys of nil -> FoldlFun = couch_httpd_view:make_view_fold_fun(Req, QueryArgs, Db, - TotalRowCount, fun couch_db:enum_docs_reduce_to_count/1), + TotalRowCount, fun couch_db:enum_docs_reduce_to_count/1, PassedEndFun), AdapterFun = fun(#full_doc_info{id=Id}=FullDocInfo, Offset, Acc) -> case couch_doc:to_doc_info(FullDocInfo) of #doc_info{deleted=false, rev=Rev} -> diff --git a/src/couchdb/couch_httpd_view.erl b/src/couchdb/couch_httpd_view.erl index de184de9..76b2f4af 100644 --- a/src/couchdb/couch_httpd_view.erl +++ b/src/couchdb/couch_httpd_view.erl @@ -15,7 +15,7 @@ -export([handle_view_req/2,handle_slow_view_req/2]). --export([parse_view_query/1,parse_view_query/2,make_view_fold_fun/5,finish_view_fold/3]). +-export([parse_view_query/1,parse_view_query/2,make_view_fold_fun/5, make_view_fold_fun/6,finish_view_fold/3]). -import(couch_httpd, [send_json/2,send_json/3,send_json/4,send_method_not_allowed/2, @@ -361,14 +361,13 @@ parse_view_query(Req, Keys, IsReduce) -> end. -make_view_fold_fun(Req, QueryArgs, Db, TotalViewCount, ReduceCountFun) -> +make_view_fold_fun(Req, QueryArgs, Db, + TotalViewCount, ReduceCountFun) -> #view_query_args{ end_key = EndKey, end_docid = EndDocId, - include_docs = IncludeDocs, direction = Dir } = QueryArgs, - PassedEndFun = case Dir of fwd -> @@ -380,6 +379,12 @@ make_view_fold_fun(Req, QueryArgs, Db, TotalViewCount, ReduceCountFun) -> couch_view:less_json([ViewKey, ViewId], [EndKey, EndDocId]) end end, + make_view_fold_fun(Req, QueryArgs, Db, TotalViewCount, ReduceCountFun, PassedEndFun). + +make_view_fold_fun(Req, QueryArgs, Db, TotalViewCount, ReduceCountFun, PassedEndFun) -> + #view_query_args{ + include_docs = IncludeDocs + } = QueryArgs, fun({{Key, DocId}, Value}, OffsetReds, {AccLimit, AccSkip, Resp, AccRevRows}) -> -- cgit v1.2.3