Skip to content

Commit

Permalink
added an design doc option so that doc._local_seq can be available in…
Browse files Browse the repository at this point in the history
… the map view. Closes COUCHDB-346

git-svn-id: http://svn.apache.org/repos/asf/couchdb/trunk@777757 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
jchris committed May 23, 2009
1 parent f7636e9 commit b1bfb14
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 6 deletions.
6 changes: 6 additions & 0 deletions share/www/script/test/basics.js
Expand Up @@ -63,6 +63,12 @@ couchTests.basics = function(debug) {
var doc = db.open(id, {revs_info:true});
T(doc._revs_info[0].status == "available");

// make sure you can do a seq=true option
var doc = db.open(id, {local_seq:true});
console.log(doc._local_seq)
T(doc._local_seq == 1);


// Create some more documents.
// Notice the use of the ok member on the return result.
T(db.save({_id:"1",a:2,b:4}).ok);
Expand Down
16 changes: 14 additions & 2 deletions share/www/script/test/design_options.js
Expand Up @@ -18,16 +18,19 @@ couchTests.design_options = function(debug) {

//// test the includes_design option
var map = "function (doc) {emit(null, doc._id);}";
var withseq = "function(doc) {emit(doc._local_seq, null)}"

// we need a design doc even to test temp views with it
var designDoc = {
_id:"_design/fu",
language: "javascript",
options: {
include_design: true
include_design: true,
local_seq: true
},
views: {
data: {"map": map}
data: {"map": map},
with_seq : {"map" : withseq}
}
};
T(db.save(designDoc).ok);
Expand Down Expand Up @@ -60,4 +63,13 @@ couchTests.design_options = function(debug) {
T(db.save(designDoc).ok);
rows = db.view("bango/data").rows;
T(rows.length == 0);

// should also have local_seq in the view
var resp = db.save({});
rows = db.view("fu/with_seq").rows;
T(rows[0].key == 1)
T(rows[1].key == 2)
var doc = db.open(resp.id);
db.deleteDoc(doc);
console.log(resp)
};
6 changes: 5 additions & 1 deletion src/couchdb/couch_db.erl
Expand Up @@ -820,7 +820,7 @@ open_doc_int(Db, Id, Options) ->
{not_found, missing}
end.

doc_meta_info(#doc_info{revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) ->
doc_meta_info(#doc_info{high_seq=Seq,revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) ->
case lists:member(revs_info, Options) of
false -> [];
true ->
Expand Down Expand Up @@ -851,6 +851,10 @@ doc_meta_info(#doc_info{revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) -
[] -> [];
DelConflictRevs -> [{deleted_conflicts, DelConflictRevs}]
end
end ++
case lists:member(local_seq, Options) of
false -> [];
true -> [{local_seq, Seq}]
end.


Expand Down
2 changes: 2 additions & 0 deletions src/couchdb/couch_doc.erl
Expand Up @@ -56,6 +56,8 @@ to_json_meta(Meta) ->
{JsonObj, PosAcc - 1}
end, Start, RevsInfo),
{<<"_revs_info">>, JsonRevsInfo};
({local_seq, Seq}) ->
{<<"_local_seq">>, Seq};
({conflicts, Conflicts}) ->
{<<"_conflicts">>, rev_to_strs(Conflicts)};
({deleted_conflicts, DConflicts}) ->
Expand Down
2 changes: 1 addition & 1 deletion src/couchdb/couch_httpd.erl
Expand Up @@ -179,7 +179,7 @@ handle_request(MochiReq, DefaultFun,
send_error(HttpReq, Error);
Tag:Error ->
?LOG_ERROR("Uncaught error in HTTP request: ~p",[{Tag, Error}]),
?LOG_DEBUG("Stacktrace: ~p",[erlang:get_stacktrace()]),
?LOG_INFO("Stacktrace: ~p",[erlang:get_stacktrace()]),
send_error(HttpReq, Error)
end,

Expand Down
3 changes: 3 additions & 0 deletions src/couchdb/couch_httpd_db.erl
Expand Up @@ -801,6 +801,9 @@ parse_doc_query(Req) ->
{"revs", "true"} ->
Options = [revs | Args#doc_query_args.options],
Args#doc_query_args{options=Options};
{"local_seq", "true"} ->
Options = [local_seq | Args#doc_query_args.options],
Args#doc_query_args{options=Options};
{"revs_info", "true"} ->
Options = [revs_info | Args#doc_query_args.options],
Args#doc_query_args{options=Options};
Expand Down
13 changes: 11 additions & 2 deletions src/couchdb/couch_view_updater.erl
Expand Up @@ -97,11 +97,20 @@ process_doc(Db, DocInfo, {Docs, #group{sig=Sig,name=GroupId,design_options=Desig
#doc_info{id=DocId, revs=[#rev_info{deleted=Deleted}|_]} = DocInfo,
IncludeDesign = proplists:get_value(<<"include_design">>,
DesignOptions, false),
LocalSeq = proplists:get_value(<<"local_seq">>,
DesignOptions, false),
DocOpts = case LocalSeq of
true ->
[conflicts, deleted_conflicts, local_seq];
_ ->
[conflicts, deleted_conflicts]
end,
?LOG_ERROR("DocOpts ~p LocalSeq ~p",[DocOpts, LocalSeq]),
case {IncludeDesign, DocId} of
{_, GroupId} ->
% uh oh. this is the design doc with our definitions. See if
% anything in the definition changed.
case couch_db:open_doc_int(Db, DocInfo, [conflicts, deleted_conflicts]) of
case couch_db:open_doc_int(Db, DocInfo, DocOpts) of
{ok, Doc} ->
case couch_view_group:design_doc_to_view_group(Doc) of
#group{sig=Sig} ->
Expand All @@ -126,7 +135,7 @@ process_doc(Db, DocInfo, {Docs, #group{sig=Sig,name=GroupId,design_options=Desig
{Docs, [{DocId, []} | DocIdViewIdKeys]};
true ->
{ok, Doc} = couch_db:open_doc_int(Db, DocInfo,
[conflicts, deleted_conflicts]),
DocOpts),
{[Doc | Docs], DocIdViewIdKeys}
end,

Expand Down

0 comments on commit b1bfb14

Please sign in to comment.