Skip to main content

TimeSeriesTable

Struct TimeSeriesTable 

Source
pub struct TimeSeriesTable { /* private fields */ }
Expand description

High-level time-series table handle.

This is the main entry point for callers. It bundles:

  • where the table is,
  • how to talk to the transaction log,
  • what the current committed state is,
  • and the extracted time index spec.

Implementations§

Source§

impl TimeSeriesTable

Source

pub async fn append_parquet_segment( &mut self, relative_path: &str, ) -> Result<u64, TableError>

Append a Parquet segment using its canonical relative path as identity.

Rows need not be ordered by the table’s ordered index.

Source

pub async fn append_parquet_from_path( &mut self, parquet_path: &Path, ) -> Result<(u64, String), TableError>

Copy an external Parquet file into the table when needed and append it.

Rows need not be ordered by the table’s ordered index.

A copy created by this operation is removed when append fails before publication. Files already under the table root and copies involved in an ambiguous commit outcome are preserved. Returns the committed version and normalized table-relative segment path.

Source

pub async fn append_parquet_from_path_with_report( &mut self, parquet_path: &Path, ) -> Result<(u64, String, AppendReport), TableError>

Copy and append a Parquet file while collecting a profiling report. Returns the committed version, normalized table-relative path, and report.

Source

pub async fn append_parquet_segment_with_report( &mut self, relative_path: &str, ) -> Result<(u64, AppendReport), TableError>

Append a Parquet segment and return a profiling report.

Source§

impl TimeSeriesTable

Source

pub async fn load_table_coverage_snapshot_only( &self, ) -> Result<Coverage, TableError>

Load table coverage using the snapshot pointer only.

  • If there is no snapshot pointer:
    • If table has zero segments: returns empty coverage.
    • Else: returns MissingTableCoveragePointer (strict mode).
  • If snapshot exists but is missing/corrupt: returns the snapshot read error.
Source§

impl TimeSeriesTable

Source

pub async fn coverage_ratio_for_range<S, E>( &self, start: S, end: E, ) -> Result<f64, TableError>
where S: Into<IndexValue>, E: Into<IndexValue>,

Coverage ratio in [0.0, 1.0] for the half-open index range [start, end).

This identity-free query is only valid for tables without configured entity columns. It uses the table-level coverage snapshot, with readonly recovery from segments if needed.

§Errors

Returns TableError::InvalidRange when the endpoints do not match the table index or start >= end, TableError::EntityIdentityRequired when the table has entity columns, and contextual coverage errors when the snapshot cannot be loaded or the range cannot be bucketed.

§Examples
use chrono::{TimeZone, Utc};
let start = Utc.timestamp_opt(0, 0).single().unwrap();
let end = Utc.timestamp_opt(120, 0).single().unwrap();
let ratio = table.coverage_ratio_for_range(start, end).await?;
Source

pub async fn coverage_ratio_for_entity_range<S, E>( &self, entity: &[(&str, EntityValue)], start: S, end: E, ) -> Result<f64, TableError>
where S: Into<IndexValue>, E: Into<IndexValue>,

Coverage ratio in [0.0, 1.0] for one entity over [start, end).

Entity components are supplied by column name and canonicalized into the configured entity-column order. Coverage from other identities is never included. A complete identity not present in the table has zero coverage.

§Errors

Returns a typed entity identity error for missing, duplicate, unexpected, or unconfigured entity columns. Range and sidecar errors retain the same behavior as TimeSeriesTable::coverage_ratio_for_range.

§Examples

If entities A and B both have data in the same bucket, their coverage is still queried independently:

use chrono::{TimeZone, Utc};
let start = Utc.timestamp_opt(0, 0).single().unwrap();
let end = Utc.timestamp_opt(120, 0).single().unwrap();
let a = table
    .coverage_ratio_for_entity_range(&[("symbol", EntityValue::from("A"))], start, end)
    .await?;
let b = table
    .coverage_ratio_for_entity_range(&[("symbol", EntityValue::from("B"))], start, end)
    .await?;
Source

pub async fn max_gap_len_for_range<S, E>( &self, start: S, end: E, ) -> Result<u128, TableError>
where S: Into<IndexValue>, E: Into<IndexValue>,

Maximum contiguous missing run length in buckets for [start, end).

This identity-free query is only valid for tables without configured entity columns.

§Errors

Returns TableError::InvalidRange when the endpoints do not match the table index or start >= end, TableError::EntityIdentityRequired when the table has entity columns, and contextual coverage errors when the snapshot cannot be loaded or the range cannot be bucketed.

§Examples
use chrono::{TimeZone, Utc};
let start = Utc.timestamp_opt(0, 0).single().unwrap();
let end = Utc.timestamp_opt(180, 0).single().unwrap();
let gap = table.max_gap_len_for_range(start, end).await?;
Source

