surrealpatch/core/src/sql/v1/subquery.rs

108 lines
3.3 KiB
Rust
Raw Normal View History

2021-03-29 15:43:37 +00:00
use crate::ctx::Context;
use crate::dbs::{Options, Transaction};
use crate::doc::CursorDoc;
2021-03-29 15:43:37 +00:00
use crate::err::Error;
use crate::sql::statements::{
CreateStatement, DefineStatement, DeleteStatement, IfelseStatement, InsertStatement,
OutputStatement, RelateStatement, RemoveStatement, SelectStatement, UpdateStatement,
};
use crate::sql::value::Value;
use revision::revisioned;
2020-06-29 15:36:01 +00:00
use serde::{Deserialize, Serialize};
2021-03-29 15:43:37 +00:00
use std::cmp::Ordering;
use std::fmt::{self, Display, Formatter};
2020-06-29 15:36:01 +00:00
pub(crate) const TOKEN: &str = "$surrealdb::private::sql::Subquery";
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Hash)]
#[serde(rename = "$surrealdb::private::sql::Subquery")]
2024-01-09 15:34:52 +00:00
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[revisioned(revision = 1)]
2020-06-29 15:36:01 +00:00
pub enum Subquery {
Value(Value),
2020-06-29 15:36:01 +00:00
Ifelse(IfelseStatement),
Output(OutputStatement),
Select(SelectStatement),
Create(CreateStatement),
Update(UpdateStatement),
Delete(DeleteStatement),
Relate(RelateStatement),
Insert(InsertStatement),
Define(DefineStatement),
Remove(RemoveStatement),
// Add new variants here
2020-06-29 15:36:01 +00:00
}
2021-03-29 15:43:37 +00:00
impl PartialOrd for Subquery {
#[inline]
fn partial_cmp(&self, _: &Self) -> Option<Ordering> {
2022-03-23 11:56:39 +00:00
None
2021-03-29 15:43:37 +00:00
}
}
2022-01-14 08:12:56 +00:00
impl Subquery {
/// Check if we require a writeable transaction
pub(crate) fn writeable(&self) -> bool {
match self {
Self::Value(v) => v.writeable(),
Self::Ifelse(v) => v.writeable(),
Self::Output(v) => v.writeable(),
Self::Select(v) => v.writeable(),
Self::Create(v) => v.writeable(),
Self::Update(v) => v.writeable(),
Self::Delete(v) => v.writeable(),
Self::Relate(v) => v.writeable(),
Self::Insert(v) => v.writeable(),
Self::Define(v) => v.writeable(),
Self::Remove(v) => v.writeable(),
}
}
/// Process this type returning a computed simple Value
pub(crate) async fn compute(
&self,
ctx: &Context<'_>,
opt: &Options,
txn: &Transaction,
doc: Option<&CursorDoc<'_>>,
) -> Result<Value, Error> {
// Duplicate context
let mut ctx = Context::new(ctx);
// Add parent document
if let Some(doc) = doc {
ctx.add_value("parent", doc.doc.as_ref());
}
// Process the subquery
2021-03-29 15:43:37 +00:00
match self {
Self::Value(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Ifelse(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Output(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Define(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Remove(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Select(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Create(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Update(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Delete(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Relate(ref v) => v.compute(&ctx, opt, txn, doc).await,
Self::Insert(ref v) => v.compute(&ctx, opt, txn, doc).await,
2021-03-29 15:43:37 +00:00
}
}
}
impl Display for Subquery {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
2022-01-14 08:12:56 +00:00
match self {
2023-02-03 11:47:07 +00:00
Self::Value(v) => write!(f, "({v})"),
Self::Output(v) => write!(f, "({v})"),
2023-02-03 11:47:07 +00:00
Self::Select(v) => write!(f, "({v})"),
Self::Create(v) => write!(f, "({v})"),
Self::Update(v) => write!(f, "({v})"),
Self::Delete(v) => write!(f, "({v})"),
Self::Relate(v) => write!(f, "({v})"),
Self::Insert(v) => write!(f, "({v})"),
Self::Define(v) => write!(f, "({v})"),
Self::Remove(v) => write!(f, "({v})"),
Self::Ifelse(v) => Display::fmt(v, f),
2022-01-14 08:12:56 +00:00
}
}
}