Use query-storage for storage access in other crates
This commit is contained in:
parent
ed8c438135
commit
b572161142
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -976,6 +976,9 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "query-ops"
|
name = "query-ops"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"query-storage",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "query-storage"
|
name = "query-storage"
|
||||||
@ -984,7 +987,6 @@ dependencies = [
|
|||||||
"fjall",
|
"fjall",
|
||||||
"geomerge",
|
"geomerge",
|
||||||
"heed",
|
"heed",
|
||||||
"query-ops",
|
|
||||||
"redb",
|
"redb",
|
||||||
"sled",
|
"sled",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
|
|||||||
@ -9,3 +9,4 @@ rust-version.workspace = true
|
|||||||
workspace = true
|
workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
query-storage = { path = "../query-storage" }
|
||||||
|
|||||||
@ -9,7 +9,10 @@
|
|||||||
|
|
||||||
use std::collections::HashMap;
|
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)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum Term {
|
pub enum Term {
|
||||||
|
|||||||
@ -11,7 +11,9 @@
|
|||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
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)> {
|
fn shared_columns(left: &Relation, right: &Relation) -> Vec<(usize, usize)> {
|
||||||
left.columns
|
left.columns
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
//!
|
//!
|
||||||
//! Three operators are in scope:
|
//! Three operators are in scope:
|
||||||
//!
|
//!
|
||||||
//! - [`atom::scan_atom`] scans a [`table::Table`] under an
|
//! - [`atom::scan_atom`] scans a [`Table`](query_storage::table::Table) under
|
||||||
//! [`atom::AtomPattern`], filtering for repeated-variable equality and
|
//! an [`atom::AtomPattern`], filtering for repeated-variable equality and
|
||||||
//! literal equality, and outputs a binding [`relation::Relation`].
|
//! literal equality, and outputs a binding [`relation::Relation`].
|
||||||
//! - [`join::semijoin`] keeps rows of one relation whose shared-column values
|
//! - [`join::semijoin`] keeps rows of one relation whose shared-column values
|
||||||
//! appear in another.
|
//! appear in another.
|
||||||
@ -14,10 +14,11 @@
|
|||||||
//! is just an expression like
|
//! is just an expression like
|
||||||
//! `natural_join(&semijoin(&a, &b), &scan_atom(&t, &p))`.
|
//! `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 atom;
|
||||||
pub mod join;
|
pub mod join;
|
||||||
pub mod relation;
|
pub mod relation;
|
||||||
pub mod table;
|
|
||||||
pub mod value;
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use crate::value::Value;
|
use query_storage::value::Value;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Relation {
|
pub struct Relation {
|
||||||
|
|||||||
@ -15,8 +15,8 @@
|
|||||||
|
|
||||||
use query_ops::atom::{AtomPattern, Term, scan_atom};
|
use query_ops::atom::{AtomPattern, Term, scan_atom};
|
||||||
use query_ops::join::{natural_join, semijoin};
|
use query_ops::join::{natural_join, semijoin};
|
||||||
use query_ops::table::Table;
|
use query_storage::table::Table;
|
||||||
use query_ops::value::Value;
|
use query_storage::value::Value;
|
||||||
|
|
||||||
fn s(x: &str) -> Value {
|
fn s(x: &str) -> Value {
|
||||||
Value::Str(x.to_string())
|
Value::Str(x.to_string())
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
//! through the [`scan_as_table`] bridge, with no changes to `query-ops` itself.
|
//! through the [`scan_as_table`] bridge, with no changes to `query-ops` itself.
|
||||||
|
|
||||||
use query_ops::atom::{AtomPattern, Term, scan_atom};
|
use query_ops::atom::{AtomPattern, Term, scan_atom};
|
||||||
use query_ops::table::Table;
|
use query_storage::table::Table;
|
||||||
use query_ops::value::Value;
|
use query_storage::value::Value;
|
||||||
use query_storage::{MemoryStorage, Storage, StorageError, scan_as_table};
|
use query_storage::{MemoryStorage, Storage, StorageError, scan_as_table};
|
||||||
|
|
||||||
fn i(x: i64) -> Value {
|
fn i(x: i64) -> Value {
|
||||||
@ -20,7 +20,6 @@ sled = ["dep:sled"]
|
|||||||
geomerge = ["dep:geomerge"]
|
geomerge = ["dep:geomerge"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
query-ops = { path = "../query-ops" }
|
|
||||||
heed = { version = "0.20", optional = true }
|
heed = { version = "0.20", optional = true }
|
||||||
redb = { version = "2", optional = true }
|
redb = { version = "2", optional = true }
|
||||||
fjall = { version = "2", optional = true }
|
fjall = { version = "2", optional = true }
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
//!
|
//!
|
||||||
//! Per-relation metadata is `[arity: u32 LE] [next_id: u64 LE]` = 12 bytes.
|
//! 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`].
|
/// Errors raised by [`decode_row`] and [`decode_meta`].
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
use fjall::{Keyspace, PartitionCreateOptions, PartitionHandle};
|
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::codec::{decode_meta, decode_row, encode_meta, encode_row, row_key};
|
||||||
use crate::{Storage, StorageError};
|
use crate::{Storage, StorageError};
|
||||||
|
|||||||
@ -25,7 +25,7 @@ use geomerge::store::Store;
|
|||||||
use geomerge::table::CellValue;
|
use geomerge::table::CellValue;
|
||||||
use geomerge::txn::ops::TxnCellValue;
|
use geomerge::txn::ops::TxnCellValue;
|
||||||
|
|
||||||
use query_ops::value::Value;
|
use crate::value::Value;
|
||||||
|
|
||||||
use crate::{Storage, StorageError};
|
use crate::{Storage, StorageError};
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
//! This is the foundational crate of the workspace. It owns the [`Value`] cell
|
||||||
//! and [`Relation`](query_ops::relation::Relation) values. This crate adds a
|
//! type and the [`Table`] container, defines the [`Storage`] trait, and ships
|
||||||
//! [`Storage`] trait so the input tables can come from a backend (an
|
//! adapters for several backends behind Cargo features. Higher-level crates
|
||||||
//! in-memory [`MemoryStorage`], an LMDB environment, a `geomerge` store, and
|
//! such as `query-ops` depend on this crate for both the types and the trait.
|
||||||
//! so on) instead of being built by hand in every test.
|
|
||||||
//!
|
//!
|
||||||
//! The v1 surface is deliberately narrow: create a relation, scan all rows,
|
//! The v1 trait surface is deliberately narrow: create a relation, scan all
|
||||||
//! insert a row, ask for arity. Transactions, range scans, deletes, and delta
|
//! rows, insert a row, ask for arity. Transactions, range scans, deletes, and
|
||||||
//! streams are not modeled yet, and will be added when a specific experiment
|
//! delta streams are not modeled yet, and will be added when a specific
|
||||||
//! demands them.
|
//! experiment demands them.
|
||||||
//!
|
//!
|
||||||
//! ## Backends
|
//! ## Backends
|
||||||
//!
|
//!
|
||||||
@ -22,11 +21,13 @@
|
|||||||
//! - `sled` — pure-Rust LSM-tree
|
//! - `sled` — pure-Rust LSM-tree
|
||||||
//! - `geomerge` — the workspace's `geomerge` crate
|
//! - `geomerge` — the workspace's `geomerge` crate
|
||||||
|
|
||||||
use query_ops::table::Table;
|
use crate::table::Table;
|
||||||
use query_ops::value::Value;
|
use crate::value::Value;
|
||||||
|
|
||||||
pub mod codec;
|
pub mod codec;
|
||||||
pub mod memory;
|
pub mod memory;
|
||||||
|
pub mod table;
|
||||||
|
pub mod value;
|
||||||
|
|
||||||
#[cfg(feature = "sled")]
|
#[cfg(feature = "sled")]
|
||||||
pub mod sled;
|
pub mod sled;
|
||||||
@ -133,7 +134,7 @@ pub trait Storage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Materialize a relation from a [`Storage`] backend as a [`Table`] that
|
/// 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
|
/// # Errors
|
||||||
/// Returns any error produced by [`Storage::arity`] or [`Storage::scan`].
|
/// Returns any error produced by [`Storage::arity`] or [`Storage::scan`].
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
use heed::types::Bytes;
|
use heed::types::Bytes;
|
||||||
use heed::{Database, Env, EnvOpenOptions};
|
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::codec::{decode_meta, decode_row, encode_meta, encode_row, row_key};
|
||||||
use crate::{Storage, StorageError};
|
use crate::{Storage, StorageError};
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use query_ops::value::Value;
|
use crate::value::Value;
|
||||||
|
|
||||||
use crate::{Storage, StorageError};
|
use crate::{Storage, StorageError};
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
use redb::{Database, ReadableTable, TableDefinition};
|
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::codec::{decode_meta, decode_row, encode_meta, encode_row};
|
||||||
use crate::{Storage, StorageError};
|
use crate::{Storage, StorageError};
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
//! reserved tree named `__meta` carries per-relation metadata (arity and the
|
//! reserved tree named `__meta` carries per-relation metadata (arity and the
|
||||||
//! next synthetic row ID).
|
//! 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::codec::{decode_meta, decode_row, encode_meta, encode_row, row_key};
|
||||||
use crate::{Storage, StorageError};
|
use crate::{Storage, StorageError};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user