diff --git a/hovercraft.erl b/hovercraft.erl index 58c6916..8745d60 100644 --- a/hovercraft.erl +++ b/hovercraft.erl @@ -221,7 +221,9 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ direction = Dir, group_level = GroupLevel, start_key = StartKey, - start_docid = StartDocId + start_docid = StartDocId, + end_key = EndKey, + end_docid = EndDocId }=QueryArgs) -> {ok, Db} = open_db(DbName), % get view reference @@ -230,6 +232,9 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ {ok, View, _Group} -> {ok, RowCount} = couch_view:get_row_count(View), Start = {StartKey, StartDocId}, + %If EndKey is defined, couchdb expects a tuple {EndKey, EndDocId} to "make_key_in_end_range". + %If EndKey is undefined, couchdb expects atom undefined. + End = case EndKey == undefined of true -> undefined; false -> {EndKey, EndDocId} end, UpdateSeq = couch_db:get_update_seq(Db), FoldlFun = couch_httpd_view:make_view_fold_fun(nil, QueryArgs, <<"">>, Db, UpdateSeq, RowCount, @@ -239,10 +244,13 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ send_row = make_map_row_fold_fun(ViewFoldFun) }), FoldAccInit = {Limit, SkipCount, undefined, []}, - {ok, _, {_Lim, _, _, {Offset, ViewFoldAcc}}} = - couch_view:fold(View, FoldlFun, FoldAccInit, - [{dir, Dir}, {start_key, Start}]), - {ok, {RowCount, Offset, ViewFoldAcc}}; + case couch_view:fold(View, FoldlFun, FoldAccInit, [{dir, Dir}, {start_key, Start}, {end_key, End}]) of + {ok, _, {_Lim, _, _, {Offset, ViewFoldAcc}}} -> + {ok, {RowCount, Offset, ViewFoldAcc}}; + {ok, _, FoldAccInit} -> + %direction fwd and end_key lower than start_key or vice versa? + {ok, {RowCount, RowCount, []}} + end; {not_found, Reason} -> case couch_view:get_reduce_view(Db, DesignId, ViewName, Stale) of {ok, View, _Group} ->