diff options
-rw-r--r-- | share/www/script/test/list_views.js | 20 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_show.erl | 32 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_view.erl | 4 |
3 files changed, 45 insertions, 11 deletions
diff --git a/share/www/script/test/list_views.js b/share/www/script/test/list_views.js index a7f3eadb..e297f0a3 100644 --- a/share/www/script/test/list_views.js +++ b/share/www/script/test/list_views.js @@ -166,6 +166,17 @@ couchTests.list_views = function(debug) { }) } }; + var viewOnlyDesignDoc = { + _id:"_design/views", + language: "javascript", + views : { + basicView : { + map : stringFun(function(doc) { + emit(-doc.integer, doc.string); + }) + } + } + }; T(db.save(designDoc).ok); @@ -359,4 +370,13 @@ couchTests.list_views = function(debug) { T(xhr.getResponseHeader("Content-Type") == "application/xml"); T(xhr.responseText.match(/XML/)); T(xhr.responseText.match(/entry/)); + + // Test we can run lists and views from separate docs. + T(db.save(viewOnlyDesignDoc).ok); + xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/simpleForm/views/basicView?startkey=-3"); + T(xhr.status == 200, "with query params"); + T(/Total Rows/.test(xhr.responseText)); + T(!(/Key: -4/.test(xhr.responseText))); + T(/FirstKey: -3/.test(xhr.responseText)); + T(/LastKey: 0/.test(xhr.responseText)); }; diff --git a/src/couchdb/couch_httpd_show.erl b/src/couchdb/couch_httpd_show.erl index ed0b9ede..86eba4c2 100644 --- a/src/couchdb/couch_httpd_show.erl +++ b/src/couchdb/couch_httpd_show.erl @@ -13,7 +13,7 @@ -module(couch_httpd_show). -export([handle_doc_show_req/2, handle_doc_update_req/2, handle_view_list_req/2, - handle_doc_show/5, handle_view_list/6]). + handle_doc_show/5, handle_view_list/7]). -include("couch_db.hrl"). @@ -96,9 +96,15 @@ handle_doc_show(Req, DesignName, ShowName, DocId, Db) -> end, send_doc_show_response(Lang, ShowSrc, DocId, Doc, Req, Db). +% view-list request with view and list from same design doc. handle_view_list_req(#httpd{method='GET', path_parts=[_DbName, _Design, DesignName, _List, ListName, ViewName]}=Req, Db) -> - handle_view_list(Req, DesignName, ListName, ViewName, Db, nil); + handle_view_list(Req, DesignName, ListName, DesignName, ViewName, Db, nil); + +% view-list request with view and list from different design docs. +handle_view_list_req(#httpd{method='GET', + path_parts=[_DbName, _Design, DesignName, _List, ListName, ViewDesignName, ViewName]}=Req, Db) -> + handle_view_list(Req, DesignName, ListName, ViewDesignName, ViewName, Db, nil); handle_view_list_req(#httpd{method='GET'}=Req, _Db) -> send_error(Req, 404, <<"list_error">>, <<"Invalid path.">>); @@ -108,18 +114,26 @@ handle_view_list_req(#httpd{method='POST', ReqBody = couch_httpd:body(Req), {Props2} = ?JSON_DECODE(ReqBody), Keys = proplists:get_value(<<"keys">>, Props2, nil), - handle_view_list(Req#httpd{req_body=ReqBody}, DesignName, ListName, ViewName, Db, Keys); + handle_view_list(Req#httpd{req_body=ReqBody}, DesignName, ListName, DesignName, ViewName, Db, Keys); handle_view_list_req(Req, _Db) -> send_method_not_allowed(Req, "GET,POST,HEAD"). -handle_view_list(Req, DesignName, ListName, ViewName, Db, Keys) -> - DesignId = <<"_design/", DesignName/binary>>, - #doc{body={Props}} = couch_httpd_db:couch_doc_open(Db, DesignId, nil, []), - Lang = proplists:get_value(<<"language">>, Props, <<"javascript">>), - ListSrc = couch_util:get_nested_json_value({Props}, [<<"lists">>, ListName]), - send_view_list_response(Lang, ListSrc, ViewName, DesignId, Req, Db, Keys). +handle_view_list(Req, ListDesignName, ListName, ViewDesignName, ViewName, Db, Keys) -> + ListDesignId = <<"_design/", ListDesignName/binary>>, + #doc{body={ListProps}} = couch_httpd_db:couch_doc_open(Db, ListDesignId, nil, []), + if + ViewDesignName == ListDesignName -> + ViewProps = ListProps, + ViewDesignId = ListDesignId; + true -> + ViewDesignId = <<"_design/", ViewDesignName/binary>>, + #doc{body={ViewProps}} = couch_httpd_db:couch_doc_open(Db, ViewDesignId, nil, []) + end, + ViewLang = proplists:get_value(<<"language">>, ViewProps, <<"javascript">>), + ListSrc = couch_util:get_nested_json_value({ListProps}, [<<"lists">>, ListName]), + send_view_list_response(ViewLang, ListSrc, ViewName, ViewDesignId, Req, Db, Keys). send_view_list_response(Lang, ListSrc, ViewName, DesignId, Req, Db, Keys) -> diff --git a/src/couchdb/couch_httpd_view.erl b/src/couchdb/couch_httpd_view.erl index d2f22c77..884402da 100644 --- a/src/couchdb/couch_httpd_view.erl +++ b/src/couchdb/couch_httpd_view.erl @@ -83,7 +83,7 @@ handle_db_view_req(#httpd{method='GET', case ListName of nil -> couch_httpd_view:design_doc_view(Req, Db, DName, ViewName, nil); _ -> - couch_httpd_show:handle_view_list(Req, DName, ListName, ViewName, Db, nil) + couch_httpd_show:handle_view_list(Req, DName, ListName, DName, ViewName, Db, nil) end; handle_db_view_req(#httpd{method='POST', @@ -110,7 +110,7 @@ handle_db_view_req(#httpd{method='POST', {Props2} = ?JSON_DECODE(ReqBody), Keys = proplists:get_value(<<"keys">>, Props2, nil), couch_httpd_show:handle_view_list(Req#httpd{req_body=ReqBody}, - DName, ListName, ViewName, Db, Keys) + DName, ListName, DName, ViewName, Db, Keys) end; handle_db_view_req(Req, _Db) -> |