diff --git a/Cargo.toml b/Cargo.toml index 6eb1eaa..8664d50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ version = "3.0.17-0" enum_primitive = "*" tempdir = "*" lazy_static = "1.4.0" +regex = "1.10.4" [dev-dependencies.cargo-husky] version = "1" diff --git a/tests/query_tests.rs b/tests/query_tests.rs index ad34623..a1e2dfd 100644 --- a/tests/query_tests.rs +++ b/tests/query_tests.rs @@ -1,6 +1,8 @@ extern crate couchbase_lite; +extern crate regex; use couchbase_lite::index::ValueIndexConfiguration; +use regex::Regex; use self::couchbase_lite::*; @@ -64,19 +66,54 @@ fn query() { } #[test] -fn indexes() { +fn full_index() { utils::with_db(|db| { assert!(db .create_index( "new_index", - &ValueIndexConfiguration::new(QueryLanguage::JSON, r#"[[".id"]]"#), + &ValueIndexConfiguration::new(QueryLanguage::JSON, r#"[[".someField"]]"#), ) .unwrap()); + // Check index creation let value = db.get_index_names().iter().next().unwrap(); let name = value.as_string().unwrap(); assert_eq!(name, "new_index"); + // Check index used + let query = Query::new( + db, + QueryLanguage::N1QL, + "select _.* from _ where _.someField = 'whatever'", + ) + .expect("create query"); + + let index = Regex::new(r"USING INDEX (\w+) ") + .unwrap() + .captures(&query.explain().unwrap()) + .map(|c| c.get(1).unwrap().as_str().to_string()) + .unwrap(); + + assert_eq!(index, "new_index"); + + // Check index not used + let query = Query::new( + db, + QueryLanguage::N1QL, + "select _.* from _ where _.notSomeField = 'whatever'", + ) + .expect("create query"); + + let index = Regex::new(r"USING INDEX (\w+) ") + .unwrap() + .captures(&query.explain().unwrap()) + .map(|c| c.get(1).unwrap().as_str().to_string()); + + assert!(index.is_none()); + + // Check index deletion + assert_eq!(db.get_index_names().count(), 1); + db.delete_index("idx").unwrap(); assert_eq!(db.get_index_names().count(), 1); @@ -84,3 +121,54 @@ fn indexes() { assert_eq!(db.get_index_names().count(), 0); }); } + +#[test] +fn partial_index() { + utils::with_db(|db| { + assert!(db + .create_index( + "new_index", + &ValueIndexConfiguration::new( + QueryLanguage::JSON, + r#"{"WHAT": [[".id"]], "WHERE": ["=", [".someField"], "someValue"]}"# + ), + ) + .unwrap()); + + // Check index creation + let value = db.get_index_names().iter().next().unwrap(); + let name = value.as_string().unwrap(); + assert_eq!(name, "new_index"); + + // Check index used + let query = Query::new( + db, + QueryLanguage::N1QL, + "select _.* from _ where _.id = 'id' and _.someField='someValue'", + ) + .expect("create query"); + + let index = Regex::new(r"USING INDEX (\w+) ") + .unwrap() + .captures(&query.explain().unwrap()) + .map(|c| c.get(1).unwrap().as_str().to_string()) + .unwrap(); + + assert_eq!(index, "new_index"); + + // Check index not used + let query = Query::new( + db, + QueryLanguage::N1QL, + "select _.* from _ where _.id = 'id' and _.someField='notSomeValue'", + ) + .expect("create query"); + + let index = Regex::new(r"USING INDEX (\w+) ") + .unwrap() + .captures(&query.explain().unwrap()) + .map(|c| c.get(1).unwrap().as_str().to_string()); + + assert!(index.is_none()); + }); +}