use fraiseql_core::schema::{CompiledSchema, NativeJoin};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TviewReference {
pub child: String,
pub parent: String,
pub foreign_key: String,
pub referenced_key: String,
}
pub fn apply_native_joins(schema: &mut CompiledSchema, references: &[TviewReference]) -> usize {
let sources: std::collections::HashMap<String, String> = schema
.types
.iter()
.map(|t| (t.name.to_string(), t.sql_source.to_string()))
.collect();
let mut given = 0;
for declaring in &mut schema.types {
for rel in &mut declaring.relationships {
let (child, parent) = if rel.cardinality.is_to_one() {
(declaring.name.as_str(), rel.target_type.as_str())
} else {
(rel.target_type.as_str(), declaring.name.as_str())
};
let (Some(child), Some(parent)) = (sources.get(child), sources.get(parent)) else {
continue;
};
rel.native_join = references
.iter()
.find(|r| {
&r.child == child
&& &r.parent == parent
&& r.foreign_key == rel.foreign_key
&& r.referenced_key == rel.referenced_key
})
.map(|r| NativeJoin {
foreign_key: r.foreign_key.clone(),
referenced_key: r.referenced_key.clone(),
child_view: child.clone(),
parent_view: parent.clone(),
});
given += usize::from(rel.native_join.is_some());
}
}
given
}
#[cfg(test)]
#[path = "native_joins_tests.rs"]
mod tests;