You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by jc...@apache.org on 2009/06/07 00:55:22 UTC
svn commit: r782318 - in /couchdb/branches/list-iterator:
share/server/render.js share/www/script/test/list_views.js
src/couchdb/couch_httpd_show.erl src/couchdb/couch_query_servers.erl
test/query_server_spec.rb
Author: jchris
Date: Sat Jun 6 22:55:22 2009
New Revision: 782318
URL: http://svn.apache.org/viewvc?rev=782318&view=rev
Log:
more list api tests passing
Modified:
couchdb/branches/list-iterator/share/server/render.js
couchdb/branches/list-iterator/share/www/script/test/list_views.js
couchdb/branches/list-iterator/src/couchdb/couch_httpd_show.erl
couchdb/branches/list-iterator/src/couchdb/couch_query_servers.erl
couchdb/branches/list-iterator/test/query_server_spec.rb
Modified: couchdb/branches/list-iterator/share/server/render.js
URL: http://svn.apache.org/viewvc/couchdb/branches/list-iterator/share/server/render.js?rev=782318&r1=782317&r2=782318&view=diff
==============================================================================
--- couchdb/branches/list-iterator/share/server/render.js (original)
+++ couchdb/branches/list-iterator/share/server/render.js Sat Jun 6 22:55:22 2009
@@ -129,7 +129,7 @@
bestKey = req.query.format;
}
var rFunc = responders[bestKey || responders.fallback || "html"];
- if (rFunc) {
+ if (rFunc) {
var resp = maybeWrapResponse(rFunc());
resp["headers"] = resp["headers"] || {};
resp["headers"]["Content-Type"] = bestMime;
@@ -189,7 +189,7 @@
};
function sendStart(label) {
- respond([label||"start", chunks, startResp]);
+ respond(["start", chunks, startResp]);
chunks = [];
startResp = {};
}
@@ -204,8 +204,9 @@
chunks = [];
};
-var gotRow = false;
+var gotRow = false, lastRow = false;
function getRow() {
+ if (lastRow) return null;
if (!gotRow) {
gotRow = true;
sendStart();
@@ -214,7 +215,10 @@
}
var line = readline();
var json = eval(line);
- if (json[0] == "list_end") return null;
+ if (json[0] == "list_end") {
+ lastRow = true
+ return null;
+ }
if (json[0] != "list_row") {
respond({
error: "query_server_error",
@@ -269,13 +273,13 @@
function runListRenderFunction(renderFun, args, funSrc, htmlErrors) {
try {
gotRow = false;
+ lastRow = false;
var resp = renderFun.apply(null, args);
- if (resp) chunks.push(resp);
if (!gotRow) {
- sendStart("resp");
- } else {
- blowChunks("end");
+ getRow();
}
+ if (resp) chunks.push(resp);
+ blowChunks("end");
} catch(e) {
respondError(e);
}
Modified: couchdb/branches/list-iterator/share/www/script/test/list_views.js
URL: http://svn.apache.org/viewvc/couchdb/branches/list-iterator/share/www/script/test/list_views.js?rev=782318&r1=782317&r2=782318&view=diff
==============================================================================
--- couchdb/branches/list-iterator/share/www/script/test/list_views.js (original)
+++ couchdb/branches/list-iterator/share/www/script/test/list_views.js Sat Jun 6 22:55:22 2009
@@ -87,11 +87,12 @@
html : function() {
send("HTML <ul>");
- var row;
+ var row, num = 0;
while (row = getRow()) {
+ num ++;
send('\n<li>Key: '
+row.key+' Value: '+row.value
- +' LineNo: '+row_info.row_number+'</li>');
+ +' LineNo: '+num+'</li>');
}
// tail
@@ -139,6 +140,18 @@
}
});
}),
+ tooManyGetRows : stringFun(function() {
+ send("head");
+ var row;
+ while(row = getRow()) {
+ send(row.key);
+ };
+ getRow();
+ getRow();
+ getRow();
+ row = getRow();
+ return "after row: "+toJSON(row);
+ }),
emptyList: stringFun(function() {
return "";
}),
@@ -206,21 +219,25 @@
var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/simpleForm/basicView?startkey=30");
T(xhr.status == 200, "0 rows");
T(/Total Rows/.test(xhr.responseText));
- return;
+
+ //too many Get Rows
+ var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/tooManyGetRows/basicView");
+ T(xhr.status == 200, "tooManyGetRows");
+ T(/9after row: null/.test(xhr.responseText));
// reduce with 0 rows
var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/simpleForm/withReduce?startkey=30");
T(xhr.status == 200, "reduce 0 rows");
T(/Total Rows/.test(xhr.responseText));
- T(/Offset: undefined/.test(xhr.responseText));
-
+ T(/LastKey: undefined/.test(xhr.responseText));
// when there is a reduce present, but not used
var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/simpleForm/withReduce?reduce=false");
T(xhr.status == 200, "reduce false");
T(/Total Rows/.test(xhr.responseText));
T(/Key: 1/.test(xhr.responseText));
+
// when there is a reduce present, and used
xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/simpleForm/withReduce?group=true");
@@ -243,32 +260,13 @@
headers: {"if-none-match": etag}
});
T(xhr.status == 200, "reduce etag");
-
- // with accept headers for HTML
- xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/acceptSwitch/basicView", {
- headers: {
- "Accept": 'text/html'
- }
- });
- T(xhr.getResponseHeader("Content-Type") == "text/html");
- T(xhr.responseText.match(/HTML/));
- T(xhr.responseText.match(/Value/));
- // now with xml
- xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/acceptSwitch/basicView", {
- headers: {
- "Accept": 'application/xml'
- }
- });
- T(xhr.getResponseHeader("Content-Type") == "application/xml");
- T(xhr.responseText.match(/XML/));
- T(xhr.responseText.match(/entry/));
+ return;
// now with extra qs params
var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/qsParams/basicView?foo=blam");
T(xhr.responseText.match(/blam/));
- // aborting iteration
var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/stopIter/basicView");
T("content type" == "text/plain");
T(xhr.responseText.match(/^head 0 1 2 tail$/) && "basic stop");
@@ -307,4 +305,25 @@
var xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/rowError/basicView");
T(/<h1>Render Error<\/h1>/.test(xhr.responseText));
+
+
+ // with accept headers for HTML
+ xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/acceptSwitch/basicView", {
+ headers: {
+ "Accept": 'text/html'
+ }
+ });
+ T(xhr.getResponseHeader("Content-Type") == "text/html");
+ T(xhr.responseText.match(/HTML/));
+ T(xhr.responseText.match(/Value/));
+
+ // now with xml
+ xhr = CouchDB.request("GET", "/test_suite_db/_design/lists/_list/acceptSwitch/basicView", {
+ headers: {
+ "Accept": 'application/xml'
+ }
+ });
+ T(xhr.getResponseHeader("Content-Type") == "application/xml");
+ T(xhr.responseText.match(/XML/));
+ T(xhr.responseText.match(/entry/));
};
Modified: couchdb/branches/list-iterator/src/couchdb/couch_httpd_show.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/list-iterator/src/couchdb/couch_httpd_show.erl?rev=782318&r1=782317&r2=782318&view=diff
==============================================================================
--- couchdb/branches/list-iterator/src/couchdb/couch_httpd_show.erl (original)
+++ couchdb/branches/list-iterator/src/couchdb/couch_httpd_show.erl Sat Jun 6 22:55:22 2009
@@ -119,7 +119,7 @@
make_map_start_resp_fun(QueryServer, Db) ->
fun(Req, CurrentEtag, TotalViewCount, Offset, _Acc) ->
- [_,Chunks,ExternalResp] = couch_query_servers:render_list_head(QueryServer,
+ [<<"start">>,Chunks,ExternalResp] = couch_query_servers:render_list_head(QueryServer,
Req, Db, TotalViewCount, Offset),
JsonResp = apply_etag(ExternalResp, CurrentEtag),
#extern_resp_args{
@@ -137,18 +137,10 @@
try
[<<"chunks">>,Chunks] = couch_query_servers:render_list_row(QueryServer,
Req, Db2, {{Key, DocId}, Value}),
- case {false, 5} of
- {_, 0} ->
- {stop, ""};
- {true, _} ->
- Chunk = RowFront ++ ?b2l(?l2b(Chunks)),
- send_non_empty_chunk(Resp, Chunk),
- {stop, ""};
- _ ->
- Chunk = RowFront ++ ?b2l(?l2b(Chunks)),
- send_non_empty_chunk(Resp, Chunk),
- {ok, ""}
- end
+ Chunk = RowFront ++ ?b2l(?l2b(Chunks)),
+ send_non_empty_chunk(Resp, Chunk),
+ % {stop, ""};
+ {ok, ""}
catch
throw:Error ->
send_chunked_error(Resp, Error),
@@ -234,39 +226,28 @@
make_reduce_start_resp_fun(QueryServer, Req, Db, CurrentEtag) ->
fun(Req2, _Etag, _Acc) ->
- JsonResp = couch_query_servers:render_reduce_head(QueryServer,
+ [<<"start">>,Chunks,JsonResp] = couch_query_servers:render_reduce_head(QueryServer,
Req2, Db),
JsonResp2 = apply_etag(JsonResp, CurrentEtag),
#extern_resp_args{
code = Code,
- data = BeginBody,
ctype = CType,
headers = ExtHeaders
} = couch_httpd_external:parse_external_response(JsonResp2),
JsonHeaders = couch_httpd_external:default_or_content_type(CType, ExtHeaders),
{ok, Resp} = start_chunked_response(Req, Code, JsonHeaders),
- {ok, Resp, binary_to_list(BeginBody)}
+ {ok, Resp, ?b2l(?l2b(Chunks))}
end.
make_reduce_send_row_fun(QueryServer, Req, Db) ->
fun(Resp, {Key, Value}, RowFront) ->
try
- JsonResp = couch_query_servers:render_reduce_row(QueryServer,
+ [<<"chunks">>,Chunks] = couch_query_servers:render_reduce_row(QueryServer,
Req, Db, {Key, Value}),
- #extern_resp_args{
- stop = StopIter,
- data = RowBody
- } = couch_httpd_external:parse_external_response(JsonResp),
- case StopIter of
- true -> {stop, ""};
- _ ->
- Chunk = RowFront ++ binary_to_list(RowBody),
- case Chunk of
- [] -> ok;
- _ -> send_chunk(Resp, Chunk)
- end,
- {ok, ""}
- end
+ ?LOG_ERROR("RowFront ~p",[RowFront]),
+ Chunk = RowFront ++ ?b2l(?l2b(Chunks)),
+ send_non_empty_chunk(Resp, Chunk),
+ {ok, ""}
catch
throw:Error ->
send_chunked_error(Resp, Error),
@@ -361,9 +342,11 @@
end,
send_chunk(Resp, []).
+render_head_for_empty_list(StartListRespFun, Req, Etag, null) ->
+ StartListRespFun(Req, Etag, []); % for reduce
render_head_for_empty_list(StartListRespFun, Req, Etag, TotalRows) ->
StartListRespFun(Req, Etag, TotalRows, null, []).
-
+
send_doc_show_response(Lang, ShowSrc, DocId, nil, #httpd{mochi_req=MReq}=Req, Db) ->
% compute etag with no doc
Headers = MReq:get(headers),
Modified: couchdb/branches/list-iterator/src/couchdb/couch_query_servers.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/list-iterator/src/couchdb/couch_query_servers.erl?rev=782318&r1=782317&r2=782318&view=diff
==============================================================================
--- couchdb/branches/list-iterator/src/couchdb/couch_query_servers.erl (original)
+++ couchdb/branches/list-iterator/src/couchdb/couch_query_servers.erl Sat Jun 6 22:55:22 2009
@@ -213,7 +213,7 @@
render_reduce_head({_Lang, Pid}, Req, Db) ->
Head = {[]},
JsonReq = couch_httpd_external:json_req_obj(Req, Db),
- couch_os_process:prompt(Pid, [<<"list_begin">>, Head, JsonReq]).
+ couch_os_process:prompt(Pid, [<<"list">>, Head, JsonReq]).
render_reduce_row({_Lang, Pid}, Req, Db, {Key, Value}) ->
JsonRow = {[{key, Key}, {value, Value}]},
Modified: couchdb/branches/list-iterator/test/query_server_spec.rb
URL: http://svn.apache.org/viewvc/couchdb/branches/list-iterator/test/query_server_spec.rb?rev=782318&r1=782317&r2=782318&view=diff
==============================================================================
--- couchdb/branches/list-iterator/test/query_server_spec.rb (original)
+++ couchdb/branches/list-iterator/test/query_server_spec.rb Sat Jun 6 22:55:22 2009
@@ -226,7 +226,9 @@
end
it "should do headers proper" do
@qs.rrun(["list", {"total_rows"=>1000}, {"q" => "ok"}])
- @qs.jsgets.should == ["resp", ["first chunk", 'second "chunk"', "tail"], {"headers"=>{"Content-Type"=>"text/plain"}}]
+ @qs.jsgets.should == ["start", ["first chunk", 'second "chunk"'], {"headers"=>{"Content-Type"=>"text/plain"}}]
+ @qs.rrun(["list_end"])
+ @qs.jsgets.should == ["end", ["tail"]]
end
end