pub mod ast_query;
pub mod atomic_memory;
pub mod batch;
pub mod checkpoint;
pub mod column_access;
pub mod connection;
pub mod context_query;
pub mod crud;
pub mod error;
pub mod format;
pub mod graph;
pub mod path_query;
pub mod policy;
pub mod query;
pub mod queue; pub mod recovery;
pub mod result;
pub mod routing;
pub mod schema;
pub mod semantic_cache;
pub mod storage;
pub mod temporal_graph;
pub mod trace;
pub mod transaction;
pub mod vectors;
pub mod sql_entry; pub mod wal_atomic; pub mod intent_recovery;
use crate::error::Result;
pub trait ConnectionTrait {
fn put(&self, key: &[u8], value: &[u8]) -> Result<()>;
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
fn delete(&self, key: &[u8]) -> Result<()>;
fn scan(&self, prefix: &[u8]) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
}
pub use connection::DurableConnection;
pub type Connection = DurableConnection;
pub type Database = DurableConnection;
pub use connection::SochConnection;
pub type InMemoryConnection = SochConnection;
pub use batch::{BatchOp, BatchResult, BatchWriter};
pub use column_access::{ColumnView, TypedColumn};
#[cfg(feature = "embedded")]
pub use connection::EmbeddedConnection;
pub use connection::{
ConnectionConfig, ConnectionModeClient, DurableStats,
ReadOnlyConnection, ReadableConnection, RecoveryResult,
SyncModeClient, WritableConnection
};
pub use context_query::{ContextQueryBuilder, ContextQueryResult, SectionBuilder, SectionContent};
pub use crud::{DeleteResult, InsertResult, RowBuilder, UpdateResult};
pub use format::{CanonicalFormat, ContextFormat, FormatCapabilities, FormatConversionError, WireFormat};
pub use path_query::PathQuery;
pub use result::{ResultMetrics, SochResult};
pub use schema::{SchemaBuilder, TableDescription};
pub use transaction::{ClientTransaction, IsolationLevel, SnapshotReader};
pub use vectors::{SearchResult, VectorCollection};
pub use atomic_memory::{AtomicMemoryWriter, AtomicWriteResult, MemoryOp, MemoryWriteBuilder};
pub use checkpoint::{Checkpoint, CheckpointMeta, CheckpointStore, DefaultCheckpointStore, RunMetadata, RunStatus, WorkflowEvent};
pub use trace::{TraceRun, TraceSpan, TraceStore, TraceValue, SpanKind, SpanStatusCode};
pub use policy::{CompiledPolicySet, EvaluationResult, PolicyOutcome, PolicyRule};
#[allow(deprecated)]
pub use batch::{GroupCommitBuffer, GroupCommitConfig};
pub use error::ClientError;
pub use query::{QueryExecutor, QueryResult};
pub use recovery::{CheckpointResult, RecoveryManager, RecoveryStatus, WalVerificationResult};
pub use sochdb_storage::ColumnarQueryResult;
use std::path::Path;
use std::sync::Arc;
pub struct SochClient {
connection: Arc<SochConnection>,
config: ClientConfig,
}
#[derive(Debug, Clone)]
pub struct ClientConfig {
pub token_budget: Option<usize>,
pub streaming: bool,
pub output_format: OutputFormat,
pub pool_size: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputFormat {
Soch,
Json,
Columnar,
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
token_budget: None,
streaming: false,
output_format: OutputFormat::Soch,
pool_size: 10,
}
}
}
impl SochClient {
pub fn open(path: impl AsRef<Path>) -> Result<Self> {
let connection = SochConnection::open(path)?;
Ok(Self {
connection: Arc::new(connection),
config: ClientConfig::default(),
})
}
pub fn open_with_config(
path: impl AsRef<Path>,
config: ClientConfig,
) -> Result<Self> {
let connection = SochConnection::open(path)?;
Ok(Self {
connection: Arc::new(connection),
config,
})
}
pub fn with_token_budget(mut self, budget: usize) -> Self {
self.config.token_budget = Some(budget);
self
}
pub fn query(&self, path: &str) -> PathQuery<'_> {
PathQuery::from_path(&self.connection, path)
}
pub fn vectors(&self, name: &str) -> Result<VectorCollection> {
VectorCollection::open(&self.connection, name)
}
pub fn begin(&self) -> Result<ClientTransaction<'_>> {
ClientTransaction::begin(&self.connection, IsolationLevel::SnapshotIsolation)
}
pub fn begin_with_isolation(
&self,
isolation: IsolationLevel,
) -> Result<ClientTransaction<'_>> {
ClientTransaction::begin(&self.connection, isolation)
}
pub fn snapshot(&self) -> Result<SnapshotReader<'_>> {
SnapshotReader::now(&self.connection)
}
pub fn execute(&self, sql: &str) -> Result<QueryResult> {
self.connection.query_ast(sql)
}
pub fn connection(&self) -> &SochConnection {
&self.connection
}
pub fn stats(&self) -> ClientStats {
self.connection.stats()
}
pub fn token_budget(&self) -> Option<usize> {
self.config.token_budget
}
pub fn output_format(&self) -> OutputFormat {
self.config.output_format
}
}
#[cfg(feature = "embedded")]
pub struct DurableSochClient {
connection: Arc<EmbeddedConnection>,
config: ClientConfig,
}
#[cfg(feature = "embedded")]
impl DurableSochClient {
pub fn open(path: impl AsRef<Path>) -> Result<Self> {
let connection = EmbeddedConnection::open(path)?;
Ok(Self {
connection: Arc::new(connection),
config: ClientConfig::default(),
})
}
pub fn from_connection(connection: Arc<EmbeddedConnection>) -> Self {
Self {
connection,
config: ClientConfig::default(),
}
}
pub fn open_with_config(
path: impl AsRef<Path>,
config: ClientConfig,
db_config: sochdb_storage::database::DatabaseConfig,
) -> Result<Self> {
let connection = EmbeddedConnection::open_with_config(path, db_config)?;
Ok(Self {
connection: Arc::new(connection),
config,
})
}
pub fn with_token_budget(mut self, budget: usize) -> Self {
self.config.token_budget = Some(budget);
self
}
pub fn begin(&self) -> Result<()> {
self.connection.begin()
}
pub fn commit(&self) -> Result<u64> {
self.connection.commit()
}
pub fn abort(&self) -> Result<()> {
self.connection.abort()
}
pub fn put(&self, path: &str, value: &[u8]) -> Result<()> {
self.connection.put(path, value)
}
pub fn get(&self, path: &str) -> Result<Option<Vec<u8>>> {
self.connection.get(path)
}
pub fn delete(&self, path: &str) -> Result<()> {
self.connection.delete(path)
}
pub fn scan(&self, prefix: &str) -> Result<Vec<(String, Vec<u8>)>> {
self.connection.scan(prefix)
}
pub fn stats(&self) -> ClientStats {
self.connection.stats()
}
pub fn fsync(&self) -> Result<()> {
self.connection.fsync()
}
pub fn connection(&self) -> &EmbeddedConnection {
&self.connection
}
pub fn token_budget(&self) -> Option<usize> {
self.config.token_budget
}
pub fn output_format(&self) -> OutputFormat {
self.config.output_format
}
}
#[derive(Debug, Clone)]
pub struct ClientStats {
pub queries_executed: u64,
pub soch_tokens_emitted: u64,
pub json_tokens_equivalent: u64,
pub token_savings_percent: f64,
pub cache_hit_rate: f64,
}
pub mod prelude {
#[cfg(feature = "embedded")]
pub use crate::DurableSochClient;
pub use crate::path_query::CompareOp;
pub use crate::{
ClientConfig,
ClientError,
ClientStats,
ClientTransaction,
Connection,
DeleteResult,
DurableConnection,
InMemoryConnection,
InsertResult,
IsolationLevel,
OutputFormat,
PathQuery,
ResultMetrics,
RowBuilder,
SchemaBuilder,
SearchResult,
SnapshotReader,
TableDescription,
SochClient,
SochResult,
UpdateResult,
VectorCollection,
};
pub use sochdb_core::soch::{SochType, SochValue};
pub use crate::queue::{
DequeueResult, MultiColumnTopK, OrderByLimitStrategy, PriorityQueue, QueueConfig,
QueueKey, QueueStats, StreamingTopK, Task, TaskState,
};
}