surrealpatch/lib/tests/subquery.rs
2023-02-19 17:34:18 +00:00

179 lines
3.8 KiB
Rust

mod parse;
use parse::Parse;
use surrealdb::dbs::Session;
use surrealdb::err::Error;
use surrealdb::kvs::Datastore;
use surrealdb::sql::Value;
#[tokio::test]
async fn subquery_select() -> Result<(), Error> {
let sql = "
-- Create a record
CREATE person:test SET name = 'Tobie', age = 21;
-- Select all records, returning an array
SELECT age >= 18 as adult FROM person;
-- Select a specific record, still returning an array
SELECT age >= 18 as adult FROM person:test;
-- Select all records in a subquery, returning an array
RETURN (SELECT age >= 18 AS adult FROM person);
-- Select a specific record in a subquery, returning an object
RETURN (SELECT age >= 18 AS adult FROM person:test);
-- Using an outer SELECT, select all records in a subquery, returning an array
SELECT * FROM (SELECT age >= 18 AS adult FROM person) WHERE adult = true;
-- Using an outer SELECT, select a specific record in a subquery, returning an array
SELECT * FROM (SELECT age >= 18 AS adult FROM person:test) WHERE adult = true;
";
let dbs = Datastore::new("memory").await?;
let ses = Session::for_kv().with_ns("test").with_db("test");
let res = &mut dbs.execute(&sql, &ses, None, false).await?;
assert_eq!(res.len(), 7);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
age: 21,
id: person:test,
name: 'Tobie'
}
]",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
adult: true
}
]",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
adult: true
}
]",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
adult: true
}
]",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"{
adult: true
}",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
adult: true
}
]",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
adult: true
}
]",
);
assert_eq!(tmp, val);
//
Ok(())
}
#[tokio::test]
async fn subquery_ifelse() -> Result<(), Error> {
let sql = "
-- Check if the record exists
LET $record = (SELECT *, count() AS count FROM person:test);
-- Return the specified record
RETURN $record;
-- Update the record field if it exists
IF $record.count THEN
( UPDATE person:test SET sport += 'football' RETURN sport )
ELSE
( UPDATE person:test SET sport = ['basketball'] RETURN sport )
END;
-- Check if the record exists
LET $record = (SELECT *, count() AS count FROM person:test);
-- Return the specified record
RETURN $record;
-- Update the record field if it exists
IF $record.count THEN
( UPDATE person:test SET sport += 'football' RETURN sport )
ELSE
( UPDATE person:test SET sport = ['basketball'] RETURN sport )
END;
";
let dbs = Datastore::new("memory").await?;
let ses = Session::for_kv().with_ns("test").with_db("test");
let res = &mut dbs.execute(&sql, &ses, None, false).await?;
assert_eq!(res.len(), 6);
//
let tmp = res.remove(0).result?;
let val = Value::None;
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::None;
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"{
sport: [
'basketball'
]
}",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::None;
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"{
count: 1,
id: person:test,
sport: [
'basketball'
]
}",
);
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result?;
let val = Value::parse(
"{
sport: [
'basketball',
'football'
]
}",
);
assert_eq!(tmp, val);
//
Ok(())
}