This is an automated email from the ASF dual-hosted git repository.
garren pushed a commit to branch fdb-mango-indexes
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/fdb-mango-indexes by this push:
new a1d7265 code clean up
a1d7265 is described below
commit a1d726557f64d9ed4bdba36601f4060856e51934
Author: Garren Smith <[email protected]>
AuthorDate: Wed Feb 19 13:51:21 2020 +0200
code clean up
---
src/couch_views/src/couch_views_indexer.erl | 5 +
src/couch_views/src/couch_views_server.erl | 2 +-
src/fabric/include/fabric2.hrl.orig | 67 ----------
src/fabric/include/fabric2_BACKUP_15496.hrl | 67 ----------
src/fabric/include/fabric2_BASE_15496.hrl | 62 ---------
src/fabric/include/fabric2_LOCAL_15496.hrl | 63 ---------
src/fabric/include/fabric2_REMOTE_15496.hrl | 63 ---------
src/fabric/src/fabric2_db.erl | 24 ++--
src/fabric/src/fabric2_fdb.erl | 14 +-
src/mango/src/mango_app.erl | 1 -
src/mango/src/mango_crud.erl | 37 +-----
src/mango/src/mango_cursor_view.erl | 192 ++--------------------------
src/mango/src/mango_fdb.erl | 5 +-
src/mango/src/mango_httpd.erl | 3 +-
src/mango/src/mango_idx.erl | 42 +++---
src/mango/src/mango_idx_view.hrl | 1 -
src/mango/src/mango_jobs_indexer.erl | 47 +------
src/mango/src/mango_util.erl | 9 --
src/mango/test/02-basic-find-test.py | 2 +-
19 files changed, 77 insertions(+), 629 deletions(-)
diff --git a/src/couch_views/src/couch_views_indexer.erl
b/src/couch_views/src/couch_views_indexer.erl
index 1e9da99..29e3920 100644
--- a/src/couch_views/src/couch_views_indexer.erl
+++ b/src/couch_views/src/couch_views_indexer.erl
@@ -18,6 +18,7 @@
-export([
+ set_timeout/0,
init/0,
fetch_docs/2
]).
@@ -35,6 +36,10 @@ spawn_link() ->
proc_lib:spawn_link(?MODULE, init, []).
+set_timeout() ->
+ couch_views_jobs:set_timeout().
+
+
init() ->
{ok, Job, Data0} = couch_jobs:accept(?INDEX_JOB_TYPE, #{}),
Data = upgrade_data(Data0),
diff --git a/src/couch_views/src/couch_views_server.erl
b/src/couch_views/src/couch_views_server.erl
index 1a8caf3..b07c85f 100644
--- a/src/couch_views/src/couch_views_server.erl
+++ b/src/couch_views/src/couch_views_server.erl
@@ -41,7 +41,7 @@ start_link(Opts) ->
init(Opts) ->
WorkerModule = couch_util:get_value(worker, Opts, couch_views_indexer),
process_flag(trap_exit, true),
- couch_views_jobs:set_timeout(),
+ WorkerModule:set_timeout(),
St = #{
workers => #{},
max_workers => max_workers(),
diff --git a/src/fabric/include/fabric2.hrl.orig
b/src/fabric/include/fabric2.hrl.orig
deleted file mode 100644
index 61cd4b3..0000000
--- a/src/fabric/include/fabric2.hrl.orig
+++ /dev/null
@@ -1,67 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-
--define(uint2bin(I), binary:encode_unsigned(I, little)).
--define(bin2uint(I), binary:decode_unsigned(I, little)).
--define(METADATA_VERSION_KEY, <<16#FF, "/metadataVersion">>).
-
-% Prefix Definitions
-
-% Layer Level: (LayerPrefix, X, ...)
-
--define(CLUSTER_CONFIG, 0).
--define(ALL_DBS, 1).
--define(DBS, 15).
--define(TX_IDS, 255).
-
-% Database Level: (LayerPrefix, ?DBS, DbPrefix, X, ...)
-
--define(DB_VERSION, 0).
--define(DB_CONFIG, 16).
--define(DB_STATS, 17).
--define(DB_ALL_DOCS, 18).
--define(DB_CHANGES, 19).
--define(DB_REVS, 20).
--define(DB_DOCS, 21).
--define(DB_LOCAL_DOCS, 22).
--define(DB_ATTS, 23).
--define(DB_VIEWS, 24).
--define(DB_LOCAL_DOC_BODIES, 25).
--define(DB_ATT_NAMES, 26).
-<<<<<<< HEAD
--define(DB_SEARCH, 27).
-=======
--define(DB_MANGO, 27).
->>>>>>> very rough indexing and return docs
-
-
-% Versions
-
-% 0 - Initial implementation
-% 1 - Added attachment hash
-
--define(CURR_REV_FORMAT, 1).
-
-% Misc constants
-
--define(PDICT_DB_KEY, '$fabric_db_handle').
--define(PDICT_LAYER_CACHE, '$fabric_layer_id').
--define(PDICT_CHECKED_DB_IS_CURRENT, '$fabric_checked_db_is_current').
--define(PDICT_CHECKED_MD_IS_CURRENT, '$fabric_checked_md_is_current').
--define(PDICT_TX_ID_KEY, '$fabric_tx_id').
--define(PDICT_TX_RES_KEY, '$fabric_tx_result').
--define(PDICT_ON_COMMIT_FUN, '$fabric_on_commit_fun').
--define(COMMIT_UNKNOWN_RESULT, 1021).
-
-
--define(BINARY_CHUNK_SIZE, 100000).
diff --git a/src/fabric/include/fabric2_BACKUP_15496.hrl
b/src/fabric/include/fabric2_BACKUP_15496.hrl
deleted file mode 100644
index 61cd4b3..0000000
--- a/src/fabric/include/fabric2_BACKUP_15496.hrl
+++ /dev/null
@@ -1,67 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-
--define(uint2bin(I), binary:encode_unsigned(I, little)).
--define(bin2uint(I), binary:decode_unsigned(I, little)).
--define(METADATA_VERSION_KEY, <<16#FF, "/metadataVersion">>).
-
-% Prefix Definitions
-
-% Layer Level: (LayerPrefix, X, ...)
-
--define(CLUSTER_CONFIG, 0).
--define(ALL_DBS, 1).
--define(DBS, 15).
--define(TX_IDS, 255).
-
-% Database Level: (LayerPrefix, ?DBS, DbPrefix, X, ...)
-
--define(DB_VERSION, 0).
--define(DB_CONFIG, 16).
--define(DB_STATS, 17).
--define(DB_ALL_DOCS, 18).
--define(DB_CHANGES, 19).
--define(DB_REVS, 20).
--define(DB_DOCS, 21).
--define(DB_LOCAL_DOCS, 22).
--define(DB_ATTS, 23).
--define(DB_VIEWS, 24).
--define(DB_LOCAL_DOC_BODIES, 25).
--define(DB_ATT_NAMES, 26).
-<<<<<<< HEAD
--define(DB_SEARCH, 27).
-=======
--define(DB_MANGO, 27).
->>>>>>> very rough indexing and return docs
-
-
-% Versions
-
-% 0 - Initial implementation
-% 1 - Added attachment hash
-
--define(CURR_REV_FORMAT, 1).
-
-% Misc constants
-
--define(PDICT_DB_KEY, '$fabric_db_handle').
--define(PDICT_LAYER_CACHE, '$fabric_layer_id').
--define(PDICT_CHECKED_DB_IS_CURRENT, '$fabric_checked_db_is_current').
--define(PDICT_CHECKED_MD_IS_CURRENT, '$fabric_checked_md_is_current').
--define(PDICT_TX_ID_KEY, '$fabric_tx_id').
--define(PDICT_TX_RES_KEY, '$fabric_tx_result').
--define(PDICT_ON_COMMIT_FUN, '$fabric_on_commit_fun').
--define(COMMIT_UNKNOWN_RESULT, 1021).
-
-
--define(BINARY_CHUNK_SIZE, 100000).
diff --git a/src/fabric/include/fabric2_BASE_15496.hrl
b/src/fabric/include/fabric2_BASE_15496.hrl
deleted file mode 100644
index b4dd084..0000000
--- a/src/fabric/include/fabric2_BASE_15496.hrl
+++ /dev/null
@@ -1,62 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-
--define(uint2bin(I), binary:encode_unsigned(I, little)).
--define(bin2uint(I), binary:decode_unsigned(I, little)).
--define(METADATA_VERSION_KEY, <<16#FF, "/metadataVersion">>).
-
-% Prefix Definitions
-
-% Layer Level: (LayerPrefix, X, ...)
-
--define(CLUSTER_CONFIG, 0).
--define(ALL_DBS, 1).
--define(DBS, 15).
--define(TX_IDS, 255).
-
-% Database Level: (LayerPrefix, ?DBS, DbPrefix, X, ...)
-
--define(DB_VERSION, 0).
--define(DB_CONFIG, 16).
--define(DB_STATS, 17).
--define(DB_ALL_DOCS, 18).
--define(DB_CHANGES, 19).
--define(DB_REVS, 20).
--define(DB_DOCS, 21).
--define(DB_LOCAL_DOCS, 22).
--define(DB_ATTS, 23).
--define(DB_VIEWS, 24).
--define(DB_LOCAL_DOC_BODIES, 25).
--define(DB_ATT_NAMES, 26).
-
-
-% Versions
-
-% 0 - Initial implementation
-% 1 - Added attachment hash
-
--define(CURR_REV_FORMAT, 1).
-
-% Misc constants
-
--define(PDICT_DB_KEY, '$fabric_db_handle').
--define(PDICT_LAYER_CACHE, '$fabric_layer_id').
--define(PDICT_CHECKED_DB_IS_CURRENT, '$fabric_checked_db_is_current').
--define(PDICT_CHECKED_MD_IS_CURRENT, '$fabric_checked_md_is_current').
--define(PDICT_TX_ID_KEY, '$fabric_tx_id').
--define(PDICT_TX_RES_KEY, '$fabric_tx_result').
--define(PDICT_ON_COMMIT_FUN, '$fabric_on_commit_fun').
--define(COMMIT_UNKNOWN_RESULT, 1021).
-
-
--define(BINARY_CHUNK_SIZE, 100000).
diff --git a/src/fabric/include/fabric2_LOCAL_15496.hrl
b/src/fabric/include/fabric2_LOCAL_15496.hrl
deleted file mode 100644
index 828a51b..0000000
--- a/src/fabric/include/fabric2_LOCAL_15496.hrl
+++ /dev/null
@@ -1,63 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-
--define(uint2bin(I), binary:encode_unsigned(I, little)).
--define(bin2uint(I), binary:decode_unsigned(I, little)).
--define(METADATA_VERSION_KEY, <<16#FF, "/metadataVersion">>).
-
-% Prefix Definitions
-
-% Layer Level: (LayerPrefix, X, ...)
-
--define(CLUSTER_CONFIG, 0).
--define(ALL_DBS, 1).
--define(DBS, 15).
--define(TX_IDS, 255).
-
-% Database Level: (LayerPrefix, ?DBS, DbPrefix, X, ...)
-
--define(DB_VERSION, 0).
--define(DB_CONFIG, 16).
--define(DB_STATS, 17).
--define(DB_ALL_DOCS, 18).
--define(DB_CHANGES, 19).
--define(DB_REVS, 20).
--define(DB_DOCS, 21).
--define(DB_LOCAL_DOCS, 22).
--define(DB_ATTS, 23).
--define(DB_VIEWS, 24).
--define(DB_LOCAL_DOC_BODIES, 25).
--define(DB_ATT_NAMES, 26).
--define(DB_SEARCH, 27).
-
-
-% Versions
-
-% 0 - Initial implementation
-% 1 - Added attachment hash
-
--define(CURR_REV_FORMAT, 1).
-
-% Misc constants
-
--define(PDICT_DB_KEY, '$fabric_db_handle').
--define(PDICT_LAYER_CACHE, '$fabric_layer_id').
--define(PDICT_CHECKED_DB_IS_CURRENT, '$fabric_checked_db_is_current').
--define(PDICT_CHECKED_MD_IS_CURRENT, '$fabric_checked_md_is_current').
--define(PDICT_TX_ID_KEY, '$fabric_tx_id').
--define(PDICT_TX_RES_KEY, '$fabric_tx_result').
--define(PDICT_ON_COMMIT_FUN, '$fabric_on_commit_fun').
--define(COMMIT_UNKNOWN_RESULT, 1021).
-
-
--define(BINARY_CHUNK_SIZE, 100000).
diff --git a/src/fabric/include/fabric2_REMOTE_15496.hrl
b/src/fabric/include/fabric2_REMOTE_15496.hrl
deleted file mode 100644
index 453fc90..0000000
--- a/src/fabric/include/fabric2_REMOTE_15496.hrl
+++ /dev/null
@@ -1,63 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
-
--define(uint2bin(I), binary:encode_unsigned(I, little)).
--define(bin2uint(I), binary:decode_unsigned(I, little)).
--define(METADATA_VERSION_KEY, <<16#FF, "/metadataVersion">>).
-
-% Prefix Definitions
-
-% Layer Level: (LayerPrefix, X, ...)
-
--define(CLUSTER_CONFIG, 0).
--define(ALL_DBS, 1).
--define(DBS, 15).
--define(TX_IDS, 255).
-
-% Database Level: (LayerPrefix, ?DBS, DbPrefix, X, ...)
-
--define(DB_VERSION, 0).
--define(DB_CONFIG, 16).
--define(DB_STATS, 17).
--define(DB_ALL_DOCS, 18).
--define(DB_CHANGES, 19).
--define(DB_REVS, 20).
--define(DB_DOCS, 21).
--define(DB_LOCAL_DOCS, 22).
--define(DB_ATTS, 23).
--define(DB_VIEWS, 24).
--define(DB_LOCAL_DOC_BODIES, 25).
--define(DB_ATT_NAMES, 26).
--define(DB_MANGO, 27).
-
-
-% Versions
-
-% 0 - Initial implementation
-% 1 - Added attachment hash
-
--define(CURR_REV_FORMAT, 1).
-
-% Misc constants
-
--define(PDICT_DB_KEY, '$fabric_db_handle').
--define(PDICT_LAYER_CACHE, '$fabric_layer_id').
--define(PDICT_CHECKED_DB_IS_CURRENT, '$fabric_checked_db_is_current').
--define(PDICT_CHECKED_MD_IS_CURRENT, '$fabric_checked_md_is_current').
--define(PDICT_TX_ID_KEY, '$fabric_tx_id').
--define(PDICT_TX_RES_KEY, '$fabric_tx_result').
--define(PDICT_ON_COMMIT_FUN, '$fabric_on_commit_fun').
--define(COMMIT_UNKNOWN_RESULT, 1021).
-
-
--define(BINARY_CHUNK_SIZE, 100000).
diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl
index ce3d248..eeaf3f1 100644
--- a/src/fabric/src/fabric2_db.erl
+++ b/src/fabric/src/fabric2_db.erl
@@ -811,16 +811,9 @@ fold_docs(Db, UserFun, UserAcc0, Options) ->
Row1 = case lists:keyfind(include_docs, 1, Options) of
{include_docs, true} ->
- DocMember = case fabric2_db:open_doc(Db, DocId,
OpenOpts) of
- {not_found, missing} ->
- [];
- {ok, #doc{deleted = true}} ->
- [{doc, null}];
- {ok, #doc{} = Doc} ->
- [{doc, couch_doc:to_json_obj(Doc, DocOpts)}]
- end,
- Row0 ++ DocMember;
- _ -> Row0
+ Row0 ++ open_json_doc(Db, DocId, OpenOpts, DocOpts);
+ _ ->
+ Row0
end,
maybe_stop(UserFun({row, Row1}, Acc))
@@ -1865,3 +1858,14 @@ stem_revisions(#{} = Db, #doc{} = Doc) ->
true -> Doc#doc{revs = {RevPos, lists:sublist(Revs, RevsLimit)}};
false -> Doc
end.
+
+
+open_json_doc(Db, DocId, OpenOpts, DocOpts) ->
+ case fabric2_db:open_doc(Db, DocId, OpenOpts) of
+ {not_found, missing} ->
+ [];
+ {ok, #doc{deleted = true}} ->
+ [{doc, null}];
+ {ok, #doc{} = Doc} ->
+ [{doc, couch_doc:to_json_obj(Doc, DocOpts)}]
+ end.
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index 4249701..f38894a 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -649,11 +649,12 @@ write_doc(#{} = Db0, Doc, NewWinner0, OldWinner,
ToUpdate, ToRemove) ->
atts = Atts
} = Doc,
- % Doc body
- % Fetch the old doc body for the mango hooks later
- PrevDoc = if OldWinner == not_found -> not_found; true ->
+ % Fetch the old doc body for the mango hooks
+ OldWinnerDoc = if OldWinner == not_found -> not_found; true ->
get_doc_body(Db, DocId, OldWinner)
end,
+
+ % Doc body
ok = write_doc_body(Db, Doc),
% Attachment bookkeeping
@@ -785,13 +786,14 @@ write_doc(#{} = Db0, Doc, NewWinner0, OldWinner,
ToUpdate, ToRemove) ->
end,
incr_stat(Db, <<"doc_count">>, -1),
incr_stat(Db, <<"doc_del_count">>, 1),
- mango_indexer:delete_doc(Db, PrevDoc);
+ mango_indexer:delete_doc(Db, OldWinnerDoc);
updated ->
+ % Get winning doc with conflicts field
DocRev = extract_rev(Doc#doc.revs),
{WinnerRevPos, _} = WinnerRevId = maps:get(rev_id, NewWinner),
{WinnerDoc, OldWinnerDoc} = case WinnerRevId == DocRev of
- true -> {Doc, PrevDoc};
- false -> {PrevDoc, PrevDoc}
+ true -> {Doc, OldWinnerDoc};
+ false -> {OldWinnerDoc, OldWinnerDoc}
end,
RevConflicts = lists:foldl(fun (UpdateRev, Acc) ->
diff --git a/src/mango/src/mango_app.erl b/src/mango/src/mango_app.erl
index 221d57d..7a0c39d 100644
--- a/src/mango/src/mango_app.erl
+++ b/src/mango/src/mango_app.erl
@@ -15,7 +15,6 @@
-export([start/2, stop/1]).
start(_Type, StartArgs) ->
- mango_jobs:set_timeout(),
mango_sup:start_link(StartArgs).
stop(_State) ->
diff --git a/src/mango/src/mango_crud.erl b/src/mango/src/mango_crud.erl
index 735531d..66cef65 100644
--- a/src/mango/src/mango_crud.erl
+++ b/src/mango/src/mango_crud.erl
@@ -33,11 +33,8 @@ insert(Db, #doc{}=Doc, Opts) ->
insert(Db, [Doc], Opts);
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 fabric2_db:update_docs(Db, Docs, Opts2) of
+insert(Db, Docs, Opts) when is_list(Docs) ->
+ case fabric2_db:update_docs(Db, Docs, Opts) of
{ok, Results0} ->
{ok, lists:zipwith(fun result_to_json/2, Docs, Results0)};
{accepted, Results0} ->
@@ -47,10 +44,8 @@ insert(Db, Docs, Opts0) when is_list(Docs) ->
end.
-find(Db, Selector, Callback, UserAcc, Opts0) ->
- Opts1 = maybe_add_user_ctx(Db, Opts0),
- Opts2 = maybe_int_to_str(r, Opts1),
- {ok, Cursor} = mango_cursor:create(Db, Selector, Opts2),
+find(Db, Selector, Callback, UserAcc, Opts) ->
+ {ok, Cursor} = mango_cursor:create(Db, Selector, Opts),
mango_cursor:execute(Cursor, Callback, UserAcc).
@@ -100,31 +95,11 @@ delete(Db, Selector, Options) ->
end.
-explain(Db, Selector, Opts0) ->
- Opts1 = maybe_add_user_ctx(Db, Opts0),
- Opts2 = maybe_int_to_str(r, Opts1),
- {ok, Cursor} = mango_cursor:create(Db, Selector, Opts2),
+explain(Db, Selector, Opts) ->
+ {ok, Cursor} = mango_cursor:create(Db, Selector, Opts),
mango_cursor:explain(Cursor).
-maybe_add_user_ctx(Db, Opts) ->
- case lists:keyfind(user_ctx, 1, Opts) of
- {user_ctx, _} ->
- Opts;
- false ->
- UserCtx = maps:get(user_ctx, Db),
- [{user_ctx, UserCtx} | Opts]
- end.
-
-
-maybe_int_to_str(_Key, []) ->
- [];
-maybe_int_to_str(Key, [{Key, Val} | Rest]) when is_integer(Val) ->
- [{Key, integer_to_list(Val)} | maybe_int_to_str(Key, Rest)];
-maybe_int_to_str(Key, [KV | Rest]) ->
- [KV | maybe_int_to_str(Key, Rest)].
-
-
result_to_json(#doc{id=Id}, Result) ->
result_to_json(Id, Result);
result_to_json({Props}, Result) ->
diff --git a/src/mango/src/mango_cursor_view.erl
b/src/mango/src/mango_cursor_view.erl
index 96d1fb5..5f91303 100644
--- a/src/mango/src/mango_cursor_view.erl
+++ b/src/mango/src/mango_cursor_view.erl
@@ -43,7 +43,6 @@ create(Db, Indexes, Selector, Opts) ->
Skip = couch_util:get_value(skip, Opts, 0),
Fields = couch_util:get_value(fields, Opts, all_fields),
Bookmark = couch_util:get_value(bookmark, Opts),
- io:format("Index selected ~p Range ~p ~n", [Index, IndexRanges]),
{ok, #cursor{
db = Db,
@@ -106,7 +105,6 @@ index_args(#cursor{} = Cursor) ->
opts = Opts,
bookmark = Bookmark
} = Cursor,
- io:format("SELE ~p ranges ~p ~n", [Cursor#cursor.selector,
Cursor#cursor.ranges]),
Args0 = #{
start_key => mango_idx:start_key(Idx, Cursor#cursor.ranges),
@@ -235,75 +233,10 @@ choose_best_index(_DbName, IndexRanges) ->
{SelectedIndex, SelectedIndexRanges}.
-%%view_cb({meta, Meta}, Acc) ->
-%% % Map function starting
-%% put(mango_docs_examined, 0),
-%% set_mango_msg_timestamp(),
-%% ok = rexi:stream2({meta, Meta}),
-%% {ok, Acc};
-%%view_cb({row, Row}, #mrargs{extra = Options} = Acc) ->
-%% ViewRow = #view_row{
-%% id = couch_util:get_value(id, Row),
-%% key = couch_util:get_value(key, Row),
-%% doc = couch_util:get_value(doc, Row)
-%% },
-%% case ViewRow#view_row.doc of
-%% null ->
-%% put(mango_docs_examined, get(mango_docs_examined) + 1),
-%% maybe_send_mango_ping();
-%% undefined ->
-%% ViewRow2 = ViewRow#view_row{
-%% value = couch_util:get_value(value, Row)
-%% },
-%% ok = rexi:stream2(ViewRow2),
-%% put(mango_docs_examined, 0),
-%% set_mango_msg_timestamp();
-%% Doc ->
-%% Selector = couch_util:get_value(selector, Options),
-%% case mango_selector:match(Selector, Doc) of
-%% true ->
-%% ViewRow2 = ViewRow#view_row{
-%% value = get(mango_docs_examined) + 1
-%% },
-%% ok = rexi:stream2(ViewRow2),
-%% put(mango_docs_examined, 0),
-%% set_mango_msg_timestamp();
-%% false ->
-%% put(mango_docs_examined, get(mango_docs_examined) + 1),
-%% maybe_send_mango_ping()
-%% end
-%% end,
-%% {ok, Acc};
-%%view_cb(complete, Acc) ->
-%% % Finish view output
-%% ok = rexi:stream_last(complete),
-%% {ok, Acc};
-%%view_cb(ok, ddoc_updated) ->
-%% rexi:reply({ok, ddoc_updated}).
-
-
-%%maybe_send_mango_ping() ->
-%% Current = os:timestamp(),
-%% LastPing = get(mango_last_msg_timestamp),
-%% % Fabric will timeout if it has not heard a response from a worker node
-%% % after 5 seconds. Send a ping every 4 seconds so the timeout doesn't
happen.
-%% case timer:now_diff(Current, LastPing) > ?HEARTBEAT_INTERVAL_IN_USEC of
-%% false ->
-%% ok;
-%% true ->
-%% rexi:ping(),
-%% set_mango_msg_timestamp()
-%% end.
-
-
-%%set_mango_msg_timestamp() ->
-%% put(mango_last_msg_timestamp, os:timestamp()).
-
-
handle_message({meta, _}, Cursor) ->
{ok, Cursor};
handle_message({doc, Key, Doc}, Cursor) ->
- case doc_member(Cursor, Doc) of
+ case match_doc(Cursor, Doc) of
{ok, Doc, {execution_stats, ExecutionStats1}} ->
Cursor1 = Cursor#cursor {
execution_stats = ExecutionStats1
@@ -341,124 +274,23 @@ handle_doc(#cursor{limit = L, execution_stats = Stats} =
C, Doc) when L > 0 ->
handle_doc(C, _Doc) ->
{stop, C}.
-%%apply_opts([], Args) ->
-%% Args;
-%%apply_opts([{r, RStr} | Rest], Args) ->
-%% IncludeDocs = case list_to_integer(RStr) of
-%% 1 ->
-%% true;
-%% R when R > 1 ->
-%% % We don't load the doc in the view query because
-%% % we have to do a quorum read in the coordinator
-%% % so there's no point.
-%% false
-%% end,
-%% NewArgs = Args#mrargs{include_docs = IncludeDocs},
-%% apply_opts(Rest, NewArgs);
-%%apply_opts([{conflicts, true} | Rest], Args) ->
-%% NewArgs = Args#mrargs{conflicts = true},
-%% apply_opts(Rest, NewArgs);
-%%apply_opts([{conflicts, false} | Rest], Args) ->
-%% % Ignored cause default
-%% apply_opts(Rest, Args);
-%%apply_opts([{sort, Sort} | Rest], Args) ->
-%% % We only support single direction sorts
-%% % so nothing fancy here.
-%% case mango_sort:directions(Sort) of
-%% [] ->
-%% apply_opts(Rest, Args);
-%% [<<"asc">> | _] ->
-%% apply_opts(Rest, Args);
-%% [<<"desc">> | _] ->
-%% SK = Args#mrargs.start_key,
-%% SKDI = Args#mrargs.start_key_docid,
-%% EK = Args#mrargs.end_key,
-%% EKDI = Args#mrargs.end_key_docid,
-%% NewArgs = Args#mrargs{
-%% direction = rev,
-%% start_key = EK,
-%% start_key_docid = EKDI,
-%% end_key = SK,
-%% end_key_docid = SKDI
-%% },
-%% apply_opts(Rest, NewArgs)
-%% end;
-%%apply_opts([{stale, ok} | Rest], Args) ->
-%% NewArgs = Args#mrargs{
-%% stable = true,
-%% update = false
-%% },
-%% apply_opts(Rest, NewArgs);
-%%apply_opts([{stable, true} | Rest], Args) ->
-%% NewArgs = Args#mrargs{
-%% stable = true
-%% },
-%% apply_opts(Rest, NewArgs);
-%%apply_opts([{update, false} | Rest], Args) ->
-%% NewArgs = Args#mrargs{
-%% update = false
-%% },
-%% apply_opts(Rest, NewArgs);
-%%apply_opts([{partition, <<>>} | Rest], Args) ->
-%% apply_opts(Rest, Args);
-%%apply_opts([{partition, Partition} | Rest], Args) when is_binary(Partition)
->
-%% NewArgs = couch_mrview_util:set_extra(Args, partition, Partition),
-%% apply_opts(Rest, NewArgs);
-%%apply_opts([{_, _} | Rest], Args) ->
-%% % Ignore unknown options
-%% apply_opts(Rest, Args).
-
-
-doc_member(Cursor, DocProps) ->
-%% Db = Cursor#cursor.db,
-%% Opts = Cursor#cursor.opts,
- ExecutionStats = Cursor#cursor.execution_stats,
+
+match_doc(Cursor, Doc) ->
+ ExecStats = Cursor#cursor.execution_stats,
Selector = Cursor#cursor.selector,
- ExecutionStats1 = mango_execution_stats:incr_docs_examined(ExecutionStats,
1),
- match_doc(Selector, DocProps, ExecutionStats1).
- %% {Matched, Incr} = case couch_util:get_value(value, RowProps) of
-%% N when is_integer(N) -> {true, N};
-%% _ -> {false, 1}
-%% end,
-%% case couch_util:get_value(doc, RowProps) of
-%% {DocProps} ->
-%% ExecutionStats1 =
mango_execution_stats:incr_docs_examined(ExecutionStats, Incr),
-%% case Matched of
-%% true ->
-%% {ok, {DocProps}, {execution_stats, ExecutionStats1}};
-%% false ->
-%% match_doc(Selector, {DocProps}, ExecutionStats1)
-%% end
-%% undefined ->
-%% ExecutionStats1 =
mango_execution_stats:incr_quorum_docs_examined(ExecutionStats),
-%% Id = couch_util:get_value(id, RowProps),
-%% case mango_util:defer(fabric, open_doc, [Db, Id, Opts]) of
-%% {ok, #doc{}=DocProps} ->
-%% Doc = couch_doc:to_json_obj(DocProps, []),
-%% match_doc(Selector, Doc, ExecutionStats1);
-%% Else ->
-%% Else
-%% end;
-%% null ->
-%% ExecutionStats1 =
mango_execution_stats:incr_docs_examined(ExecutionStats),
-%% {no_match, null, {execution_stats, ExecutionStats1}}
-%% end.
-
-
-match_doc(Selector, Doc, ExecutionStats) ->
+ ExecStats1 = mango_execution_stats:incr_docs_examined(ExecStats, 1),
+
case mango_selector:match(Selector, Doc) of
true ->
- {ok, Doc, {execution_stats, ExecutionStats}};
+ {ok, Doc, {execution_stats, ExecStats1}};
false ->
- {no_match, Doc, {execution_stats, ExecutionStats}}
+ {no_match, Doc, {execution_stats, ExecStats1}}
end.
-
-
-update_bookmark_keys(#cursor{limit = Limit} = Cursor, {Key, Props}) when Limit
> 0 ->
+update_bookmark_keys(#cursor{limit = Limit} = Cursor, {Key, Props})
+ when Limit > 0 ->
Id = couch_util:get_value(<<"_id">>, Props),
-%% Key = couch_util:get_value(<<"key">>, Props),
Cursor#cursor {
bookmark_docid = Id,
bookmark_key = Key
@@ -490,7 +322,7 @@ runs_match_on_doc_with_no_value_test() ->
]
}}
],
- {Match, _, _} = doc_member(Cursor, {RowProps}),
+ {Match, _, _} = match_doc(Cursor, {RowProps}),
?assertEqual(no_match, Match).
does_not_run_match_on_doc_with_value_test() ->
@@ -512,7 +344,7 @@ does_not_run_match_on_doc_with_value_test() ->
]
}}
],
- {Match, _, _} = doc_member(Cursor, {RowProps}),
+ {Match, _, _} = match_doc(Cursor, {RowProps}),
?assertEqual(ok, Match).
diff --git a/src/mango/src/mango_fdb.erl b/src/mango/src/mango_fdb.erl
index 9b5206e..7c2810f 100644
--- a/src/mango/src/mango_fdb.erl
+++ b/src/mango/src/mango_fdb.erl
@@ -24,7 +24,7 @@
create_build_vs/2,
set_build_vs/4,
get_build_vs/2,
- get_build_status/2,
+ get_build_state/2,
get_update_seq/2,
set_update_seq/3,
remove_doc/3,
@@ -70,7 +70,7 @@ get_build_vs(TxDb, DDoc) ->
end.
-get_build_status(TxDb, DDoc) ->
+get_build_state(TxDb, DDoc) ->
case get_build_vs(TxDb, DDoc) of
not_found -> ?MANGO_INDEX_BUILDING;
{_, BuildState} -> BuildState
@@ -118,6 +118,7 @@ write_doc(TxDb, DocId, IdxResults) ->
add_key(TxDb, MangoIdxPrefix, Results, DocId)
end, IdxResults).
+
query(Db, CallBack, Cursor, Args) ->
#cursor{
index = Idx
diff --git a/src/mango/src/mango_httpd.erl b/src/mango/src/mango_httpd.erl
index b8525dc..d5e9cfa 100644
--- a/src/mango/src/mango_httpd.erl
+++ b/src/mango/src/mango_httpd.erl
@@ -62,8 +62,7 @@ handle_req_int(_, _) ->
handle_index_req(#httpd{method='GET', path_parts=[_, _]}=Req, Db) ->
Params = lists:flatmap(fun({K, V}) -> parse_index_param(K, V) end,
chttpd:qs(Req)),
- Idxs0 = mango_idx:add_build_status(Db, mango_idx:list(Db)),
- Idxs = lists:sort(Idxs0),
+ Idxs = lists:sort(mango_idx:list(Db)),
JsonIdxs0 = lists:map(fun mango_idx:to_json/1, Idxs),
TotalRows = length(JsonIdxs0),
Limit = case couch_util:get_value(limit, Params, TotalRows) of
diff --git a/src/mango/src/mango_idx.erl b/src/mango/src/mango_idx.erl
index b861d52..401707b 100644
--- a/src/mango/src/mango_idx.erl
+++ b/src/mango/src/mango_idx.erl
@@ -26,7 +26,7 @@
add/2,
remove/2,
from_ddoc/2,
- add_build_status/2,
+%% add_build_status/2,
special/1,
dbname/1,
@@ -81,7 +81,8 @@ ddoc_fold_cb({row, Row}, Acc) ->
case proplists:get_value(<<"language">>, Props) of
<<"query">> ->
Idx = from_ddoc(Db, JSONDoc),
- {ok, Acc#{rows:= Rows ++ Idx}};
+ Idx1 = add_build_status(Db, Idx),
+ {ok, Acc#{rows:= Rows ++ Idx1}};
_ ->
{ok, Acc}
end.
@@ -104,7 +105,7 @@ get_rev_info(Row) ->
get_usable_indexes(Db, Selector, Opts) ->
- ExistingIndexes = mango_idx:add_build_status(Db, mango_idx:list(Db)),
+ ExistingIndexes = mango_idx:list(Db),
GlobalIndexes = mango_cursor:remove_indexes_with_partial_filter_selector(
ExistingIndexes
),
@@ -230,13 +231,12 @@ from_ddoc(Db, {Props}) ->
_ ->
?MANGO_ERROR(invalid_query_ddoc_language)
end,
- IdxMods = [mango_idx_view],
-%% IdxMods = case clouseau_rpc:connected() of
-%% true ->
-%% [mango_idx_view, mango_idx_text];
-%% false ->
-%% [mango_idx_view]
-%% end,
+ IdxMods = case is_text_service_available() of
+ true ->
+ [mango_idx_view, mango_idx_text];
+ false ->
+ [mango_idx_view]
+ end,
Idxs = lists:flatmap(fun(Mod) -> Mod:from_ddoc({Props}) end, IdxMods),
lists:map(fun(Idx) ->
Idx#idx{
@@ -247,18 +247,16 @@ from_ddoc(Db, {Props}) ->
end, Idxs).
-add_build_status(Db, Idxs) ->
- fabric2_fdb:transactional(Db, fun(TxDb) ->
- lists:map(fun
- (#idx{type = <<"special">>} = Idx) ->
- Idx;
- (Idx) ->
- DDoc = mango_idx:ddoc(Idx),
- Idx#idx{
- build_status = mango_fdb:get_build_status(TxDb, DDoc)
- }
- end, Idxs)
- end).
+add_build_status(TxDb, Idxs) ->
+ lists:map(fun
+ (#idx{type = <<"special">>} = Idx) ->
+ Idx;
+ (Idx) ->
+ DDoc = mango_idx:ddoc(Idx),
+ Idx#idx{
+ build_status = mango_fdb:get_build_state(TxDb, DDoc)
+ }
+ end, Idxs).
special(Db) ->
diff --git a/src/mango/src/mango_idx_view.hrl b/src/mango/src/mango_idx_view.hrl
index 14ce87c..2dc3c01 100644
--- a/src/mango/src/mango_idx_view.hrl
+++ b/src/mango/src/mango_idx_view.hrl
@@ -10,5 +10,4 @@
% License for the specific language governing permissions and limitations under
% the License.
-%%-define(MAX_JSON_OBJ, {<<255, 255, 255, 255>>}).
-define(MAX_JSON_OBJ, {[{<<"\ufff0">>, <<"\ufff0">>}]}).
diff --git a/src/mango/src/mango_jobs_indexer.erl
b/src/mango/src/mango_jobs_indexer.erl
index c22b62f..e1f6b56 100644
--- a/src/mango/src/mango_jobs_indexer.erl
+++ b/src/mango/src/mango_jobs_indexer.erl
@@ -21,9 +21,11 @@
-export([
+ set_timeout/0,
init/0
]).
+
-include("mango.hrl").
-include("mango_idx.hrl").
-include_lib("couch/include/couch_db.hrl").
@@ -34,6 +36,10 @@ spawn_link() ->
proc_lib:spawn_link(?MODULE, init, []).
+set_timeout() ->
+ mango_jobs:set_timeout().
+
+
init() ->
{ok, Job, Data} = couch_jobs:accept(?MANGO_INDEX_JOB_TYPE, #{}),
#{
@@ -266,47 +272,6 @@ index_doc(Db, Idx, #{doc := Doc}) ->
mango_indexer:write_doc(Db, Doc, [Idx]).
-%%fetch_docs(Db, Changes) ->
-%% {Deleted, NotDeleted} = lists:partition(fun(Doc) ->
-%% #{deleted := Deleted} = Doc,
-%% Deleted
-%% end, Changes),
-%%
-%% RevState = lists:foldl(fun(Change, Acc) ->
-%% #{id := Id} = Change,
-%% RevFuture = fabric2_fdb:get_winning_revs_future(Db, Id, 1),
-%% Acc#{
-%% RevFuture => {Id, Change}
-%% }
-%% end, #{}, NotDeleted),
-%%
-%% RevFutures = maps:keys(RevState),
-%% BodyState = lists:foldl(fun(RevFuture, Acc) ->
-%% {Id, Change} = maps:get(RevFuture, RevState),
-%% Revs = fabric2_fdb:get_winning_revs_wait(Db, RevFuture),
-%%
-%% % I'm assuming that in this changes transaction that the winning
-%% % doc body exists since it is listed in the changes feed as not
deleted
-%% #{winner := true} = RevInfo = lists:last(Revs),
-%% BodyFuture = fabric2_fdb:get_doc_body_future(Db, Id, RevInfo),
-%% Acc#{
-%% BodyFuture => {Id, RevInfo, Change}
-%% }
-%% end, #{}, erlfdb:wait_for_all(RevFutures)),
-%%
-%% BodyFutures = maps:keys(BodyState),
-%% ChangesWithDocs = lists:map(fun (BodyFuture) ->
-%% {Id, RevInfo, Change} = maps:get(BodyFuture, BodyState),
-%% Doc = fabric2_fdb:get_doc_body_wait(Db, Id, RevInfo, BodyFuture),
-%% Change#{doc => Doc}
-%% end, erlfdb:wait_for_all(BodyFutures)),
-%%
-%% % This combines the deleted changes with the changes that contain docs
-%% % Important to note that this is now unsorted. Which is fine for now
-%% % But later could be an issue if we split this across transactions
-%% Deleted ++ ChangesWithDocs.
-
-
report_progress(State, UpdateType) ->
#{
tx_db := TxDb,
diff --git a/src/mango/src/mango_util.erl b/src/mango/src/mango_util.erl
index 50fa79a..faad55c 100644
--- a/src/mango/src/mango_util.erl
+++ b/src/mango/src/mango_util.erl
@@ -86,15 +86,6 @@ open_doc(Db, DocId) ->
open_doc(Db, DocId, Options) ->
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) ->
diff --git a/src/mango/test/02-basic-find-test.py
b/src/mango/test/02-basic-find-test.py
index fd66e30..00d1d84 100644
--- a/src/mango/test/02-basic-find-test.py
+++ b/src/mango/test/02-basic-find-test.py
@@ -205,7 +205,7 @@ class BasicFindTests(mango.UserDocsTests):
docs1 = self.db.find({"age": {"$gt": 0}}, sort=[{"age": "desc"}])
docs2 = list(reversed(sorted(docs1, key=lambda d: d["age"])))
assert docs1 is not docs2 and docs1 == docs2
- #
+
def test_sort_desc_complex(self):
docs = self.db.find(
{