From 53b9d1275f3e0d25cbf637eee651e94382dd6a01 Mon Sep 17 00:00:00 2001 From: John Christopher Anderson Date: Sun, 5 Oct 2008 05:32:28 +0000 Subject: remove unnecessary negative count feature git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@701748 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/couch_tests.js | 37 ++----------------------------- src/couchdb/couch_httpd_view.erl | 47 ++++------------------------------------ 2 files changed, 6 insertions(+), 78 deletions(-) diff --git a/share/www/script/couch_tests.js b/share/www/script/couch_tests.js index cc08e6f8..3abd570e 100644 --- a/share/www/script/couch_tests.js +++ b/share/www/script/couch_tests.js @@ -1101,7 +1101,7 @@ var tests = { var queryFun = function(doc) { emit(doc.integer, null) }; var i; - // page through the view ascending and going forward + // page through the view ascending for (i = 0; i < docs.length; i += 10) { var queryResults = db.query(queryFun, null, { startkey: i, @@ -1117,23 +1117,7 @@ var tests = { } } - // page through the view ascending and going backward - for (i = docs.length - 1; i >= 0; i -= 10) { - var queryResults = db.query(queryFun, null, { - startkey: i, - startkey_docid: i, - count:-10 - }); - T(queryResults.rows.length == 10) - T(queryResults.total_rows == docs.length) - T(queryResults.offset == i - 9) - var j; - for (j = 0; j < 10;j++) { - T(queryResults.rows[j].key == i - 9 + j); - } - } - - // page through the view descending and going forward + // page through the view descending for (i = docs.length - 1; i >= 0; i -= 10) { var queryResults = db.query(queryFun, null, { startkey: i, @@ -1150,23 +1134,6 @@ var tests = { } } - // page through the view descending and going backward - for (i = 0; i < docs.length; i += 10) { - var queryResults = db.query(queryFun, null, { - startkey: i, - startkey_docid: i, - descending: true, - count:-10 - }); - T(queryResults.rows.length == 10) - T(queryResults.total_rows == docs.length) - T(queryResults.offset == docs.length - i - 10) - var j; - for (j = 0; j < 10; j++) { - T(queryResults.rows[j].key == i + 9 - j); - } - } - // ignore decending=false. CouchDB should just ignore that. for (i = 0; i < docs.length; i += 10) { var queryResults = db.query(queryFun, null, { diff --git a/src/couchdb/couch_httpd_view.erl b/src/couchdb/couch_httpd_view.erl index 0f3dd144..e634e8e2 100644 --- a/src/couchdb/couch_httpd_view.erl +++ b/src/couchdb/couch_httpd_view.erl @@ -182,16 +182,8 @@ parse_view_query(Req) -> case (catch list_to_integer(Value)) of Count when is_integer(Count) -> if Count < 0 -> - Args#view_query_args { - direction = - if Args#view_query_args.direction == rev -> fwd; - true -> rev - end, - count=Count, - start_key = reverse_key_default(Args#view_query_args.start_key), - start_docid = reverse_key_default(Args#view_query_args.start_docid), - end_key = reverse_key_default(Args#view_query_args.end_key), - end_docid = reverse_key_default(Args#view_query_args.end_docid)}; + Msg = io_lib:format("Count must be a positive integer: count=~s", [Value]), + throw({query_parse_error, Msg}); true -> Args#view_query_args{count=Count} end; @@ -248,8 +240,7 @@ make_view_fold_fun(Req, QueryArgs, TotalViewCount, ReduceCountFun) -> #view_query_args{ end_key = EndKey, end_docid = EndDocId, - direction = Dir, - count = Count + direction = Dir } = QueryArgs, PassedEndFun = @@ -264,33 +255,7 @@ make_view_fold_fun(Req, QueryArgs, TotalViewCount, ReduceCountFun) -> end end, - NegCountFun = fun({{Key, DocId}, Value}, OffsetReds, - {AccCount, AccSkip, Resp, AccRevRows}) -> - Offset = ReduceCountFun(OffsetReds), - PassedEnd = PassedEndFun(Key, DocId), - case {PassedEnd, AccCount, AccSkip, Resp} of - {true, _, _, _} -> % The stop key has been passed, stop looping. - {stop, {AccCount, AccSkip, Resp, AccRevRows}}; - {_, 0, _, _} -> % we've done "count" rows, stop foldling - {stop, {0, 0, Resp, AccRevRows}}; - {_, _, AccSkip, _} when AccSkip > 0 -> - {ok, {AccCount, AccSkip - 1, Resp, AccRevRows}}; - {_, _, _, undefined} -> - {ok, Resp2} = start_json_response(Req, 200), - Offset2 = TotalViewCount - Offset - - lists:min([TotalViewCount - Offset, - AccCount]), - JsonBegin = io_lib:format("{\"total_rows\":~w,\"offset\":~w,\"rows\":[\r\n", - [TotalViewCount, Offset2]), - send_chunk(Resp2, JsonBegin), - JsonObj = {[{id, DocId}, {key, Key}, {value, Value}]}, - {ok, {AccCount + 1, 0, Resp2, [?JSON_ENCODE(JsonObj) | AccRevRows]}}; - {_, AccCount, _, Resp} -> - JsonObj = {[{id, DocId}, {key, Key}, {value, Value}]}, - {ok, {AccCount + 1, 0, Resp, [?JSON_ENCODE(JsonObj), ",\r\n" | AccRevRows]}} - end - end, - - PosCountFun = fun({{Key, DocId}, Value}, OffsetReds, + fun({{Key, DocId}, Value}, OffsetReds, {AccCount, AccSkip, Resp, AccRevRows}) -> Offset = ReduceCountFun(OffsetReds), % I think we only need this call once per view PassedEnd = PassedEndFun(Key, DocId), @@ -316,10 +281,6 @@ make_view_fold_fun(Req, QueryArgs, TotalViewCount, ReduceCountFun) -> send_chunk(Resp, ",\r\n" ++ ?JSON_ENCODE(JsonObj)), {ok, {AccCount - 1, 0, Resp, AccRevRows}} end - end, - case Count > 0 of - true -> PosCountFun; - false -> NegCountFun end. finish_view_fold(Req, TotalRows, FoldResult) -> -- cgit v1.2.3