//! Physical operators for a small query-plan executor. //! //! Three operators are in scope: //! //! - [`atom::scan_atom`] scans a [`Table`](query_storage::table::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))`. //! //! Foundational types [`Value`](query_storage::value::Value) and //! [`Table`](query_storage::table::Table) live in `query-storage`, the //! storage-layer crate this crate is built on; storage backends produce //! `Table`s that operators here consume. pub mod atom; pub mod join; pub mod relation;