ColumnarCache

Struct ColumnarCache 

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

LRU cache for columnar table representations

Provides memory-bounded caching of columnar table data with automatic eviction when the memory budget is exceeded. Tables are stored as Arc to enable zero-copy sharing between queries.

§Memory Management

The cache tracks memory usage based on ColumnarTable::size_in_bytes(). When inserting a new entry would exceed the budget, the least recently used entries are evicted until there’s sufficient space.

§Example

use vibesql_storage::columnar_cache::ColumnarCache;

// Create a cache with 256MB budget
let cache = ColumnarCache::new(256 * 1024 * 1024);

// Get or create columnar representation
if let Some(columnar) = cache.get("lineitem") {
    // Use cached data
} else {
    // Convert and cache
    let columnar = table.scan_columnar()?;
    cache.insert("lineitem", columnar);
}

Implementations§

Source§

impl ColumnarCache

Source

pub fn new(max_memory: usize) -> Self

Create a new columnar cache with the specified memory budget

§Arguments
  • max_memory - Maximum memory budget in bytes
§Example
// 256MB cache
let cache = ColumnarCache::new(256 * 1024 * 1024);
Source

pub fn get(&self, table_name: &str) -> Option<Arc<ColumnarTable>>

Get a cached columnar table representation

Returns Some(Arc<ColumnarTable>) if the table is cached, None otherwise. Accessing a cached entry marks it as recently used. Table names are normalized for case-insensitive matching.

Source

pub fn insert( &self, table_name: &str, columnar: ColumnarTable, ) -> Arc<ColumnarTable>

Insert or update a columnar table in the cache

If the table is already cached, the existing entry is updated. If inserting would exceed the memory budget, least recently used entries are evicted until there’s sufficient space. Table names are normalized for case-insensitive matching.

§Arguments
  • table_name - Name of the table
  • columnar - The columnar table data to cache
§Returns

The Arc-wrapped columnar table (for immediate use)

Source

pub fn invalidate(&self, table_name: &str)

Invalidate a cached table entry

Called when a table is modified (INSERT/UPDATE/DELETE) to ensure the cache doesn’t serve stale data. Table names are normalized for case-insensitive matching.

Source

pub fn clear(&self)

Clear all cached entries

Source

pub fn stats(&self) -> CacheStats

Get cache statistics

Source

pub fn memory_usage(&self) -> usize

Get current memory usage in bytes

Source

pub fn max_memory(&self) -> usize

Get the memory budget in bytes

Source

pub fn len(&self) -> usize

Get the number of cached tables

Source

pub fn is_empty(&self) -> bool

Check if the cache is empty

Source

pub fn contains(&self, table_name: &str) -> bool

Check if a table is cached Table names are normalized for case-insensitive matching.

Trait Implementations§

Source§

impl Clone for ColumnarCache

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for ColumnarCache

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> 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<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> 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