Correctly choose index type When users specify "$text" in the selector, json indexes should not be used satisfy the query. We check the list of fields and look for "$default". This implies that "$text" was used in the selector and filter out all json indexes.
BugzId: 46498 Project: http://git-wip-us.apache.org/repos/asf/couchdb-mango/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mango/commit/f481b566 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mango/tree/f481b566 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mango/diff/f481b566 Branch: refs/heads/2787-merge-repos Commit: f481b566881a7e7effd86bf0449b487789ad93ed Parents: a814fe7 Author: Tony Sun <tony....@cloudant.com> Authored: Tue Aug 25 13:44:47 2015 -0700 Committer: Tony Sun <tony....@cloudant.com> Committed: Tue Aug 25 13:44:47 2015 -0700 ---------------------------------------------------------------------- src/mango_idx_view.erl | 20 +++++++++++++++++++- test/05-index-selection-test.py | 8 ++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/f481b566/src/mango_idx_view.erl ---------------------------------------------------------------------- diff --git a/src/mango_idx_view.erl b/src/mango_idx_view.erl index ce0b206..a313f56 100644 --- a/src/mango_idx_view.erl +++ b/src/mango_idx_view.erl @@ -112,7 +112,25 @@ is_usable(Idx, Selector) -> % a member of the indexable fields of the selector. Columns = columns(Idx), Fields = indexable_fields(Selector), - lists:member(hd(Columns), Fields). + lists:member(hd(Columns), Fields) and not is_text_search(Selector). + + +is_text_search({[]}) -> + false; +is_text_search({[{<<"$default">>, _}]}) -> + true; +is_text_search({[{_Field, Cond}]}) when is_list(Cond) -> + lists:foldl(fun(C, Exists) -> + Exists or is_text_search(C) + end, false, Cond); +is_text_search({[{_Field, Cond}]}) when is_tuple(Cond) -> + is_text_search(Cond); +is_text_search({[{_Field, _Cond}]}) -> + false; +%% we reached values, which should always be false +is_text_search(Val) + when is_number(Val); is_boolean(Val); is_binary(Val)-> + false. start_key([]) -> http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/f481b566/test/05-index-selection-test.py ---------------------------------------------------------------------- diff --git a/test/05-index-selection-test.py b/test/05-index-selection-test.py index 856e924..5934f91 100644 --- a/test/05-index-selection-test.py +++ b/test/05-index-selection-test.py @@ -32,6 +32,14 @@ class IndexSelectionTests(mango.UserDocsTests): }, explain=True) assert resp["index"]["type"] == "json" + def test_with_text(self): + resp = self.db.find({ + "$text" : "Stephanie", + "name.first": "Stephanie", + "name.last": "This doesn't have to match anything." + }, explain=True) + assert resp["index"]["type"] == "text" + @unittest.skip def test_no_view_index(self): resp = self.db.find({"name.first": "Ohai!"}, explain=True)