use super::super::slot::SlotId;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Distribution {
Single,
Broadcast,
HashPartitioned(Vec<SlotId>),
}
#[derive(Debug, Clone)]
pub enum Ordering {
None,
Sorted(Vec<SortOrder>),
}
#[derive(Debug, Clone)]
pub struct SortOrder {
pub slot: SlotId,
pub ascending: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PipelineKind {
Streaming,
Blocking,
}
#[derive(Debug, Clone)]
pub struct Parallelism {
pub min_workers: usize,
pub max_workers: usize,
}
impl Default for Parallelism {
fn default() -> Self {
Self {
min_workers: 1,
max_workers: 1,
}
}
}
#[derive(Debug, Clone, Default)]
pub enum MemoryPolicy {
#[default]
None,
RequiresBudget,
Spillable {
threshold: u64,
},
}
pub const SPILL_DEFAULT_THRESHOLD: u64 = 64 * 1024 * 1024;
#[derive(Debug, Clone)]
pub struct PhysicalProperties {
pub distribution: Distribution,
pub ordering: Ordering,
pub pipeline_kind: PipelineKind,
pub parallelism: Parallelism,
pub memory_policy: MemoryPolicy,
}
impl PhysicalProperties {
pub fn new(
distribution: Distribution,
ordering: Ordering,
pipeline_kind: PipelineKind,
parallelism: Parallelism,
memory_policy: MemoryPolicy,
) -> Self {
Self {
distribution,
ordering,
pipeline_kind,
parallelism,
memory_policy,
}
}
pub fn single_streaming() -> Self {
Self::new(
Distribution::Single,
Ordering::None,
PipelineKind::Streaming,
Parallelism::default(),
MemoryPolicy::None,
)
}
pub fn single_blocking() -> Self {
Self::new(
Distribution::Single,
Ordering::None,
PipelineKind::Blocking,
Parallelism::default(),
MemoryPolicy::None,
)
}
pub fn single_blocking_with_budget() -> Self {
Self::new(
Distribution::Single,
Ordering::None,
PipelineKind::Blocking,
Parallelism::default(),
MemoryPolicy::RequiresBudget,
)
}
pub fn single_blocking_spillable(threshold: u64) -> Self {
Self::new(
Distribution::Single,
Ordering::None,
PipelineKind::Blocking,
Parallelism::default(),
MemoryPolicy::Spillable { threshold },
)
}
pub fn sorted_blocking(ordering: Ordering) -> Self {
Self::new(
Distribution::Single,
ordering,
PipelineKind::Blocking,
Parallelism::default(),
MemoryPolicy::None,
)
}
}