//! Physical operators for a small query-plan executor. //! //! Three operators are in scope: //! //! - [`atom::scan_atom`] scans a [`Table`] under an [`atom::AtomPattern`], //! filtering for repeated-variable equality and literal equality, and //! outputs a binding [`relation::Relation`]. //! - [`join::semijoin`] keeps rows of one relation whose shared-column values //! appear in another. //! - [`join::natural_join`] combines rows that agree on shared columns, //! emitting the union of their columns. //! //! Operators compose by function application; a "query plan written by hand" //! is just an expression like //! `natural_join(&semijoin(&a, &b), &scan_atom(&t, &p))`. //! //! `Value` and `Table` live in the `storage` crate; consumers that build //! inputs depend on `storage` directly. pub mod atom; pub mod join; pub mod relation;