use arrow_schema::SchemaRef;
use vgi_rpc::Result;
use crate::function::{ArgSpec, BindParams, BindResponse, FunctionMetadata, ProcessParams};
#[derive(Clone, Copy, Default)]
pub struct TableCardinality {
pub estimate: Option<i64>,
pub max: Option<i64>,
}
pub trait TableProducer: Send {
fn next_batch(
&mut self,
out: &mut vgi_rpc::OutputCollector,
) -> Result<Option<arrow_array::RecordBatch>>;
fn encode_resume(&self) -> Vec<u8> {
Vec::new()
}
fn restore_resume(&mut self, _bytes: &[u8]) {}
fn last_metadata(&self) -> Option<std::collections::HashMap<String, String>> {
None
}
fn on_dynamic_filters(&mut self, _filters: Option<&crate::pushdown::PushdownFilters>) {}
}
pub trait TableFunction: Send + Sync {
fn name(&self) -> &str;
fn metadata(&self) -> FunctionMetadata;
fn argument_specs(&self) -> Vec<ArgSpec>;
fn on_bind(&self, params: &BindParams) -> Result<BindResponse>;
fn max_workers(&self, _params: &BindParams) -> i64 {
1
}
fn on_init(&self, _params: &ProcessParams) -> Result<()> {
Ok(())
}
fn cardinality(&self, _params: &BindParams) -> Option<TableCardinality> {
None
}
fn statistics(&self, _params: &BindParams) -> Option<Vec<crate::statistics::CatColStat>> {
None
}
fn secret_lookups(&self, _params: &BindParams) -> Vec<crate::secrets::SecretLookup> {
Vec::new()
}
fn producer(&self, params: &ProcessParams) -> Result<Box<dyn TableProducer>>;
fn dynamic_to_string(
&self,
_global_execution_id: &[u8],
_storage: &crate::buffering::BufferingStore,
) -> Vec<(String, String)> {
Vec::new()
}
}
pub fn project_schema(full: &SchemaRef, ids: &Option<Vec<i64>>) -> SchemaRef {
match ids {
Some(ids) if !ids.is_empty() => {
let fields: Vec<_> = ids
.iter()
.filter_map(|&i| full.fields().get(i as usize).cloned())
.collect();
std::sync::Arc::new(arrow_schema::Schema::new(fields))
}
_ => full.clone(),
}
}