use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[doc(hidden)]
pub enum FilteredReadTable {
Edge,
Node,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[doc(hidden)]
pub enum FilteredReadStrategy {
DenseRowSelection,
RowGroupPredicate,
FullFallback,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[doc(hidden)]
pub struct FilteredReadPruning {
pub strategy: FilteredReadStrategy,
pub row_groups_considered: u64,
pub row_groups_selected: u64,
pub pages_considered: u64,
pub pages_selected: u64,
pub exact_rows_selected: u64,
pub metadata_fallbacks: u64,
pub validation_fallbacks: u64,
}
#[doc(hidden)]
pub trait FilteredReadObserver: Send + Sync {
fn read_started(&self, table: FilteredReadTable);
fn rows_scanned(&self, table: FilteredReadTable, rows: u64);
fn read_completed(&self, table: FilteredReadTable, rows: u64, full: bool);
fn read_failed(&self, table: FilteredReadTable);
fn pruning(&self, _table: FilteredReadTable, _pruning: FilteredReadPruning) {}
}
static EDGE_FULL_READS: AtomicU64 = AtomicU64::new(0);
static EDGE_FULL_ROWS: AtomicU64 = AtomicU64::new(0);
static EDGE_FILTERED_READS: AtomicU64 = AtomicU64::new(0);
static EDGE_FILTERED_ROWS: AtomicU64 = AtomicU64::new(0);
static NODE_FULL_READS: AtomicU64 = AtomicU64::new(0);
static NODE_FULL_ROWS: AtomicU64 = AtomicU64::new(0);
static NODE_FILTERED_READS: AtomicU64 = AtomicU64::new(0);
static NODE_FILTERED_ROWS: AtomicU64 = AtomicU64::new(0);
static EDGE_SCANNED_ROWS: AtomicU64 = AtomicU64::new(0);
static NODE_SCANNED_ROWS: AtomicU64 = AtomicU64::new(0);
static NODE_DENSE_ROW_SELECTION_READS: AtomicU64 = AtomicU64::new(0);
static NODE_ROW_GROUP_PREDICATE_READS: AtomicU64 = AtomicU64::new(0);
static NODE_ROW_GROUPS_CONSIDERED: AtomicU64 = AtomicU64::new(0);
static NODE_ROW_GROUPS_SELECTED: AtomicU64 = AtomicU64::new(0);
static NODE_PAGES_CONSIDERED: AtomicU64 = AtomicU64::new(0);
static NODE_PAGES_SELECTED: AtomicU64 = AtomicU64::new(0);
static NODE_EXACT_ROWS_SELECTED: AtomicU64 = AtomicU64::new(0);
static NODE_METADATA_FALLBACKS: AtomicU64 = AtomicU64::new(0);
static NODE_VALIDATION_FALLBACKS: AtomicU64 = AtomicU64::new(0);
static REWRITE_COMMITS: AtomicU64 = AtomicU64::new(0);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct IoSnapshot {
pub edge_full_reads: u64,
pub edge_full_rows: u64,
pub edge_filtered_reads: u64,
pub edge_filtered_rows: u64,
pub node_full_reads: u64,
pub node_full_rows: u64,
pub node_filtered_reads: u64,
pub node_filtered_rows: u64,
pub edge_scanned_rows: u64,
pub node_scanned_rows: u64,
pub node_dense_row_selection_reads: u64,
pub node_row_group_predicate_reads: u64,
pub node_row_groups_considered: u64,
pub node_row_groups_selected: u64,
pub node_pages_considered: u64,
pub node_pages_selected: u64,
pub node_exact_rows_selected: u64,
pub node_metadata_fallbacks: u64,
pub node_validation_fallbacks: u64,
pub rewrite_commits: u64,
}
#[must_use]
pub fn snapshot() -> IoSnapshot {
IoSnapshot {
edge_full_reads: EDGE_FULL_READS.load(Ordering::Relaxed),
edge_full_rows: EDGE_FULL_ROWS.load(Ordering::Relaxed),
edge_filtered_reads: EDGE_FILTERED_READS.load(Ordering::Relaxed),
edge_filtered_rows: EDGE_FILTERED_ROWS.load(Ordering::Relaxed),
node_full_reads: NODE_FULL_READS.load(Ordering::Relaxed),
node_full_rows: NODE_FULL_ROWS.load(Ordering::Relaxed),
node_filtered_reads: NODE_FILTERED_READS.load(Ordering::Relaxed),
node_filtered_rows: NODE_FILTERED_ROWS.load(Ordering::Relaxed),
edge_scanned_rows: EDGE_SCANNED_ROWS.load(Ordering::Relaxed),
node_scanned_rows: NODE_SCANNED_ROWS.load(Ordering::Relaxed),
node_dense_row_selection_reads: NODE_DENSE_ROW_SELECTION_READS.load(Ordering::Relaxed),
node_row_group_predicate_reads: NODE_ROW_GROUP_PREDICATE_READS.load(Ordering::Relaxed),
node_row_groups_considered: NODE_ROW_GROUPS_CONSIDERED.load(Ordering::Relaxed),
node_row_groups_selected: NODE_ROW_GROUPS_SELECTED.load(Ordering::Relaxed),
node_pages_considered: NODE_PAGES_CONSIDERED.load(Ordering::Relaxed),
node_pages_selected: NODE_PAGES_SELECTED.load(Ordering::Relaxed),
node_exact_rows_selected: NODE_EXACT_ROWS_SELECTED.load(Ordering::Relaxed),
node_metadata_fallbacks: NODE_METADATA_FALLBACKS.load(Ordering::Relaxed),
node_validation_fallbacks: NODE_VALIDATION_FALLBACKS.load(Ordering::Relaxed),
rewrite_commits: REWRITE_COMMITS.load(Ordering::Relaxed),
}
}
pub fn reset() {
for c in [
&EDGE_FULL_READS,
&EDGE_FULL_ROWS,
&EDGE_FILTERED_READS,
&EDGE_FILTERED_ROWS,
&NODE_FULL_READS,
&NODE_FULL_ROWS,
&NODE_FILTERED_READS,
&NODE_FILTERED_ROWS,
&EDGE_SCANNED_ROWS,
&NODE_SCANNED_ROWS,
&NODE_DENSE_ROW_SELECTION_READS,
&NODE_ROW_GROUP_PREDICATE_READS,
&NODE_ROW_GROUPS_CONSIDERED,
&NODE_ROW_GROUPS_SELECTED,
&NODE_PAGES_CONSIDERED,
&NODE_PAGES_SELECTED,
&NODE_EXACT_ROWS_SELECTED,
&NODE_METADATA_FALLBACKS,
&NODE_VALIDATION_FALLBACKS,
&REWRITE_COMMITS,
] {
c.store(0, Ordering::Relaxed);
}
}
pub(crate) fn record_edge_full_read(rows: u64) {
EDGE_FULL_READS.fetch_add(1, Ordering::Relaxed);
EDGE_FULL_ROWS.fetch_add(rows, Ordering::Relaxed);
}
pub(crate) fn record_edge_filtered_read(rows: u64) {
EDGE_FILTERED_READS.fetch_add(1, Ordering::Relaxed);
EDGE_FILTERED_ROWS.fetch_add(rows, Ordering::Relaxed);
}
pub(crate) fn record_node_full_read(rows: u64) {
NODE_FULL_READS.fetch_add(1, Ordering::Relaxed);
NODE_FULL_ROWS.fetch_add(rows, Ordering::Relaxed);
}
pub(crate) fn record_node_filtered_read(rows: u64) {
NODE_FILTERED_READS.fetch_add(1, Ordering::Relaxed);
NODE_FILTERED_ROWS.fetch_add(rows, Ordering::Relaxed);
}
pub(crate) fn record_edge_scanned(rows: u64) {
EDGE_SCANNED_ROWS.fetch_add(rows, Ordering::Relaxed);
}
pub(crate) fn record_node_scanned(rows: u64) {
NODE_SCANNED_ROWS.fetch_add(rows, Ordering::Relaxed);
}
pub(crate) fn record_node_pruning(pruning: FilteredReadPruning) {
match pruning.strategy {
FilteredReadStrategy::DenseRowSelection => {
NODE_DENSE_ROW_SELECTION_READS.fetch_add(1, Ordering::Relaxed);
}
FilteredReadStrategy::RowGroupPredicate => {
NODE_ROW_GROUP_PREDICATE_READS.fetch_add(1, Ordering::Relaxed);
}
FilteredReadStrategy::FullFallback => {}
}
NODE_ROW_GROUPS_CONSIDERED.fetch_add(pruning.row_groups_considered, Ordering::Relaxed);
NODE_ROW_GROUPS_SELECTED.fetch_add(pruning.row_groups_selected, Ordering::Relaxed);
NODE_PAGES_CONSIDERED.fetch_add(pruning.pages_considered, Ordering::Relaxed);
NODE_PAGES_SELECTED.fetch_add(pruning.pages_selected, Ordering::Relaxed);
NODE_EXACT_ROWS_SELECTED.fetch_add(pruning.exact_rows_selected, Ordering::Relaxed);
NODE_METADATA_FALLBACKS.fetch_add(pruning.metadata_fallbacks, Ordering::Relaxed);
NODE_VALIDATION_FALLBACKS.fetch_add(pruning.validation_fallbacks, Ordering::Relaxed);
}
pub(crate) fn record_rewrite_commit() {
REWRITE_COMMITS.fetch_add(1, Ordering::Relaxed);
}