#[macro_use]
mod common;
mod aggregate;
mod cross;
mod extension;
mod fetch;
mod filter;
mod join;
mod project;
mod read;
mod set;
mod sort;
use crate::input::proto::substrait;
use crate::input::traits::ProtoOneOf;
use crate::output::diagnostic;
use crate::parse::context;
fn parse_rel_type(x: &substrait::rel::RelType, y: &mut context::Context) -> diagnostic::Result<()> {
y.clear_schema();
describe!(y, Relation, "{} relation", x.proto_oneof_variant());
match x {
substrait::rel::RelType::Read(x) => read::parse_read_rel(x, y),
substrait::rel::RelType::Filter(x) => filter::parse_filter_rel(x, y),
substrait::rel::RelType::Fetch(x) => fetch::parse_fetch_rel(x, y),
substrait::rel::RelType::Aggregate(x) => aggregate::parse_aggregate_rel(x, y),
substrait::rel::RelType::Sort(x) => sort::parse_sort_rel(x, y),
substrait::rel::RelType::Join(x) => join::parse_join_rel(x, y),
substrait::rel::RelType::Project(x) => project::parse_project_rel(x, y),
substrait::rel::RelType::Set(x) => set::parse_set_rel(x, y),
substrait::rel::RelType::ExtensionSingle(x) => extension::parse_extension_single_rel(x, y),
substrait::rel::RelType::ExtensionMulti(x) => extension::parse_extension_multi_rel(x, y),
substrait::rel::RelType::ExtensionLeaf(x) => extension::parse_extension_leaf_rel(x, y),
substrait::rel::RelType::Cross(x) => cross::parse_cross_rel(x, y),
substrait::rel::RelType::Reference(_)
| substrait::rel::RelType::Write(_)
| substrait::rel::RelType::Ddl(_)
| substrait::rel::RelType::HashJoin(_)
| substrait::rel::RelType::MergeJoin(_)
| substrait::rel::RelType::NestedLoopJoin(_)
| substrait::rel::RelType::Window(_)
| substrait::rel::RelType::Exchange(_)
| substrait::rel::RelType::Expand(_) => {
diagnostic!(
y,
Warning,
NotYetImplemented,
"Unimplemented relation type {}",
x.proto_oneof_variant()
);
Ok(())
} }
}
pub fn parse_rel(x: &substrait::Rel, y: &mut context::Context) -> diagnostic::Result<()> {
let schema = proto_required_field!(x, y, rel_type, parse_rel_type)
.0
.data_type();
y.set_schema(schema);
Ok(())
}