use nodedb_types::QualifiedCollection;
use crate::physical_plan::PhysicalPlan;
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum RowSource {
DocumentPages(DocumentPageSource),
Query(QuerySource),
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct DocumentPageSource {
pub collection: QualifiedCollection,
pub filters: Vec<u8>,
pub system_as_of_ms: Option<i64>,
pub offset: usize,
pub limit: Option<usize>,
pub column_map: Vec<u8>,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct QuerySource {
pub plan: Box<PhysicalPlan>,
pub column_map: Vec<u8>,
}
impl RowSource {
pub fn whole_collection(collection: QualifiedCollection) -> Self {
RowSource::DocumentPages(DocumentPageSource {
collection,
filters: Vec::new(),
system_as_of_ms: None,
offset: 0,
limit: None,
column_map: Vec::new(),
})
}
pub fn paged_collection(&self) -> Option<&QualifiedCollection> {
match self {
RowSource::DocumentPages(page) => Some(&page.collection),
RowSource::Query(_) => None,
}
}
pub fn query_plan(&self) -> Option<&PhysicalPlan> {
match self {
RowSource::DocumentPages(_) => None,
RowSource::Query(query) => Some(&query.plan),
}
}
pub fn label(&self) -> &str {
match self {
RowSource::DocumentPages(page) => page.collection.as_str(),
RowSource::Query(query) => query.plan.collection().unwrap_or("<query>"),
}
}
}