From 92e3043c7007446ae0a61fe094dbdc63609767b1 Mon Sep 17 00:00:00 2001 From: mkalkbrenner Date: Tue, 11 Jan 2011 23:22:28 +0100 Subject: [PATCH 1/4] support "end_key" and "end_docid" in query_view/5 --- hovercraft.erl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/hovercraft.erl b/hovercraft.erl index 58c6916..0543987 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,7 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ {ok, View, _Group} -> {ok, RowCount} = couch_view:get_row_count(View), Start = {StartKey, StartDocId}, + End = {EndKey, EndDocId}, UpdateSeq = couch_db:get_update_seq(Db), FoldlFun = couch_httpd_view:make_view_fold_fun(nil, QueryArgs, <<"">>, Db, UpdateSeq, RowCount, @@ -241,7 +244,7 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ FoldAccInit = {Limit, SkipCount, undefined, []}, {ok, _, {_Lim, _, _, {Offset, ViewFoldAcc}}} = couch_view:fold(View, FoldlFun, FoldAccInit, - [{dir, Dir}, {start_key, Start}]), + [{dir, Dir}, {start_key, Start}, {end_key, End}]), {ok, {RowCount, Offset, ViewFoldAcc}}; {not_found, Reason} -> case couch_view:get_reduce_view(Db, DesignId, ViewName, Stale) of From 559bbed02871fc70dc7ef67acf377925a5870cb6 Mon Sep 17 00:00:00 2001 From: mkalkbrenner Date: Fri, 14 Jan 2011 20:57:28 +0100 Subject: [PATCH 2/4] return {ok, {RowCount, RowCount, []}} as view result if direction fwd and end_key lower than start_key or vice versa --- hovercraft.erl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/hovercraft.erl b/hovercraft.erl index 0543987..f3921bc 100644 --- a/hovercraft.erl +++ b/hovercraft.erl @@ -242,10 +242,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}, {end_key, End}]), - {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} -> From b962188b2e27a47d4f09e8eadbd9e7685c7b1aa4 Mon Sep 17 00:00:00 2001 From: Christian Spitzlay Date: Wed, 19 Jan 2011 15:24:20 +0100 Subject: [PATCH 3/4] I think the values for end_key need to be plain values, not tuples. same for start_key; both are attempted to be matched with the atom undefined in couchdb_btree; start_docid and end_docid do not seem to be used here. --- hovercraft.erl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hovercraft.erl b/hovercraft.erl index f3921bc..a309e8a 100644 --- a/hovercraft.erl +++ b/hovercraft.erl @@ -231,8 +231,6 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ case couch_view:get_map_view(Db, DesignId, ViewName, Stale) of {ok, View, _Group} -> {ok, RowCount} = couch_view:get_row_count(View), - Start = {StartKey, StartDocId}, - End = {EndKey, EndDocId}, UpdateSeq = couch_db:get_update_seq(Db), FoldlFun = couch_httpd_view:make_view_fold_fun(nil, QueryArgs, <<"">>, Db, UpdateSeq, RowCount, @@ -242,7 +240,7 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ send_row = make_map_row_fold_fun(ViewFoldFun) }), FoldAccInit = {Limit, SkipCount, undefined, []}, - case couch_view:fold(View, FoldlFun, FoldAccInit, [{dir, Dir}, {start_key, Start}, {end_key, End}]) of + case couch_view:fold(View, FoldlFun, FoldAccInit, [{dir, Dir}, {start_key, StartKey}, {end_key, EndKey}]) of {ok, _, {_Lim, _, _, {Offset, ViewFoldAcc}}} -> {ok, {RowCount, Offset, ViewFoldAcc}}; {ok, _, FoldAccInit} -> From 48fcf934c7d8f1abb2e785c657879c94037e4bdd Mon Sep 17 00:00:00 2001 From: mkalkbrenner Date: Wed, 19 Jan 2011 19:17:11 +0100 Subject: [PATCH 4/4] If EndKey is defined, couchdb's query view expects a tuple {EndKey, EndDocId} to "make_key_in_end_range". If EndKey is undefined, couchdb expects atom undefined. --- hovercraft.erl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hovercraft.erl b/hovercraft.erl index a309e8a..8745d60 100644 --- a/hovercraft.erl +++ b/hovercraft.erl @@ -231,6 +231,10 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ case couch_view:get_map_view(Db, DesignId, ViewName, Stale) of {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, @@ -240,7 +244,7 @@ query_view(DbName, DesignName, ViewName, ViewFoldFun, #view_query_args{ send_row = make_map_row_fold_fun(ViewFoldFun) }), FoldAccInit = {Limit, SkipCount, undefined, []}, - case couch_view:fold(View, FoldlFun, FoldAccInit, [{dir, Dir}, {start_key, StartKey}, {end_key, EndKey}]) of + 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} ->