use crate::scan::transform_spec::FieldTransformSpec;
use crate::schema::StructField;
use crate::table_changes::{
CHANGE_TYPE_COL_NAME, COMMIT_TIMESTAMP_COL_NAME, COMMIT_VERSION_COL_NAME,
};
pub(crate) trait TransformFieldClassifier {
fn classify_field(
&self,
field: &StructField,
field_index: usize,
last_physical_field: &Option<String>,
) -> Option<FieldTransformSpec>;
}
impl TransformFieldClassifier for () {
fn classify_field(
&self,
_: &StructField,
_: usize,
_: &Option<String>,
) -> Option<FieldTransformSpec> {
None
}
}
pub(crate) struct CdfTransformFieldClassifier;
impl TransformFieldClassifier for CdfTransformFieldClassifier {
fn classify_field(
&self,
field: &StructField,
field_index: usize,
last_physical_field: &Option<String>,
) -> Option<FieldTransformSpec> {
match field.name().as_str() {
CHANGE_TYPE_COL_NAME => Some(FieldTransformSpec::DynamicColumn {
field_index,
physical_name: CHANGE_TYPE_COL_NAME.to_string(),
insert_after: last_physical_field.clone(),
}),
COMMIT_VERSION_COL_NAME | COMMIT_TIMESTAMP_COL_NAME => {
Some(FieldTransformSpec::MetadataDerivedColumn {
field_index,
insert_after: last_physical_field.clone(),
})
}
_ => None,
}
}
}