use akar_binder::bound_statement::BoundExpression;
use akar_catalog::CatalogColumn;
use akar_parser::ast::Expression;
#[derive(Debug, Clone)]
pub struct LogicalExpressionsScan {
pub expressions: Vec<String>,
pub outer_accumulate_idx: Option<usize>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalAccumulate {
pub accumulate_type: akar_common::enums::AccumulateType,
pub flat_exprs: Vec<akar_parser::ast::Expression>,
pub mark: Option<akar_parser::ast::Expression>,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCountRelTable {
pub table_name: String,
pub table_id: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalPartitioner {
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalPathPropertyProbe {
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
pub node_ids_col_idx: usize,
pub edge_ids_col_idx: Option<usize>,
pub properties: Vec<(String, bool, Vec<String>)>,
}
#[derive(Debug, Clone)]
pub enum LogicalOperator {
ScanNode(LogicalScanNode),
ScanRel(LogicalScanRel),
VectorSimilarityScan(LogicalVectorSimilarityScan),
ArtIndexRangeScan(LogicalArtIndexRangeScan),
Filter(LogicalFilter),
Projection(LogicalProjection),
HashJoin(LogicalHashJoin),
CrossProduct(LogicalCrossProduct),
OrderBy(LogicalOrderBy),
Limit(LogicalLimit),
TopK(LogicalTopK),
Aggregate(LogicalAggregate),
Union(LogicalUnion),
Flatten(LogicalFlatten),
TableFunctionCall(LogicalTableFunctionCall),
StandaloneCall(LogicalStandaloneCall),
CopyFrom(LogicalCopyFrom),
BatchInsert(LogicalBatchInsert),
IndexLookup(LogicalIndexLookup),
Delete(LogicalDelete),
Set(LogicalSet),
OptionalMatch(LogicalOptionalMatch),
Unwind(LogicalUnwind),
Foreach(LogicalForeach),
Merge(LogicalMerge),
SemiJoin(LogicalSemiJoin),
AntiJoin(LogicalAntiJoin),
Intersect(LogicalIntersect),
Explain(LogicalExplain),
RecursiveExtend(LogicalRecursiveExtend),
Accumulate(LogicalAccumulate),
ExpressionsScan(LogicalExpressionsScan),
CountRelTable(LogicalCountRelTable),
Partitioner(LogicalPartitioner),
PathPropertyProbe(LogicalPathPropertyProbe),
CreateNodeTable(LogicalCreateNodeTable),
CreateRelTable(LogicalCreateRelTable),
DropTable(LogicalDropTable),
AlterTable(LogicalAlterTable),
CreateIndex(LogicalCreateIndex),
DropIndex(LogicalDropIndex),
CreateVectorIndex(LogicalCreateVectorIndex),
CreateSequence(LogicalCreateSequence),
DropSequence(LogicalDropSequence),
CreateDml(LogicalCreateDml),
CreateNode(LogicalCreateNode),
CreateRel(LogicalCreateRel),
Extend(LogicalExtend),
ExportDatabase(LogicalExportDatabase),
ImportDatabase(LogicalImportDatabase),
CreateFtsIndex(LogicalCreateFtsIndex),
FtsScan(LogicalFtsScan),
EmptyResult(LogicalEmptyResult),
MultiplicityReducer(LogicalMultiplicityReducer),
Skip(LogicalSkip),
Insert(LogicalInsert),
ExtensionClause(LogicalExtensionClause),
}
impl LogicalOperator {
pub fn cardinality(&self) -> u64 {
match self {
LogicalOperator::ScanNode(s) => s.cardinality,
LogicalOperator::ScanRel(s) => s.cardinality,
LogicalOperator::VectorSimilarityScan(s) => s.cardinality,
LogicalOperator::ArtIndexRangeScan(s) => s.cardinality,
LogicalOperator::Filter(s) => s.cardinality,
LogicalOperator::Projection(s) => s.cardinality,
LogicalOperator::HashJoin(s) => s.cardinality,
LogicalOperator::CrossProduct(s) => s.cardinality,
LogicalOperator::OrderBy(s) => s.cardinality,
LogicalOperator::TopK(s) => s.cardinality,
LogicalOperator::Limit(s) => s.cardinality,
LogicalOperator::Aggregate(s) => s.cardinality,
LogicalOperator::Union(s) => s.cardinality,
LogicalOperator::Flatten(s) => s.cardinality,
LogicalOperator::TableFunctionCall(s) => s.cardinality,
LogicalOperator::StandaloneCall(s) => s.cardinality,
LogicalOperator::CopyFrom(s) => s.cardinality,
LogicalOperator::BatchInsert(s) => s.cardinality,
LogicalOperator::IndexLookup(s) => s.cardinality,
LogicalOperator::Delete(s) => s.cardinality,
LogicalOperator::Set(s) => s.cardinality,
LogicalOperator::OptionalMatch(s) => s.cardinality,
LogicalOperator::Unwind(s) => s.cardinality,
LogicalOperator::Foreach(s) => s.cardinality,
LogicalOperator::Merge(s) => s.cardinality,
LogicalOperator::SemiJoin(s) => s.cardinality,
LogicalOperator::AntiJoin(s) => s.cardinality,
LogicalOperator::Intersect(s) => s.cardinality,
LogicalOperator::Explain(s) => s.cardinality,
LogicalOperator::RecursiveExtend(s) => s.cardinality,
LogicalOperator::Accumulate(s) => s.cardinality,
LogicalOperator::ExpressionsScan(s) => s.cardinality,
LogicalOperator::CountRelTable(_) => 1,
LogicalOperator::Partitioner(s) => s.cardinality,
LogicalOperator::PathPropertyProbe(s) => s.cardinality,
LogicalOperator::CreateNodeTable(s) => s.cardinality,
LogicalOperator::CreateRelTable(s) => s.cardinality,
LogicalOperator::DropTable(s) => s.cardinality,
LogicalOperator::AlterTable(s) => s.cardinality,
LogicalOperator::CreateIndex(s) => s.cardinality,
LogicalOperator::DropIndex(s) => s.cardinality,
LogicalOperator::CreateVectorIndex(s) => s.cardinality,
LogicalOperator::CreateSequence(s) => s.cardinality,
LogicalOperator::DropSequence(s) => s.cardinality,
LogicalOperator::CreateDml(s) => s.cardinality,
LogicalOperator::CreateNode(s) => s.cardinality,
LogicalOperator::CreateRel(s) => s.cardinality,
LogicalOperator::Extend(s) => s.cardinality,
LogicalOperator::ExportDatabase(s) => s.cardinality,
LogicalOperator::ImportDatabase(s) => s.cardinality,
LogicalOperator::CreateFtsIndex(s) => s.cardinality,
LogicalOperator::FtsScan(s) => s.cardinality,
LogicalOperator::EmptyResult(s) => s.cardinality,
LogicalOperator::MultiplicityReducer(s) => s.cardinality,
LogicalOperator::Skip(s) => s.cardinality,
LogicalOperator::Insert(s) => s.cardinality,
LogicalOperator::ExtensionClause(s) => s.cardinality,
}
}
pub fn set_cardinality(&mut self, card: u64) {
match self {
LogicalOperator::ScanNode(s) => s.cardinality = card,
LogicalOperator::ScanRel(s) => s.cardinality = card,
LogicalOperator::VectorSimilarityScan(s) => s.cardinality = card,
LogicalOperator::ArtIndexRangeScan(s) => s.cardinality = card,
LogicalOperator::Filter(s) => s.cardinality = card,
LogicalOperator::Projection(s) => s.cardinality = card,
LogicalOperator::HashJoin(s) => s.cardinality = card,
LogicalOperator::CrossProduct(s) => s.cardinality = card,
LogicalOperator::OrderBy(s) => s.cardinality = card,
LogicalOperator::TopK(s) => s.cardinality = card,
LogicalOperator::Limit(s) => s.cardinality = card,
LogicalOperator::Aggregate(s) => s.cardinality = card,
LogicalOperator::Union(s) => s.cardinality = card,
LogicalOperator::Flatten(s) => s.cardinality = card,
LogicalOperator::TableFunctionCall(s) => s.cardinality = card,
LogicalOperator::StandaloneCall(s) => s.cardinality = card,
LogicalOperator::CopyFrom(s) => s.cardinality = card,
LogicalOperator::BatchInsert(s) => s.cardinality = card,
LogicalOperator::IndexLookup(s) => s.cardinality = card,
LogicalOperator::Delete(s) => s.cardinality = card,
LogicalOperator::Set(s) => s.cardinality = card,
LogicalOperator::OptionalMatch(s) => s.cardinality = card,
LogicalOperator::Unwind(s) => s.cardinality = card,
LogicalOperator::Foreach(s) => s.cardinality = card,
LogicalOperator::Merge(s) => s.cardinality = card,
LogicalOperator::SemiJoin(s) => s.cardinality = card,
LogicalOperator::AntiJoin(s) => s.cardinality = card,
LogicalOperator::Intersect(s) => s.cardinality = card,
LogicalOperator::Explain(s) => s.cardinality = card,
LogicalOperator::RecursiveExtend(s) => s.cardinality = card,
LogicalOperator::Accumulate(s) => s.cardinality = card,
LogicalOperator::ExpressionsScan(s) => s.cardinality = card,
LogicalOperator::CountRelTable(_) => {}
LogicalOperator::Partitioner(s) => s.cardinality = card,
LogicalOperator::PathPropertyProbe(s) => s.cardinality = card,
LogicalOperator::CreateNodeTable(s) => s.cardinality = card,
LogicalOperator::CreateRelTable(s) => s.cardinality = card,
LogicalOperator::DropTable(s) => s.cardinality = card,
LogicalOperator::AlterTable(s) => s.cardinality = card,
LogicalOperator::CreateIndex(s) => s.cardinality = card,
LogicalOperator::DropIndex(s) => s.cardinality = card,
LogicalOperator::CreateVectorIndex(s) => s.cardinality = card,
LogicalOperator::CreateSequence(s) => s.cardinality = card,
LogicalOperator::DropSequence(s) => s.cardinality = card,
LogicalOperator::CreateDml(s) => s.cardinality = card,
LogicalOperator::CreateNode(s) => s.cardinality = card,
LogicalOperator::CreateRel(s) => s.cardinality = card,
LogicalOperator::Extend(s) => s.cardinality = card,
LogicalOperator::ExportDatabase(s) => s.cardinality = card,
LogicalOperator::ImportDatabase(s) => s.cardinality = card,
LogicalOperator::CreateFtsIndex(s) => s.cardinality = card,
LogicalOperator::FtsScan(s) => s.cardinality = card,
LogicalOperator::EmptyResult(s) => s.cardinality = card,
LogicalOperator::MultiplicityReducer(s) => s.cardinality = card,
LogicalOperator::Skip(s) => s.cardinality = card,
LogicalOperator::Insert(s) => s.cardinality = card,
LogicalOperator::ExtensionClause(s) => s.cardinality = card,
}
}
pub fn visit_bottom_up<F: FnMut(&mut LogicalOperator)>(op: &mut LogicalOperator, f: &mut F) {
let children = op.children_mut();
for child in children {
Self::visit_bottom_up(child, f);
}
f(op);
}
pub fn children_mut(&mut self) -> Vec<&mut LogicalOperator> {
match self {
LogicalOperator::Filter(s) => s.children.iter_mut().collect(),
LogicalOperator::Projection(s) => s.children.iter_mut().collect(),
LogicalOperator::HashJoin(s) => vec![&mut *s.probe_side, &mut *s.build_side],
LogicalOperator::CrossProduct(s) => vec![&mut *s.left, &mut *s.right],
LogicalOperator::OrderBy(s) => s.children.iter_mut().collect(),
LogicalOperator::TopK(s) => s.children.iter_mut().collect(),
LogicalOperator::Limit(s) => s.children.iter_mut().collect(),
LogicalOperator::Aggregate(s) => s.children.iter_mut().collect(),
LogicalOperator::Union(s) => vec![&mut *s.left, &mut *s.right],
LogicalOperator::Flatten(s) => s.children.iter_mut().collect(),
LogicalOperator::OptionalMatch(s) => vec![&mut *s.left, &mut *s.right],
LogicalOperator::SemiJoin(s) => vec![&mut *s.left, &mut *s.right],
LogicalOperator::AntiJoin(s) => vec![&mut *s.left, &mut *s.right],
LogicalOperator::Intersect(s) => vec![&mut *s.left, &mut *s.right],
LogicalOperator::Explain(s) => vec![&mut *s.inner],
LogicalOperator::RecursiveExtend(_) => vec![],
LogicalOperator::Accumulate(s) => s.children.iter_mut().collect(),
LogicalOperator::Partitioner(s) => s.children.iter_mut().collect(),
LogicalOperator::PathPropertyProbe(s) => s.children.iter_mut().collect(),
LogicalOperator::CountRelTable(_) => vec![],
LogicalOperator::ExpressionsScan(_) => vec![],
LogicalOperator::TableFunctionCall(_) => vec![],
LogicalOperator::StandaloneCall(_) => vec![],
LogicalOperator::CopyFrom(_)
| LogicalOperator::BatchInsert(_)
| LogicalOperator::IndexLookup(_)
| LogicalOperator::Delete(_)
| LogicalOperator::Set(_)
| LogicalOperator::Unwind(_)
| LogicalOperator::Foreach(_)
| LogicalOperator::Merge(_) => vec![],
LogicalOperator::ArtIndexRangeScan(_)
| LogicalOperator::VectorSimilarityScan(_)
| LogicalOperator::ScanNode(_)
| LogicalOperator::ScanRel(_)
| LogicalOperator::CreateNodeTable(_)
| LogicalOperator::CreateRelTable(_)
| LogicalOperator::DropTable(_)
| LogicalOperator::AlterTable(_)
| LogicalOperator::CreateIndex(_)
| LogicalOperator::DropIndex(_)
| LogicalOperator::CreateVectorIndex(_)
| LogicalOperator::CreateSequence(_)
| LogicalOperator::DropSequence(_)
| LogicalOperator::CreateDml(_)
| LogicalOperator::CreateNode(_)
| LogicalOperator::CreateRel(_)
| LogicalOperator::Extend(_)
| LogicalOperator::ExportDatabase(_)
| LogicalOperator::ImportDatabase(_)
| LogicalOperator::CreateFtsIndex(_)
| LogicalOperator::FtsScan(_)
| LogicalOperator::EmptyResult(_)
| LogicalOperator::Insert(_)
| LogicalOperator::ExtensionClause(_) => vec![],
LogicalOperator::MultiplicityReducer(s) => s.children.iter_mut().collect(),
LogicalOperator::Skip(s) => s.children.iter_mut().collect(),
}
}
pub fn children(&self) -> Vec<&LogicalOperator> {
match self {
LogicalOperator::Filter(s) => s.children.iter().collect(),
LogicalOperator::Projection(s) => s.children.iter().collect(),
LogicalOperator::HashJoin(s) => vec![&*s.probe_side, &*s.build_side],
LogicalOperator::CrossProduct(s) => vec![&*s.left, &*s.right],
LogicalOperator::OrderBy(s) => s.children.iter().collect(),
LogicalOperator::TopK(s) => s.children.iter().collect(),
LogicalOperator::Limit(s) => s.children.iter().collect(),
LogicalOperator::Aggregate(s) => s.children.iter().collect(),
LogicalOperator::Union(s) => vec![&*s.left, &*s.right],
LogicalOperator::Flatten(s) => s.children.iter().collect(),
LogicalOperator::OptionalMatch(s) => vec![&*s.left, &*s.right],
LogicalOperator::SemiJoin(s) => vec![&*s.left, &*s.right],
LogicalOperator::AntiJoin(s) => vec![&*s.left, &*s.right],
LogicalOperator::Intersect(s) => vec![&*s.left, &*s.right],
LogicalOperator::Explain(s) => vec![&*s.inner],
LogicalOperator::RecursiveExtend(_) => vec![],
LogicalOperator::Accumulate(s) => s.children.iter().collect(),
LogicalOperator::Partitioner(s) => s.children.iter().collect(),
LogicalOperator::PathPropertyProbe(s) => s.children.iter().collect(),
LogicalOperator::CountRelTable(_) => vec![],
LogicalOperator::ExpressionsScan(_) => vec![],
LogicalOperator::TableFunctionCall(_) => vec![],
LogicalOperator::StandaloneCall(_) => vec![],
LogicalOperator::CopyFrom(_)
| LogicalOperator::BatchInsert(_)
| LogicalOperator::IndexLookup(_)
| LogicalOperator::Delete(_)
| LogicalOperator::Set(_)
| LogicalOperator::Unwind(_)
| LogicalOperator::Foreach(_)
| LogicalOperator::Merge(_) => vec![],
LogicalOperator::ArtIndexRangeScan(_)
| LogicalOperator::VectorSimilarityScan(_)
| LogicalOperator::ScanNode(_)
| LogicalOperator::ScanRel(_)
| LogicalOperator::CreateNodeTable(_)
| LogicalOperator::CreateRelTable(_)
| LogicalOperator::DropTable(_)
| LogicalOperator::AlterTable(_)
| LogicalOperator::CreateIndex(_)
| LogicalOperator::DropIndex(_)
| LogicalOperator::CreateVectorIndex(_)
| LogicalOperator::CreateSequence(_)
| LogicalOperator::DropSequence(_)
| LogicalOperator::CreateDml(_)
| LogicalOperator::CreateNode(_)
| LogicalOperator::CreateRel(_)
| LogicalOperator::Extend(_)
| LogicalOperator::ExportDatabase(_)
| LogicalOperator::ImportDatabase(_)
| LogicalOperator::CreateFtsIndex(_)
| LogicalOperator::FtsScan(_)
| LogicalOperator::EmptyResult(_)
| LogicalOperator::Insert(_)
| LogicalOperator::ExtensionClause(_) => vec![],
LogicalOperator::MultiplicityReducer(s) => s.children.iter().collect(),
LogicalOperator::Skip(s) => s.children.iter().collect(),
}
}
}
#[derive(Debug, Clone)]
pub struct LogicalArtIndexRangeScan {
pub table_name: String,
pub table_id: u64,
pub alias: Option<String>,
pub lower_bound: Option<akar_common::types::Value>,
pub upper_bound: Option<akar_common::types::Value>,
pub lower_inclusive: bool,
pub upper_inclusive: bool,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalVectorSimilarityScan {
pub index_name: String,
pub index_id: u64,
pub query_vector: Vec<f64>,
pub top_k: u64,
pub table_name: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalScanNode {
pub table_name: String,
pub table_id: u64,
pub alias: Option<String>,
pub columns: Vec<String>,
pub cardinality: u64,
pub fts_query: Option<LogicalFtsScan>,
pub predicate: Option<Expression>,
}
#[derive(Debug, Clone)]
pub struct LogicalScanRel {
pub table_name: String,
pub table_id: u64,
pub direction: akar_parser::ast::EdgeDirection,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalFilter {
pub expression: Expression,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalProjection {
pub expressions: Vec<BoundExpression>,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalHashJoin {
pub join_keys: Vec<Expression>,
pub build_side: Box<LogicalOperator>,
pub probe_side: Box<LogicalOperator>,
pub cardinality: u64,
pub push_down_eligible: bool,
}
#[derive(Debug, Clone)]
pub struct LogicalSemiJoin {
pub join_keys: Vec<Expression>,
pub left: Box<LogicalOperator>,
pub right: Box<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalAntiJoin {
pub join_keys: Vec<Expression>,
pub left: Box<LogicalOperator>,
pub right: Box<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalExplain {
pub inner: Box<LogicalOperator>,
pub explain_type: akar_parser::ast::ExplainType,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCrossProduct {
pub left: Box<LogicalOperator>,
pub right: Box<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalOrderBy {
pub sort_keys: Vec<(Expression, bool)>, pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalTopK {
pub sort_keys: Vec<(Expression, bool)>,
pub limit: u64,
pub offset: u64,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalLimit {
pub limit: u64,
pub offset: u64,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalAggregate {
pub group_by: Vec<Expression>,
pub aggregates: Vec<(String, Vec<Expression>)>, pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalUnion {
pub left: Box<LogicalOperator>,
pub right: Box<LogicalOperator>,
pub all: bool,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalFlatten {
pub group_pos: usize,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalUnwind {
pub expression: akar_parser::ast::Expression,
pub variable: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalIntersect {
pub num_build_sides: u32,
pub build_key_exprs: Vec<Expression>,
pub left: Box<LogicalOperator>,
pub right: Box<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalRecursiveExtend {
pub source_var: String,
pub source_table_id: u64,
pub edge_var: Option<String>,
pub target_var: String,
pub rel_table_ids: Vec<u64>,
pub rel_labels: Vec<String>,
pub lower_bound: u64,
pub upper_bound: u64,
pub direction: akar_common::enums::ExtendDirection,
pub semantic: akar_common::enums::PathSemantic,
pub weight_property: Option<String>,
pub cost_output_name: Option<String>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalOptionalMatch {
pub left: Box<LogicalOperator>,
pub right: Box<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalSet {
pub table_name: String,
pub table_id: u64,
pub column_name: String,
pub column_idx: usize,
pub value: akar_parser::ast::Expression,
pub is_node: bool,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalDelete {
pub table_name: String,
pub table_id: u64,
pub primary_key_column: String,
pub is_node: bool,
pub detach: bool,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCopyFrom {
pub table_name: String,
pub table_id: u64,
pub file_path: String,
pub options: std::collections::HashMap<String, String>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalBatchInsert {
pub table_name: String,
pub table_id: u64,
pub rows: Vec<Vec<akar_common::types::Value>>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalIndexLookup {
pub table_name: String,
pub table_id: u64,
pub key_value: akar_common::types::Value,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalForeach {
pub variable: String,
pub expression: akar_parser::ast::Expression,
pub sub_plans: Vec<Vec<LogicalOperator>>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalTableFunctionCall {
pub function_name: String,
pub args: Vec<akar_parser::ast::Expression>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalStandaloneCall {
pub function_name: String,
pub args: Vec<akar_parser::ast::Expression>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalMerge {
pub table_name: String,
pub table_id: u64,
pub properties: Vec<(String, akar_parser::ast::Expression)>,
pub on_match: Vec<LogicalSet>,
pub on_create: Vec<LogicalSet>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateNodeTable {
pub name: String,
pub columns: Vec<CatalogColumn>,
pub primary_key: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateRelTable {
pub name: String,
pub from: String,
pub to: String,
pub columns: Vec<CatalogColumn>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalDropTable {
pub name: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalAlterTable {
pub table_name: String,
pub action: akar_parser::ast::AlterAction,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateIndex {
pub index_type: akar_catalog::IndexType,
pub index_name: String,
pub table_name: String,
pub column_name: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalDropIndex {
pub index_name: String,
pub table_name: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateVectorIndex {
pub index_name: String,
pub table_name: String,
pub column_name: String,
pub metric: String,
pub dimensions: u64,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateSequence {
pub name: String,
pub if_not_exists: bool,
pub or_replace: bool,
pub start_with: i64,
pub increment: i64,
pub min_value: i64,
pub max_value: i64,
pub cycle: bool,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalDropSequence {
pub name: String,
pub if_exists: bool,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateDml {
pub table_name: String,
pub table_id: u64,
pub properties: Vec<(String, akar_parser::ast::Expression)>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateNode {
pub table_name: String,
pub table_id: u64,
pub out_var_name: String,
pub properties: Vec<(String, akar_parser::ast::Expression)>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalExtend {
pub rel_table_name: String,
pub rel_table_id: u64,
pub bound_node_var: String,
pub direction: akar_parser::ast::EdgeDirection,
pub dst_node_var: String,
pub dst_table_name: String,
pub dst_table_id: u64,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateRel {
pub table_name: String,
pub table_id: u64,
pub src_node_name: String,
pub dst_node_name: String,
pub properties: Vec<(String, akar_parser::ast::Expression)>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalExportDatabase {
pub file_path: String,
pub file_type: String,
pub schema_only: bool,
pub options: std::collections::HashMap<String, String>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalImportDatabase {
pub file_path: String,
pub query: String,
pub index_query: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalCreateFtsIndex {
pub index_name: String,
pub table_name: String,
pub column_name: String,
pub if_not_exists: bool,
pub docs_table: String,
pub terms_table: String,
pub posting_table: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalFtsScan {
pub index_name: String,
pub query_string: String,
pub docs_table: String,
pub terms_table: String,
pub posting_table: String,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalEmptyResult {
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalMultiplicityReducer {
pub key_columns: Vec<usize>,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalSkip {
pub offset: u64,
pub children: Vec<LogicalOperator>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalInsert {
pub table_name: String,
pub table_id: u64,
pub columns: Vec<String>,
pub values: Vec<Vec<akar_common::types::Value>>,
pub cardinality: u64,
}
#[derive(Debug, Clone)]
pub struct LogicalExtensionClause {
pub action: akar_parser::ast::ExtensionAction,
pub extension_name: String,
pub cardinality: u64,
}