You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2023/02/14 15:14:45 UTC

[couchdb] 04/05: mango: Cover JSON index selection with unit tests

This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit a650b446148f7f8913a0941fa9f80d2c441554ad
Author: Gabor Pali <ga...@ibm.com>
AuthorDate: Mon Feb 13 22:59:11 2023 +0100

    mango: Cover JSON index selection with unit tests
---
 src/mango/src/mango_cursor_view.erl | 79 +++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/src/mango/src/mango_cursor_view.erl b/src/mango/src/mango_cursor_view.erl
index 883f2e448..c494e3d78 100644
--- a/src/mango/src/mango_cursor_view.erl
+++ b/src/mango/src/mango_cursor_view.erl
@@ -630,4 +630,83 @@ match_and_extract_doc_nomatch_fields_test() ->
     ?assertEqual(no_match, Match),
     ?assertEqual(undefined, FinalDoc).
 
+%% Query planner tests:
+%% - there should be no comparison for a singleton list, with a trivial result
+choose_best_index_with_singleton_test() ->
+    ?assertEqual({index, ranges}, choose_best_index([{index, ranges, undefined}])).
+
+%% - choose the index with the lowest difference between its prefix and field ranges
+choose_best_index_lowest_difference_test() ->
+    IndexRanges =
+        [
+            {index1, ranges1, 3},
+            {index2, ranges2, 2},
+            {index3, ranges3, 1}
+        ],
+    ?assertEqual({index3, ranges3}, choose_best_index(IndexRanges)).
+
+%% - if that is equal, choose the index with the least number of fields in the index
+choose_best_index_least_number_of_fields_test() ->
+    Index = json_index(dbname, design_document, index_name),
+    [Index1, Index2, Index3] = [with_dummy_columns(Index, N) || N <- [6, 3, 9]],
+    IndexRanges =
+        [
+            {Index1, ranges1, 1},
+            {Index2, ranges2, 1},
+            {Index3, ranges3, 1}
+        ],
+    ?assertEqual({Index2, ranges2}, choose_best_index(IndexRanges)).
+
+%% - otherwise, choose alphabetically based on the index properties:
+choose_best_index_lowest_index_triple_test() ->
+    WithSomeColumns = fun(Idx) -> with_dummy_columns(Idx, 3) end,
+
+    % - database name
+    Index1 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/c">>, <<"B">>)),
+    Index2 = WithSomeColumns(json_index(<<"db_b">>, <<"_design/b">>, <<"C">>)),
+    Index3 = WithSomeColumns(json_index(<<"db_c">>, <<"_design/a">>, <<"A">>)),
+    IndexRanges1 =
+        [
+            {Index1, ranges1, 1},
+            {Index2, ranges2, 1},
+            {Index3, ranges3, 1}
+        ],
+    ?assertEqual({Index1, ranges1}, choose_best_index(IndexRanges1)),
+
+    % - if that is equal, design document name
+    Index4 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/c">>, <<"B">>)),
+    Index5 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/b">>, <<"C">>)),
+    Index6 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/a">>, <<"A">>)),
+    IndexRanges2 =
+        [
+            {Index4, ranges4, 1},
+            {Index5, ranges5, 1},
+            {Index6, ranges6, 1}
+        ],
+    ?assertEqual({Index6, ranges6}, choose_best_index(IndexRanges2)),
+
+    % - otherwise, index name
+    Index7 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/a">>, <<"B">>)),
+    Index8 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/a">>, <<"C">>)),
+    Index9 = WithSomeColumns(json_index(<<"db_a">>, <<"_design/a">>, <<"A">>)),
+    IndexRanges3 =
+        [
+            {Index7, ranges7, 1},
+            {Index8, ranges8, 1},
+            {Index9, ranges9, 1}
+        ],
+    ?assertEqual({Index9, ranges9}, choose_best_index(IndexRanges3)).
+
+json_index(DbName, DesignDoc, Name) ->
+    #idx{
+        dbname = DbName,
+        ddoc = DesignDoc,
+        name = Name,
+        type = <<"json">>
+    }.
+
+with_dummy_columns(Index, Count) ->
+    Columns =
+        {[{<<"field", (integer_to_binary(I))/binary>>, undefined} || I <- lists:seq(1, Count)]},
+    Index#idx{def = {[{<<"fields">>, Columns}]}}.
 -endif.