On Tue, Feb 11, 2014 at 8:13 PM, Adam Kocoloski <[email protected]> wrote: > What's the rationale for this option? When would I want to avoid using the > index? > > Adam > Well on small db you probably don't need it. You can manage to fold over all results the first time. At least it was added for such reason, but we can eventually removed it.
- benoit > On Feb 7, 2014, at 10:00 AM, [email protected] wrote: > >> Updated Branches: >> refs/heads/1994-merge-rcouch 38a18abbc -> 2bf88e3ff >> >> >> add the option use_index={no,yes} (yes by default) >> >> If use_index=no even if the view is indexed by sequence, the index won't >> be use. Instead it will fold the btree and return the changes each time >> the view map function can emit a value. (default behaviour). >> >> >> Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo >> Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/2bf88e3f >> Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/2bf88e3f >> Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/2bf88e3f >> >> Branch: refs/heads/1994-merge-rcouch >> Commit: 2bf88e3ff03cc674f3001ec93240378cada5bde5 >> Parents: 38a18ab >> Author: Benoit Chesneau <[email protected]> >> Authored: Fri Feb 7 15:57:25 2014 +0100 >> Committer: Benoit Chesneau <[email protected]> >> Committed: Fri Feb 7 15:57:25 2014 +0100 >> >> ---------------------------------------------------------------------- >> apps/couch_httpd/src/couch_httpd_changes.erl | 21 +++++++++++++++------ >> share/www/script/test/changes.js | 9 +++++++++ >> 2 files changed, 24 insertions(+), 6 deletions(-) >> ---------------------------------------------------------------------- >> >> >> http://git-wip-us.apache.org/repos/asf/couchdb/blob/2bf88e3f/apps/couch_httpd/src/couch_httpd_changes.erl >> ---------------------------------------------------------------------- >> diff --git a/apps/couch_httpd/src/couch_httpd_changes.erl >> b/apps/couch_httpd/src/couch_httpd_changes.erl >> index 56ce559..82d9fe0 100644 >> --- a/apps/couch_httpd/src/couch_httpd_changes.erl >> +++ b/apps/couch_httpd/src/couch_httpd_changes.erl >> @@ -118,6 +118,7 @@ handle_changes_req1(Req, #db{name=DbName}=Db) -> >> >> >> handle_changes(ChangesArgs, Req, Db) -> >> + >> case ChangesArgs#changes_args.filter of >> "_view" -> >> handle_view_changes(ChangesArgs, Req, Db); >> @@ -146,18 +147,26 @@ handle_view_changes(ChangesArgs, Req, Db) -> >> ViewOptions = parse_view_options(Query, []), >> >> {ok, Infos} = couch_mrview:get_info(Db, DDocId), >> - case lists:member(<<"seq_indexed">>, >> - proplists:get_value(update_options, Infos, [])) of >> - true -> >> + IsIndexed = lists:member(<<"seq_indexed">>, >> + proplists:get_value(update_options, Infos, >> + [])), >> + >> + NoIndex = couch_httpd:qs_value(Req, "use_index", "yes") =:= "no", >> + >> + case {IsIndexed, NoIndex} of >> + {true, false} -> >> handle_view_changes(Db, DDocId, VName, ViewOptions, ChangesArgs, >> Req); >> - false when ViewOptions /= [] -> >> + {true, true} when ViewOptions /= [] -> >> ?LOG_ERROR("Tried to filter a non sequence indexed view~n",[]), >> throw({bad_request, seqs_not_indexed}); >> - false -> >> + {false, _} when ViewOptions /= [] -> >> + ?LOG_ERROR("Tried to filter a non sequence indexed view~n",[]), >> + throw({bad_request, seqs_not_indexed}); >> + {_, _} -> >> %% old method we are getting changes using the btree instead >> %% which is not efficient, log it >> - ?LOG_WARN("Get view changes with seq_indexed=false.~n", []), >> + ?LOG_WARN("Filter without using a seq_indexed view.~n", []), >> couch_changes:handle_changes(ChangesArgs, Req, Db) >> end. >> >> >> http://git-wip-us.apache.org/repos/asf/couchdb/blob/2bf88e3f/share/www/script/test/changes.js >> ---------------------------------------------------------------------- >> diff --git a/share/www/script/test/changes.js >> b/share/www/script/test/changes.js >> index 5c543f1..3419eb6 100644 >> --- a/share/www/script/test/changes.js >> +++ b/share/www/script/test/changes.js >> @@ -444,6 +444,15 @@ couchTests.changes = function(debug) { >> T(resp.results.length === 1); >> T(resp.results[0].id === "blah"); >> >> + var req = CouchDB.request("GET", >> "/test_suite_db/_changes?filter=_view&view=changes_seq_indexed/blah&use_index=no"); >> + var resp = JSON.parse(req.responseText); >> + T(resp.results.length === 1); >> + T(resp.results[0].id === "blah"); >> + >> + var req = CouchDB.request("GET", >> '/test_suite_db/_changes?filter=_view&view=changes_seq_indexed/blah&key="test"&use_index=no'); >> + TEquals(400, req.status, "should return 400 for when use_index=no"); >> + >> + >> // test for userCtx >> run_on_modified_server( >> [{section: "httpd", >> >