pub async fn max_gap_len_for_entity_range<S, E>( &self, entity: &[(&str, EntityValue)], start: S, end: E, ) -> Result<u128, TableError>
where S: Into<IndexValue>, E: Into<IndexValue>,

Maximum contiguous missing run length for one entity over [start, end).

Entity components are supplied by column name and canonicalized into the configured entity-column order. Other entities never fill this entity’s gaps. A complete identity not present in the table is missing for the entire requested range.

§Errors

Returns a typed entity identity error for missing, duplicate, unexpected, or unconfigured entity columns. It returns TableError::InvalidRange for invalid half-open range endpoints and contextual coverage errors when the snapshot cannot be loaded or the range cannot be bucketed.

Source

pub async fn last_fully_covered_window<E>( &self, end: E, window_len_buckets: u64, ) -> Result<Option<RangeInclusive<Bucket>>, TableError>
where E: Into<IndexValue>,

Return the last fully covered contiguous window of window_len_buckets ending before the exclusive ordered-index endpoint.

Notes:

  • This returns a bucket-id RangeInclusive in the 64-bit bucket domain.
  • Returns None when window_len_buckets == 0 or when no fully covered window is found.
  • This identity-free query is only valid for tables without configured entity columns.
§Errors

Returns TableError::InvalidRange when end does not match the table index, TableError::EntityIdentityRequired when the table has entity columns, and contextual coverage errors when the endpoint cannot be bucketed or the snapshot cannot be loaded.

§Examples
use chrono::{TimeZone, Utc};
let ts_end = Utc.timestamp_opt(360, 0).single().unwrap(); // end of bucket 5
let window = table.last_fully_covered_window(ts_end, 2).await?;
Source

pub async fn last_fully_covered_window_for_entity<E>( &self, entity: &[(&str, EntityValue)], end: E, window_len_buckets: u64, ) -> Result<Option<RangeInclusive<Bucket>>, TableError>
where E: Into<IndexValue>,

Return one entity’s last fully covered contiguous window ending before the exclusive ordered-index endpoint.

Entity components are supplied by column name and canonicalized into the configured entity-column order. Other entities cannot contribute buckets to the window. A complete identity not present in the table returns None, as does a zero-length window.

§Errors

Returns a typed entity identity error for missing, duplicate, unexpected, or unconfigured entity columns. It returns TableError::InvalidRange when end does not match the table index and contextual coverage errors when the endpoint cannot be bucketed or the snapshot cannot be loaded.

Source§

impl TimeSeriesTable

Source

pub async fn optimize(&mut self) -> Result<OptimizeReport, TableError>

Replace every live mixed-entity segment with verified single-entity Parquet segments in one expected-version commit.

Optimization preserves logical rows, schema, and per-entity coverage, but may change physical row order.

§Errors

Returns TableError when optimization is not applicable, staging or validation fails, the commit cannot be confirmed, or rollback fails.

Source§

impl TimeSeriesTable

Source

pub async fn scan_range<S, E>( &self, start: S, end: E, ) -> Result<TimeSeriesScan, TableError>
where S: Into<IndexValue>, E: Into<IndexValue>,

Scan the time-series table for record batches overlapping [start, end), returning a stream of filtered batches from the segments covering that range.

Input rows need not be ordered. The returned batches and rows have no ordering guarantee; callers that need ordered results must sort them.

Source§

impl TimeSeriesTable

Source

pub fn state(&self) -> &TableState

Return the current committed table state.

Source

pub fn index_spec(&self) -> &IndexSpec

Return the time index specification for this table.

Source

pub fn location(&self) -> &TableLocation

Return the table location.

Source

pub async fn open(location: TableLocation) -> Result<Self, TableError>

Open an existing time-series table at the given location.

Steps:

  • Build a TransactionLogStore for the location.
  • Rebuild TableState from the transaction log.
  • Reject empty tables (version == 0).
  • Require TableKind::TimeSeries and extract IndexSpec.
Source

pub async fn create( location: TableLocation, table_meta: TableMeta, ) -> Result<Self, TableError>

Create a new time-series table at the given location.

This:

  • Requires table_meta.format_version to match TABLE_FORMAT_VERSION,
  • Requires table_meta.kind to be TableKind::TimeSeries,
  • Verifies that there are no existing commits (version must be 0),
  • Writes an initial commit with UpdateTableMeta(table_meta.clone()),
  • Returns a TimeSeriesTable with a fresh TableState.
Source

pub async fn current_version(&self) -> Result<u64, TableError>

Load the current log version from disk without mutating in-memory state.

Source

pub async fn load_latest_state(&self) -> Result<TableState, TableError>

Rebuild and return the latest table state from the transaction log.

Source

pub async fn refresh(&mut self) -> Result<bool, TableError>

Refresh in-memory state if the log has advanced; returns true if updated.

Trait Implementations§

Source§

impl Clone for TimeSeriesTable

Source§

fn clone(&self) -> TimeSeriesTable

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TimeSeriesTable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V