kmb-query: SQL query layer for Kimberlite projections
This crate provides a minimal SQL query engine for compliance lookups against the projection store.
SQL Subset
Supported SQL features:
SELECTwith column list or*FROMsingle tableWHEREwith comparison predicates (=,<,>,<=,>=,IN)ORDER BY(ascending/descending)LIMIT- Parameterized queries (
$1,$2, ...)
Intentionally unsupported:
JOIN(queries are single-table only)- Subqueries
- Aggregations (
COUNT,SUM, etc.) GROUP BY,HAVINGDISTINCT
Usage
use kimberlite_query::{QueryEngine, Schema, SchemaBuilder, ColumnDef, DataType, Value};
use kimberlite_store::{BTreeStore, TableId};
// Define schema
let schema = SchemaBuilder::new()
.table(
"users",
TableId::new(1),
vec![
ColumnDef::new("id", DataType::BigInt).not_null(),
ColumnDef::new("name", DataType::Text).not_null(),
],
vec!["id".into()],
)
.build();
// Create engine
let engine = QueryEngine::new(schema);
// Execute query
let mut store = BTreeStore::open("data/projections")?;
let result = engine.query(&mut store, "SELECT * FROM users WHERE id = $1", &[Value::BigInt(42)])?;
Point-in-Time Queries
For compliance, you can query at a specific log position:
let result = engine.query_at(
&mut store,
"SELECT * FROM users WHERE id = 1",
&[],
Offset::new(1000), // Query state as of log position 1000
)?;