liquid_cache_storage/cache/
cached_batch.rs

1//! Cached batch types.
2
3use std::{fmt::Display, sync::Arc};
4
5use arrow::array::{ArrayRef, BooleanArray};
6use arrow_schema::DataType;
7
8use crate::liquid_array::{LiquidArrayRef, LiquidHybridArrayRef};
9
10/// Cached batch.
11#[derive(Debug, Clone)]
12pub enum CachedBatch {
13    /// Cached batch in memory as Arrow array.
14    MemoryArrow(ArrayRef),
15    /// Cached batch in memory as liquid array.
16    MemoryLiquid(LiquidArrayRef),
17    /// Cached batch in memory as hybrid liquid array.
18    MemoryHybridLiquid(LiquidHybridArrayRef),
19    /// Cached batch on disk as liquid array.
20    DiskLiquid(DataType),
21    /// Cached batch on disk as Arrow array.
22    DiskArrow(DataType),
23}
24
25impl CachedBatch {
26    /// Get the memory usage of the cached batch.
27    pub fn memory_usage_bytes(&self) -> usize {
28        match self {
29            Self::MemoryArrow(array) => array.get_array_memory_size(),
30            Self::MemoryLiquid(array) => array.get_array_memory_size(),
31            Self::MemoryHybridLiquid(array) => array.get_array_memory_size(),
32            Self::DiskLiquid(_) => 0,
33            Self::DiskArrow(_) => 0,
34        }
35    }
36
37    /// Get the reference count of the cached batch.
38    pub fn reference_count(&self) -> usize {
39        match self {
40            Self::MemoryArrow(array) => Arc::strong_count(array),
41            Self::MemoryLiquid(array) => Arc::strong_count(array),
42            Self::MemoryHybridLiquid(array) => Arc::strong_count(array),
43            Self::DiskLiquid(_) => 0,
44            Self::DiskArrow(_) => 0,
45        }
46    }
47}
48
49impl Display for CachedBatch {
50    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51        match self {
52            Self::MemoryArrow(_) => write!(f, "MemoryArrow"),
53            Self::MemoryLiquid(_) => write!(f, "MemoryLiquid"),
54            Self::MemoryHybridLiquid(_) => write!(f, "MemoryHybridLiquid"),
55            Self::DiskLiquid(_) => write!(f, "DiskLiquid"),
56            Self::DiskArrow(_) => write!(f, "DiskArrow"),
57        }
58    }
59}
60
61/// The type of the cached batch.
62#[derive(Debug, Clone, Copy, PartialEq, Eq)]
63pub enum CachedBatchType {
64    /// Cached batch in memory as Arrow array.
65    MemoryArrow,
66    /// Cached batch in memory as liquid array.
67    MemoryLiquid,
68    /// Cached batch in memory as hybrid liquid array.
69    MemoryHybridLiquid,
70    /// Cached batch on disk as liquid array.
71    DiskLiquid,
72    /// Cached batch on disk as Arrow array.
73    DiskArrow,
74}
75
76impl From<&CachedBatch> for CachedBatchType {
77    fn from(batch: &CachedBatch) -> Self {
78        match batch {
79            CachedBatch::MemoryArrow(_) => Self::MemoryArrow,
80            CachedBatch::MemoryLiquid(_) => Self::MemoryLiquid,
81            CachedBatch::MemoryHybridLiquid(_) => Self::MemoryHybridLiquid,
82            CachedBatch::DiskLiquid(_) => Self::DiskLiquid,
83            CachedBatch::DiskArrow(_) => Self::DiskArrow,
84        }
85    }
86}
87
88/// The result of predicate pushdown.
89#[derive(Debug, PartialEq)]
90pub enum GetWithPredicateResult {
91    /// The predicate is evaluated on the filtered data and the result is a boolean buffer.
92    Evaluated(BooleanArray),
93
94    /// The predicate is not evaluated but data is filtered.
95    Filtered(ArrayRef),
96}