surrealpatch/src/doc/check.rs
Tobie Morgan Hitchcock fbd924fbac Use copy-on-write semantics for document values
Instead of blindly cloning document values (even if we don't need to mutate them), we now use copy-on-write semantics to only create a copy if we need to update a document value. This improves performance, especially when selecting documents.
2022-02-13 19:03:00 +00:00

33 lines
722 B
Rust

use crate::dbs::Executor;
use crate::dbs::Options;
use crate::dbs::Runtime;
use crate::dbs::Statement;
use crate::doc::Document;
use crate::err::Error;
impl<'a> Document<'a> {
pub async fn check(
&self,
ctx: &Runtime,
opt: &Options,
exe: &Executor<'_>,
stm: &Statement<'_>,
) -> Result<(), Error> {
// Extract statement clause
let cond = match stm {
Statement::Select(stm) => stm.cond.as_ref(),
Statement::Update(stm) => stm.cond.as_ref(),
_ => unreachable!(),
};
// Match clause
match cond {
Some(v) => {
match v.expr.compute(ctx, opt, exe, Some(&self.current)).await?.is_truthy() {
false => Err(Error::IgnoreError),
true => Ok(()),
}
}
None => Ok(()),
}
}
}