use bigml::resource::{
source::{FieldUpdate, Optype, SourceUpdate},
Source,
};
use std::collections::HashMap;
use super::data_type::OptypeExt;
use crate::common::*;
pub(crate) trait SourceExt {
fn calculate_column_type_fix(
&self,
schema: &Table,
optype_for_text: Optype,
) -> Result<SourceUpdate>;
}
impl SourceExt for Source {
fn calculate_column_type_fix(
&self,
schema: &Table,
optype_for_text: Optype,
) -> Result<SourceUpdate> {
let mut field_optypes = HashMap::<&str, Optype>::new();
for col in &schema.columns {
field_optypes.insert(
&col.name,
Optype::for_data_type(&col.data_type, optype_for_text)?,
);
}
let fields = self
.fields
.as_ref()
.ok_or_else(|| format_err!("BigML source has no fields"))?;
let mut field_updates = HashMap::<String, FieldUpdate>::new();
for (name, field) in fields {
if let Some(&optype) = field_optypes.get(&field.name[..]) {
let field_update = FieldUpdate {
optype: Some(optype),
..FieldUpdate::default()
};
field_updates.insert(name.to_owned(), field_update);
}
}
Ok(SourceUpdate {
fields: Some(Some(field_updates)),
..SourceUpdate::default()
})
}
}