diff --git a/Cargo.lock b/Cargo.lock index 0d052cb..7b88ca3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -976,6 +976,9 @@ dependencies = [ [[package]] name = "query-ops" version = "0.1.0" +dependencies = [ + "query-storage", +] [[package]] name = "query-storage" @@ -984,7 +987,6 @@ dependencies = [ "fjall", "geomerge", "heed", - "query-ops", "redb", "sled", "tempfile", diff --git a/crates/query-ops/Cargo.toml b/crates/query-ops/Cargo.toml index b97a926..6d201ae 100644 --- a/crates/query-ops/Cargo.toml +++ b/crates/query-ops/Cargo.toml @@ -9,3 +9,4 @@ rust-version.workspace = true workspace = true [dependencies] +query-storage = { path = "../query-storage" } diff --git a/crates/query-ops/src/atom.rs b/crates/query-ops/src/atom.rs index edfa9e9..e202f90 100644 --- a/crates/query-ops/src/atom.rs +++ b/crates/query-ops/src/atom.rs @@ -9,7 +9,10 @@ use std::collections::HashMap; -use crate::{relation::Relation, table::Table, value::Value}; +use query_storage::table::Table; +use query_storage::value::Value; + +use crate::relation::Relation; #[derive(Debug, Clone, PartialEq, Eq)] pub enum Term { diff --git a/crates/query-ops/src/join.rs b/crates/query-ops/src/join.rs index 384baae..425c6f9 100644 --- a/crates/query-ops/src/join.rs +++ b/crates/query-ops/src/join.rs @@ -11,7 +11,9 @@ use std::collections::{HashMap, HashSet}; -use crate::{relation::Relation, value::Value}; +use query_storage::value::Value; + +use crate::relation::Relation; fn shared_columns(left: &Relation, right: &Relation) -> Vec<(usize, usize)> { left.columns diff --git a/crates/query-ops/src/lib.rs b/crates/query-ops/src/lib.rs index f92d6b1..995f5b7 100644 --- a/crates/query-ops/src/lib.rs +++ b/crates/query-ops/src/lib.rs @@ -2,8 +2,8 @@ //! //! Three operators are in scope: //! -//! - [`atom::scan_atom`] scans a [`table::Table`] under an -//! [`atom::AtomPattern`], filtering for repeated-variable equality and +//! - [`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. @@ -14,10 +14,11 @@ //! is just an expression like //! `natural_join(&semijoin(&a, &b), &scan_atom(&t, &p))`. //! -//! Integration with an external query-plan IR is out of scope. +//! 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; -pub mod table; -pub mod value; diff --git a/crates/query-ops/src/relation.rs b/crates/query-ops/src/relation.rs index e2b75ca..1c32565 100644 --- a/crates/query-ops/src/relation.rs +++ b/crates/query-ops/src/relation.rs @@ -10,7 +10,7 @@ use std::collections::HashSet; -use crate::value::Value; +use query_storage::value::Value; #[derive(Debug, Clone)] pub struct Relation { diff --git a/crates/query-ops/tests/hand_plan.rs b/crates/query-ops/tests/hand_plan.rs index f08b402..082e189 100644 --- a/crates/query-ops/tests/hand_plan.rs +++ b/crates/query-ops/tests/hand_plan.rs @@ -15,8 +15,8 @@ use query_ops::atom::{AtomPattern, Term, scan_atom}; use query_ops::join::{natural_join, semijoin}; -use query_ops::table::Table; -use query_ops::value::Value; +use query_storage::table::Table; +use query_storage::value::Value; fn s(x: &str) -> Value { Value::Str(x.to_string()) diff --git a/crates/query-storage/tests/integration.rs b/crates/query-ops/tests/storage_bridge.rs similarity index 94% rename from crates/query-storage/tests/integration.rs rename to crates/query-ops/tests/storage_bridge.rs index dca2878..90ce75b 100644 --- a/crates/query-storage/tests/integration.rs +++ b/crates/query-ops/tests/storage_bridge.rs @@ -5,8 +5,8 @@ //! through the [`scan_as_table`] bridge, with no changes to `query-ops` itself. use query_ops::atom::{AtomPattern, Term, scan_atom}; -use query_ops::table::Table; -use query_ops::value::Value; +use query_storage::table::Table; +use query_storage::value::Value; use query_storage::{MemoryStorage, Storage, StorageError, scan_as_table}; fn i(x: i64) -> Value { diff --git a/crates/query-storage/Cargo.toml b/crates/query-storage/Cargo.toml index 8b837b6..8f60f10 100644 --- a/crates/query-storage/Cargo.toml +++ b/crates/query-storage/Cargo.toml @@ -20,7 +20,6 @@ sled = ["dep:sled"] geomerge = ["dep:geomerge"] [dependencies] -query-ops = { path = "../query-ops" } heed = { version = "0.20", optional = true } redb = { version = "2", optional = true } fjall = { version = "2", optional = true } diff --git a/crates/query-storage/src/codec.rs b/crates/query-storage/src/codec.rs index cfd99cd..8b3352d 100644 --- a/crates/query-storage/src/codec.rs +++ b/crates/query-storage/src/codec.rs @@ -28,7 +28,7 @@ //! //! Per-relation metadata is `[arity: u32 LE] [next_id: u64 LE]` = 12 bytes. -use query_ops::value::Value; +use crate::value::Value; /// Errors raised by [`decode_row`] and [`decode_meta`]. #[derive(Debug)] diff --git a/crates/query-storage/src/fjall.rs b/crates/query-storage/src/fjall.rs index 6f97a31..f46c0ea 100644 --- a/crates/query-storage/src/fjall.rs +++ b/crates/query-storage/src/fjall.rs @@ -6,7 +6,7 @@ use fjall::{Keyspace, PartitionCreateOptions, PartitionHandle}; -use query_ops::value::Value; +use crate::value::Value; use crate::codec::{decode_meta, decode_row, encode_meta, encode_row, row_key}; use crate::{Storage, StorageError}; diff --git a/crates/query-storage/src/geomerge.rs b/crates/query-storage/src/geomerge.rs index 77f638d..d3e1e32 100644 --- a/crates/query-storage/src/geomerge.rs +++ b/crates/query-storage/src/geomerge.rs @@ -25,7 +25,7 @@ use geomerge::store::Store; use geomerge::table::CellValue; use geomerge::txn::ops::TxnCellValue; -use query_ops::value::Value; +use crate::value::Value; use crate::{Storage, StorageError}; diff --git a/crates/query-storage/src/lib.rs b/crates/query-storage/src/lib.rs index 9b978c5..56c514e 100644 --- a/crates/query-storage/src/lib.rs +++ b/crates/query-storage/src/lib.rs @@ -1,15 +1,14 @@ -//! Storage backend abstraction for the query-plan playground. +//! Storage layer for the query-plan playground. //! -//! Operators in [`query_ops`] work over in-memory [`Table`](query_ops::table::Table) -//! and [`Relation`](query_ops::relation::Relation) values. This crate adds a -//! [`Storage`] trait so the input tables can come from a backend (an -//! in-memory [`MemoryStorage`], an LMDB environment, a `geomerge` store, and -//! so on) instead of being built by hand in every test. +//! This is the foundational crate of the workspace. It owns the [`Value`] cell +//! type and the [`Table`] container, defines the [`Storage`] trait, and ships +//! adapters for several backends behind Cargo features. Higher-level crates +//! such as `query-ops` depend on this crate for both the types and the trait. //! -//! The v1 surface is deliberately narrow: create a relation, scan all rows, -//! insert a row, ask for arity. Transactions, range scans, deletes, and delta -//! streams are not modeled yet, and will be added when a specific experiment -//! demands them. +//! The v1 trait surface is deliberately narrow: create a relation, scan all +//! rows, insert a row, ask for arity. Transactions, range scans, deletes, and +//! delta streams are not modeled yet, and will be added when a specific +//! experiment demands them. //! //! ## Backends //! @@ -22,11 +21,13 @@ //! - `sled` — pure-Rust LSM-tree //! - `geomerge` — the workspace's `geomerge` crate -use query_ops::table::Table; -use query_ops::value::Value; +use crate::table::Table; +use crate::value::Value; pub mod codec; pub mod memory; +pub mod table; +pub mod value; #[cfg(feature = "sled")] pub mod sled; @@ -133,7 +134,7 @@ pub trait Storage { } /// Materialize a relation from a [`Storage`] backend as a [`Table`] that -/// [`scan_atom`](query_ops::atom::scan_atom) can consume. +/// query-language operators can consume. /// /// # Errors /// Returns any error produced by [`Storage::arity`] or [`Storage::scan`]. diff --git a/crates/query-storage/src/lmdb.rs b/crates/query-storage/src/lmdb.rs index 2405a02..45e3956 100644 --- a/crates/query-storage/src/lmdb.rs +++ b/crates/query-storage/src/lmdb.rs @@ -11,7 +11,7 @@ use heed::types::Bytes; use heed::{Database, Env, EnvOpenOptions}; -use query_ops::value::Value; +use crate::value::Value; use crate::codec::{decode_meta, decode_row, encode_meta, encode_row, row_key}; use crate::{Storage, StorageError}; diff --git a/crates/query-storage/src/memory.rs b/crates/query-storage/src/memory.rs index a3294cf..8cd96d8 100644 --- a/crates/query-storage/src/memory.rs +++ b/crates/query-storage/src/memory.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; -use query_ops::value::Value; +use crate::value::Value; use crate::{Storage, StorageError}; diff --git a/crates/query-storage/src/redb.rs b/crates/query-storage/src/redb.rs index cc1784a..2f7b05e 100644 --- a/crates/query-storage/src/redb.rs +++ b/crates/query-storage/src/redb.rs @@ -6,7 +6,7 @@ use redb::{Database, ReadableTable, TableDefinition}; -use query_ops::value::Value; +use crate::value::Value; use crate::codec::{decode_meta, decode_row, encode_meta, encode_row}; use crate::{Storage, StorageError}; diff --git a/crates/query-storage/src/sled.rs b/crates/query-storage/src/sled.rs index 421121a..0f2ae8c 100644 --- a/crates/query-storage/src/sled.rs +++ b/crates/query-storage/src/sled.rs @@ -4,7 +4,7 @@ //! reserved tree named `__meta` carries per-relation metadata (arity and the //! next synthetic row ID). -use query_ops::value::Value; +use crate::value::Value; use crate::codec::{decode_meta, decode_row, encode_meta, encode_row, row_key}; use crate::{Storage, StorageError}; diff --git a/crates/query-ops/src/table.rs b/crates/query-storage/src/table.rs similarity index 100% rename from crates/query-ops/src/table.rs rename to crates/query-storage/src/table.rs diff --git a/crates/query-ops/src/value.rs b/crates/query-storage/src/value.rs similarity index 100% rename from crates/query-ops/src/value.rs rename to crates/query-storage/src/value.rs