Skip to content

Commit 6ab13fa

Browse files
committed
test: port 18-json-sort from python to elixir
1 parent 94e5842 commit 6ab13fa

2 files changed

Lines changed: 150 additions & 0 deletions

File tree

test/elixir/test/config/suite.elixir

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,5 +734,19 @@
734734
],
735735
"IgnoreDesignDocsForAllDocsIndexTests": [
736736
"should not return design docs"
737+
],
738+
"JSONIndexSortOptimisations": [
739+
"test_works_for_basic_case",
740+
"test_works_for_all_fields_specified",
741+
"test_works_for_no_sort_fields_specified",
742+
"test_works_for_opp_dir_sort",
743+
"test_not_work_for_non_constant_field",
744+
"test_three_index_one",
745+
"test_three_index_two",
746+
"test_three_index_fails",
747+
"test_empty_sort",
748+
"test_in_between",
749+
"test_ignore_after_set_sort_value",
750+
"test_not_use_index_if_other_fields_in_sort"
737751
]
738752
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
2+
# use this file except in compliance with the License. You may obtain a copy of
3+
# the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations under
11+
# the License.
12+
13+
defmodule JSONIndexSortOptimisations do
14+
use CouchTestCase
15+
16+
@db_name "json-sort-docs"
17+
@docs [
18+
%{"_id" => "1", "name" => "Jimi", "age" => 10, "cars" => 1},
19+
%{"_id" => "2", "name" => "Eddie", "age" => 20, "cars" => 1},
20+
%{"_id" => "3", "name" => "Jane", "age" => 30, "cars" => 2},
21+
%{"_id" => "4", "name" => "Mary", "age" => 40, "cars" => 2},
22+
%{"_id" => "5", "name" => "Sam", "age" => 50, "cars" => 3}
23+
]
24+
25+
setup do
26+
MangoDatabase.recreate(@db_name)
27+
MangoDatabase.save_docs(@db_name, @docs)
28+
:ok
29+
end
30+
31+
test "test_works_for_basic_case" do
32+
MangoDatabase.create_index(@db_name, ["cars", "age"], name: "cars-age")
33+
selector = %{"cars" => "2", "age" => %{"$gt" => 10}}
34+
{:ok, explain} = MangoDatabase.find(@db_name, selector, sort: ["age"], explain: true)
35+
36+
assert explain["index"]["name"] == "cars-age"
37+
assert explain["mrargs"]["direction"] == "fwd"
38+
end
39+
40+
test "test_works_for_all_fields_specified" do
41+
MangoDatabase.create_index(@db_name, ["cars", "age"], name: "cars-age")
42+
selector = %{"cars" => "2", "age" => %{"$gt" => 10}}
43+
{:ok, explain} = MangoDatabase.find(@db_name, selector, sort: ["cars", "age"], explain: true)
44+
45+
assert explain["index"]["name"] == "cars-age"
46+
end
47+
48+
test "test_works_for_no_sort_fields_specified" do
49+
MangoDatabase.create_index(@db_name, ["cars", "age"], name: "cars-age")
50+
selector = %{"cars" => %{"$gt" => 10}, "age" => %{"$gt" => 10}}
51+
{:ok, explain} = MangoDatabase.find(@db_name, selector, explain: true)
52+
53+
assert explain["index"]["name"] == "cars-age"
54+
end
55+
56+
test "test_works_for_opp_dir_sort" do
57+
MangoDatabase.create_index(@db_name, ["cars", "age"], name: "cars-age")
58+
selector = %{"cars" => "2", "age" => %{"$gt" => 10}}
59+
{:ok, explain} = MangoDatabase.find(@db_name, selector, sort: [%{"age" => "desc"}], explain: true)
60+
61+
assert explain["index"]["name"] == "cars-age"
62+
assert explain["mrargs"]["direction"] == "rev"
63+
end
64+
65+
test "test_not_work_for_non_constant_field" do
66+
MangoDatabase.create_index(@db_name, ["cars", "age"], name: "cars-age")
67+
selector = %{"cars" => %{"$gt" => 10}, "age" => %{"$gt" => 10}}
68+
{:error, resp} = MangoDatabase.find(@db_name, selector, sort: ["age"])
69+
70+
assert resp.body["error"] == "no_usable_index"
71+
assert resp.status_code == 400
72+
end
73+
74+
test "test_three_index_one" do
75+
MangoDatabase.create_index(@db_name, ["cars", "age", "name"], name: "cars-age-name")
76+
selector = %{"cars" => "2", "age" => 10, "name" => %{"$gt" => "AA"}}
77+
{:ok, explain} = MangoDatabase.find(@db_name, selector, sort: ["name"], explain: true)
78+
79+
assert explain["index"]["name"] == "cars-age-name"
80+
end
81+
82+
test "test_three_index_two" do
83+
MangoDatabase.create_index(@db_name, ["cars", "age", "name"], name: "cars-age-name")
84+
selector = %{"cars" => "2", "name" => "Eddie", "age" => %{"$gt" => 10}}
85+
{:ok, explain} = MangoDatabase.find(@db_name, selector, sort: ["age"], explain: true)
86+
87+
assert explain["index"]["name"] == "cars-age-name"
88+
end
89+
90+
test "test_three_index_fails" do
91+
MangoDatabase.create_index(@db_name, ["cars", "age", "name"], name: "cars-age-name")
92+
selector = %{"name" => "Eddie", "age" => %{"$gt" => 1}, "cars" => %{"$gt" => "1"}}
93+
{:error, response} = MangoDatabase.find(@db_name, selector, sort: ["name"])
94+
95+
assert response.body["error"] == "no_usable_index"
96+
assert response.status_code == 400
97+
end
98+
99+
test "test_empty_sort" do
100+
MangoDatabase.create_index(@db_name, ["cars", "age", "name"], name: "cars-age-name")
101+
selector = %{"name" => %{"$gt" => "Eddie"}, "age" => 10, "cars" => %{"$gt" => "1"}}
102+
{:ok, explain} = MangoDatabase.find(@db_name, selector, explain: true)
103+
104+
assert explain["index"]["name"] == "cars-age-name"
105+
end
106+
107+
test "test_in_between" do
108+
MangoDatabase.create_index(@db_name, ["cars", "age", "name"], name: "cars-age-name")
109+
selector = %{"name" => "Eddie", "age" => 10, "cars" => %{"$gt" => "1"}}
110+
111+
{:ok, explain} = MangoDatabase.find(@db_name, selector, explain: true)
112+
assert explain["index"]["name"] == "cars-age-name"
113+
114+
{:error, response} = MangoDatabase.find(@db_name, selector, sort: ["cars", "name"])
115+
assert response.body["error"] == "no_usable_index"
116+
assert response.status_code == 400
117+
end
118+
119+
test "test_ignore_after_set_sort_value" do
120+
MangoDatabase.create_index(@db_name, ["cars", "age", "name"], name: "cars-age-name")
121+
selector = %{"age" => %{"$gt" => 10}, "cars" => 2, "name" => %{"$gt" => "A"}}
122+
{:ok, explain} = MangoDatabase.find(@db_name, selector, sort: ["age"], explain: true)
123+
124+
assert explain["index"]["name"] == "cars-age-name"
125+
end
126+
127+
test "test_not_use_index_if_other_fields_in_sort" do
128+
MangoDatabase.create_index(@db_name, ["cars", "age"], name: "cars-age")
129+
selector = %{"age" => 10, "cars" => %{"$gt" => "1"}}
130+
131+
{:error, response} = MangoDatabase.find(@db_name, selector, sort: ["cars", "name"])
132+
assert response.body["error"] == "no_usable_index"
133+
assert response.status_code == 400
134+
end
135+
136+
end

0 commit comments

Comments
 (0)