Skip to content

Commit 3a042eb

Browse files
authored
Add unit tests for partial indexes (#5)
1 parent c8759b2 commit 3a042eb

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ version = "3.0.17-0"
77
enum_primitive = "*"
88
tempdir = "*"
99
lazy_static = "1.4.0"
10+
regex = "1.10.4"
1011

1112
[dev-dependencies.cargo-husky]
1213
version = "1"

tests/query_tests.rs

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
extern crate couchbase_lite;
2+
extern crate regex;
23

34
use couchbase_lite::index::ValueIndexConfiguration;
5+
use regex::Regex;
46

57
use self::couchbase_lite::*;
68

@@ -64,23 +66,109 @@ fn query() {
6466
}
6567

6668
#[test]
67-
fn indexes() {
69+
fn full_index() {
6870
utils::with_db(|db| {
6971
assert!(db
7072
.create_index(
7173
"new_index",
72-
&ValueIndexConfiguration::new(QueryLanguage::JSON, r#"[[".id"]]"#),
74+
&ValueIndexConfiguration::new(QueryLanguage::JSON, r#"[[".someField"]]"#),
7375
)
7476
.unwrap());
7577

78+
// Check index creation
7679
let value = db.get_index_names().iter().next().unwrap();
7780
let name = value.as_string().unwrap();
7881
assert_eq!(name, "new_index");
7982

83+
// Check index used
84+
let query = Query::new(
85+
db,
86+
QueryLanguage::N1QL,
87+
"select _.* from _ where _.someField = 'whatever'",
88+
)
89+
.expect("create query");
90+
91+
let index = Regex::new(r"USING INDEX (\w+) ")
92+
.unwrap()
93+
.captures(&query.explain().unwrap())
94+
.map(|c| c.get(1).unwrap().as_str().to_string())
95+
.unwrap();
96+
97+
assert_eq!(index, "new_index");
98+
99+
// Check index not used
100+
let query = Query::new(
101+
db,
102+
QueryLanguage::N1QL,
103+
"select _.* from _ where _.notSomeField = 'whatever'",
104+
)
105+
.expect("create query");
106+
107+
let index = Regex::new(r"USING INDEX (\w+) ")
108+
.unwrap()
109+
.captures(&query.explain().unwrap())
110+
.map(|c| c.get(1).unwrap().as_str().to_string());
111+
112+
assert!(index.is_none());
113+
114+
// Check index deletion
115+
assert_eq!(db.get_index_names().count(), 1);
116+
80117
db.delete_index("idx").unwrap();
81118
assert_eq!(db.get_index_names().count(), 1);
82119

83120
db.delete_index("new_index").unwrap();
84121
assert_eq!(db.get_index_names().count(), 0);
85122
});
86123
}
124+
125+
#[test]
126+
fn partial_index() {
127+
utils::with_db(|db| {
128+
assert!(db
129+
.create_index(
130+
"new_index",
131+
&ValueIndexConfiguration::new(
132+
QueryLanguage::JSON,
133+
r#"{"WHAT": [[".id"]], "WHERE": ["=", [".someField"], "someValue"]}"#
134+
),
135+
)
136+
.unwrap());
137+
138+
// Check index creation
139+
let value = db.get_index_names().iter().next().unwrap();
140+
let name = value.as_string().unwrap();
141+
assert_eq!(name, "new_index");
142+
143+
// Check index used
144+
let query = Query::new(
145+
db,
146+
QueryLanguage::N1QL,
147+
"select _.* from _ where _.id = 'id' and _.someField='someValue'",
148+
)
149+
.expect("create query");
150+
151+
let index = Regex::new(r"USING INDEX (\w+) ")
152+
.unwrap()
153+
.captures(&query.explain().unwrap())
154+
.map(|c| c.get(1).unwrap().as_str().to_string())
155+
.unwrap();
156+
157+
assert_eq!(index, "new_index");
158+
159+
// Check index not used
160+
let query = Query::new(
161+
db,
162+
QueryLanguage::N1QL,
163+
"select _.* from _ where _.id = 'id' and _.someField='notSomeValue'",
164+
)
165+
.expect("create query");
166+
167+
let index = Regex::new(r"USING INDEX (\w+) ")
168+
.unwrap()
169+
.captures(&query.explain().unwrap())
170+
.map(|c| c.get(1).unwrap().as_str().to_string());
171+
172+
assert!(index.is_none());
173+
});
174+
}

0 commit comments

Comments
 (0)