summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2020-01-21 13:45:21 +0200
committerGarren Smith <garren.smith@gmail.com>2020-01-27 19:36:58 +0200
commit703a9c0b5ec33f7d7e238411b18d44bed958a4c4 (patch)
tree560f2d5f4ff3595a104ce2fa2374195c86c2b744
parent8446f15b99460a03df99ecb5e67af31e81c3f284 (diff)
downloadcouchdb-703a9c0b5ec33f7d7e238411b18d44bed958a4c4.tar.gz
mango crud index definitions
-rw-r--r--src/mango/src/mango_crud.erl6
-rw-r--r--src/mango/src/mango_httpd.erl8
-rw-r--r--src/mango/src/mango_idx.erl44
-rw-r--r--src/mango/src/mango_util.erl20
-rw-r--r--src/mango/test/01-index-crud-test.py15
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"])