use std::path::Path;
#[cfg(not(feature = "entropyfs-store"))]
use crate::error::Error;
use crate::error::Result;
use crate::limits::Limits;
use crate::store::IoSnapshot;
use super::observe::{ModelMemo, ObserveRequest, ObserveStats, observe_with_field_memo};
use super::promote::PromotePolicy;
use super::provenance::FieldAnswer;
use super::{Field, FieldId, FieldStore};
pub const DEFAULT_MODEL_MEMO_BYTES: u64 = 64 * 1024 * 1024;
#[derive(Debug, Clone, Copy)]
pub struct SessionOptions {
pub entropyfs: bool,
pub model_memo_bytes: u64,
pub promote: PromotePolicy,
}
impl Default for SessionOptions {
fn default() -> Self {
SessionOptions {
entropyfs: false,
model_memo_bytes: DEFAULT_MODEL_MEMO_BYTES,
promote: PromotePolicy::default(),
}
}
}
pub struct DocumentFieldSession {
store: FieldStore,
field: Field,
field_id: FieldId,
models: ModelMemo,
pending_open_io: Option<IoSnapshot>,
}
impl DocumentFieldSession {
pub fn open(store_dir: &Path, field_hex: &str, opts: SessionOptions) -> Result<Self> {
let mut store = if opts.entropyfs {
#[cfg(feature = "entropyfs-store")]
{
FieldStore::open_entropyfs(store_dir)?
}
#[cfg(not(feature = "entropyfs-store"))]
{
return Err(Error::unsupported_feature(
"--entropyfs requires a build with the entropyfs-store feature",
));
}
} else {
FieldStore::open(store_dir)?
};
store.set_promote(opts.promote);
let field_id = FieldId::from_hex(field_hex)?;
let field = Field::open(&store, &field_id, Limits::DEFAULT)?;
let open_io = field.open_io();
Ok(Self {
store,
field,
field_id,
models: ModelMemo::with_budget(opts.model_memo_bytes),
pending_open_io: Some(open_io),
})
}
pub fn field_id(&self) -> FieldId {
self.field_id
}
pub fn observe(
&mut self,
req: &ObserveRequest,
limits: Limits,
) -> Result<(FieldAnswer, ObserveStats, FieldId)> {
let open_io = self.pending_open_io.take().unwrap_or_default();
observe_with_field_memo(
&mut self.store,
&self.field,
open_io,
req,
limits,
self.models.clone(),
)
}
pub fn observe_batch(
&mut self,
reqs: &[ObserveRequest],
limits: Limits,
) -> Vec<Result<(FieldAnswer, ObserveStats, FieldId)>> {
reqs.iter().map(|r| self.observe(r, limits)).collect()
}
pub fn sync(&self) -> Result<()> {
self.store.sync()
}
}