diff options
author | Garren Smith <garren.smith@gmail.com> | 2020-01-21 13:45:21 +0200 |
---|---|---|
committer | Garren Smith <garren.smith@gmail.com> | 2020-01-27 19:36:58 +0200 |
commit | 703a9c0b5ec33f7d7e238411b18d44bed958a4c4 (patch) | |
tree | 560f2d5f4ff3595a104ce2fa2374195c86c2b744 | |
parent | 8446f15b99460a03df99ecb5e67af31e81c3f284 (diff) | |
download | couchdb-703a9c0b5ec33f7d7e238411b18d44bed958a4c4.tar.gz |
mango crud index definitions
-rw-r--r-- | src/mango/src/mango_crud.erl | 6 | ||||
-rw-r--r-- | src/mango/src/mango_httpd.erl | 8 | ||||
-rw-r--r-- | src/mango/src/mango_idx.erl | 44 | ||||
-rw-r--r-- | src/mango/src/mango_util.erl | 20 | ||||
-rw-r--r-- | src/mango/test/01-index-crud-test.py | 15 |
5 files changed, 69 insertions, 24 deletions
diff --git a/src/mango/src/mango_crud.erl b/src/mango/src/mango_crud.erl index 41a4d143d..735531d20 100644 --- a/src/mango/src/mango_crud.erl +++ b/src/mango/src/mango_crud.erl @@ -35,8 +35,9 @@ insert(Db, {_}=Doc, Opts) -> insert(Db, [Doc], Opts); insert(Db, Docs, Opts0) when is_list(Docs) -> Opts1 = maybe_add_user_ctx(Db, Opts0), + % Todo: I dont think we need to support w = 3? Opts2 = maybe_int_to_str(w, Opts1), - case fabric:update_docs(Db, Docs, Opts2) of + case fabric2_db:update_docs(Db, Docs, Opts2) of {ok, Results0} -> {ok, lists:zipwith(fun result_to_json/2, Docs, Results0)}; {accepted, Results0} -> @@ -111,7 +112,8 @@ maybe_add_user_ctx(Db, Opts) -> {user_ctx, _} -> Opts; false -> - [{user_ctx, couch_db:get_user_ctx(Db)} | Opts] + UserCtx = maps:get(user_ctx, Db), + [{user_ctx, UserCtx} | Opts] end. diff --git a/src/mango/src/mango_httpd.erl b/src/mango/src/mango_httpd.erl index 379d2e127..b04622914 100644 --- a/src/mango/src/mango_httpd.erl +++ b/src/mango/src/mango_httpd.erl @@ -32,9 +32,8 @@ threshold = 1490 }). -handle_req(#httpd{} = Req, Db0) -> +handle_req(#httpd{} = Req, Db) -> try - Db = set_user_ctx(Req, Db0), handle_req_int(Req, Db) catch throw:{mango_error, Module, Reason} -> @@ -198,11 +197,6 @@ handle_find_req(Req, _Db) -> chttpd:send_method_not_allowed(Req, "POST"). -set_user_ctx(#httpd{user_ctx=Ctx}, Db) -> - {ok, NewDb} = couch_db:set_user_ctx(Db, Ctx), - NewDb. - - get_idx_w_opts(Opts) -> case lists:keyfind(w, 1, Opts) of {w, N} when is_integer(N), N > 0 -> diff --git a/src/mango/src/mango_idx.erl b/src/mango/src/mango_idx.erl index 5d06a8fe3..799705769 100644 --- a/src/mango/src/mango_idx.erl +++ b/src/mango/src/mango_idx.erl @@ -52,10 +52,40 @@ -include("mango.hrl"). -include("mango_idx.hrl"). - list(Db) -> - {ok, Indexes} = ddoc_cache:open(db_to_name(Db), ?MODULE), - Indexes. + Acc0 = #{ + db => Db, + rows => [] + }, + {ok, Indexes} = fabric2_db:fold_design_docs(Db, fun ddoc_fold_cb/2, Acc0, []), + io:format("INDEXES ~p ~n", [Indexes]), + Indexes ++ special(Db). + + +% Todo this should all be in fabric2_db +ddoc_fold_cb({meta, _}, Acc) -> + {ok, Acc}; + +ddoc_fold_cb(complete, Acc) -> + #{rows := Rows} = Acc, + {ok, Rows}; + +ddoc_fold_cb({row, Row}, Acc) -> + #{ + db := Db, + rows := Rows + } = Acc, + {_, Id} = lists:keyfind(id, 1, Row), + {ok, Doc} = fabric2_db:open_doc(Db, Id), + JSONDoc = couch_doc:to_json_obj(Doc, []), + try + Idx = from_ddoc(Db, JSONDoc), + {ok, Acc#{rows:= Rows ++ Idx}} + catch + throw:{mango_error, _, invalid_query_ddoc_language} -> + io:format("ERROR ~p ~n", [JSONDoc]), + {ok, Acc} + end. get_usable_indexes(Db, Selector, Opts) -> @@ -294,7 +324,7 @@ db_to_name(Name) when is_binary(Name) -> db_to_name(Name) when is_list(Name) -> iolist_to_binary(Name); db_to_name(Db) -> - couch_db:name(Db). + maps:get(name, Db). get_idx_def(Opts) -> @@ -407,8 +437,10 @@ set_ddoc_partitioned_option(DDoc, Partitioned) -> DDoc#doc{body = {NewProps}}. -get_idx_partitioned(Db, DDocProps) -> - Default = fabric_util:is_partitioned(Db), +get_idx_partitioned(_Db, DDocProps) -> + % TODO: Add in partition support +%% Default = fabric_util:is_partitioned(Db), + Default = false, case couch_util:get_value(<<"options">>, DDocProps) of {DesignOpts} -> case couch_util:get_value(<<"partitioned">>, DesignOpts) of diff --git a/src/mango/src/mango_util.erl b/src/mango/src/mango_util.erl index a7347178e..50fa79abd 100644 --- a/src/mango/src/mango_util.erl +++ b/src/mango/src/mango_util.erl @@ -85,14 +85,16 @@ open_doc(Db, DocId) -> open_doc(Db, DocId, Options) -> - case mango_util:defer(fabric, open_doc, [Db, DocId, Options]) of - {ok, Doc} -> - {ok, Doc}; - {not_found, _} -> - not_found; - _ -> - ?MANGO_ERROR({error_loading_doc, DocId}) - end. + fabric2_db:open_doc(Db, DocId, Options). + % TODO: is this defer still required? +%% case mango_util:defer(fabric, open_doc, [Db, DocId, Options]) of +%% {ok, Doc} -> +%% {ok, Doc}; +%% {not_found, _} -> +%% not_found; +%% _ -> +%% ?MANGO_ERROR({error_loading_doc, DocId}) +%% end. open_ddocs(Db) -> @@ -111,7 +113,7 @@ load_ddoc(Db, DDocId, DbOpts) -> case open_doc(Db, DDocId, DbOpts) of {ok, Doc} -> {ok, check_lang(Doc)}; - not_found -> + {not_found, missing} -> Body = {[ {<<"language">>, <<"query">>} ]}, diff --git a/src/mango/test/01-index-crud-test.py b/src/mango/test/01-index-crud-test.py index b60239992..dd9ab1ade 100644 --- a/src/mango/test/01-index-crud-test.py +++ b/src/mango/test/01-index-crud-test.py @@ -113,6 +113,21 @@ class IndexCrudTests(mango.DbPerClass): return raise AssertionError("index not created") + def test_ignore_design_docs(self): + fields = ["baz", "foo"] + ret = self.db.create_index(fields, name="idx_02") + assert ret is True + self.db.save_doc({ + "_id": "_design/ignore", + "views": { + "view1": { + "map": "function (doc) { emit(doc._id, 1)}" + } + } + }) + Indexes = self.db.list_indexes() + self.assertEqual(len(Indexes), 2) + def test_read_idx_doc(self): self.db.create_index(["foo", "bar"], name="idx_01") self.db.create_index(["hello", "bar"]) |