use crate::datatypes::{DataFrame, Value};
use crate::graph::schema::InternedKey;
use crate::graph::storage::interner::StringInterner;
use std::collections::{HashMap, HashSet};
pub(super) fn resolve_edge_property_columns(
df_data: &DataFrame,
source_id_field: &str,
target_id_field: &str,
source_title_field: Option<&str>,
target_title_field: Option<&str>,
) -> Vec<(String, InternedKey, usize)> {
df_data
.get_column_names()
.into_iter()
.filter(|col_name| {
let name = col_name.as_str();
name != source_id_field
&& name != target_id_field
&& Some(name) != source_title_field
&& Some(name) != target_title_field
})
.filter_map(|col_name| {
df_data.get_column_index(&col_name).map(|col_idx| {
let key = InternedKey::from_str(&col_name);
(col_name, key, col_idx)
})
})
.collect()
}
pub(super) fn register_used_edge_property_names(
interner: &mut StringInterner,
property_columns: &[(String, InternedKey, usize)],
used: &HashSet<InternedKey>,
) {
for (col_name, key, _) in property_columns {
if used.contains(key) {
interner.get_or_intern(col_name);
}
}
}
pub(super) fn intern_edge_props(
props: HashMap<String, Value>,
interner: &mut StringInterner,
) -> Vec<(InternedKey, Value)> {
props
.into_iter()
.map(|(k, v)| (interner.get_or_intern(&k), v))
.collect()
}