use super::{ClusteringColumn, KeyColumn, TableSchema};
impl TableSchema {
pub fn ordered_partition_keys(&self) -> Vec<&KeyColumn> {
let mut keys = self.partition_keys.iter().collect::<Vec<_>>();
if !keys.is_sorted_by_key(|k| k.position) {
keys.sort_by_key(|k| k.position);
}
keys
}
pub fn ordered_clustering_keys(&self) -> Vec<&ClusteringColumn> {
let mut keys = self.clustering_keys.iter().collect::<Vec<_>>();
if !keys.is_sorted_by_key(|k| k.position) {
keys.sort_by_key(|k| k.position);
}
keys
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::schema::{ClusteringColumn, ClusteringOrder, KeyColumn};
use std::collections::HashMap;
fn schema_with(
partition_keys: Vec<KeyColumn>,
clustering_keys: Vec<ClusteringColumn>,
) -> TableSchema {
TableSchema {
keyspace: "ks".into(),
table: "t".into(),
partition_keys,
clustering_keys,
columns: vec![],
comments: HashMap::new(),
dropped_columns: HashMap::new(),
}
}
fn pk(name: &str, position: usize) -> KeyColumn {
KeyColumn {
name: name.into(),
data_type: "int".into(),
position,
}
}
fn ck(name: &str, position: usize) -> ClusteringColumn {
ClusteringColumn {
name: name.into(),
data_type: "int".into(),
position,
order: ClusteringOrder::Asc,
}
}
#[test]
fn already_sorted_keys_keep_their_order() {
let schema = schema_with(
vec![pk("a", 0), pk("b", 1), pk("c", 2)],
vec![ck("x", 0), ck("y", 1)],
);
let pks: Vec<_> = schema
.ordered_partition_keys()
.iter()
.map(|k| k.name.clone())
.collect();
assert_eq!(pks, vec!["a", "b", "c"]);
let cks: Vec<_> = schema
.ordered_clustering_keys()
.iter()
.map(|k| k.name.clone())
.collect();
assert_eq!(cks, vec!["x", "y"]);
}
#[test]
fn out_of_order_keys_are_still_sorted_by_position() {
let schema = schema_with(
vec![pk("c", 2), pk("a", 0), pk("b", 1)],
vec![ck("y", 1), ck("x", 0)],
);
let pks: Vec<_> = schema
.ordered_partition_keys()
.iter()
.map(|k| (k.name.clone(), k.position))
.collect();
assert_eq!(pks, vec![("a".into(), 0), ("b".into(), 1), ("c".into(), 2)]);
let cks: Vec<_> = schema
.ordered_clustering_keys()
.iter()
.map(|k| (k.name.clone(), k.position))
.collect();
assert_eq!(cks, vec![("x".into(), 0), ("y".into(), 1)]);
}
#[test]
fn empty_key_lists_are_handled() {
let schema = schema_with(vec![], vec![]);
assert!(schema.ordered_partition_keys().is_empty());
assert!(schema.ordered_clustering_keys().is_empty());
}
}