use serde::{Deserialize, Serialize};
use crate::identifier::{Identifier, QualifiedName};
use crate::ir::default_expr::NormalizedExpr;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct PartitionBy {
pub strategy: PartitionStrategy,
pub columns: Vec<PartitionColumn>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PartitionStrategy {
Range,
List,
Hash,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct PartitionColumn {
pub kind: PartitionColumnKind,
pub collation: Option<QualifiedName>,
pub opclass: Option<QualifiedName>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PartitionColumnKind {
Column(Identifier),
Expr(NormalizedExpr),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct PartitionOf {
pub parent: QualifiedName,
pub bounds: PartitionBounds,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "kind")]
pub enum PartitionBounds {
Range {
from: Vec<BoundDatum>,
to: Vec<BoundDatum>,
},
List {
values: Vec<BoundDatum>,
},
Hash {
modulus: u32,
remainder: u32,
},
Default,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BoundDatum {
Literal(NormalizedExpr),
MinValue,
MaxValue,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn partition_strategy_round_trip() {
let s = PartitionStrategy::Range;
let json = serde_json::to_string(&s).unwrap();
let back: PartitionStrategy = serde_json::from_str(&json).unwrap();
assert_eq!(s, back);
}
#[test]
fn hash_bounds_round_trip() {
let b = PartitionBounds::Hash {
modulus: 4,
remainder: 1,
};
let json = serde_json::to_string(&b).unwrap();
let back: PartitionBounds = serde_json::from_str(&json).unwrap();
assert_eq!(b, back);
}
#[test]
fn default_bounds_round_trip() {
let b = PartitionBounds::Default;
let json = serde_json::to_string(&b).unwrap();
let back: PartitionBounds = serde_json::from_str(&json).unwrap();
assert_eq!(b, back);
}
}