more fixes

This commit is contained in:
2026-03-18 04:39:48 -04:00
parent 885b9b5e44
commit 00375c2926
4 changed files with 137 additions and 132 deletions

View File

@ -517,7 +517,7 @@ impl<'a> Compiler<'a> {
where_clauses.push(format!("NOT {}.archived", entity_alias));
self.compile_filter_conditions(r#type, type_aliases, &node, &base_alias, &mut where_clauses);
self.compile_relation_conditions(r#type, &node, &base_alias, &mut where_clauses)?;
self.compile_relation_conditions(r#type, type_aliases, &node, &base_alias, &mut where_clauses)?;
Ok(where_clauses)
}
@ -655,44 +655,65 @@ impl<'a> Compiler<'a> {
fn compile_relation_conditions(
&self,
r#type: &crate::database::r#type::Type,
type_aliases: &std::collections::HashMap<String, String>,
node: &Node,
base_alias: &str,
where_clauses: &mut Vec<String>,
) -> Result<(), String> {
if let Some(prop_ref) = &node.property_name {
let prop = prop_ref.as_str();
let mut relation_alias = node.parent_alias.clone();
let mut relation_resolved = false;
let mut parent_relation_alias = node.parent_alias.clone();
let mut child_relation_alias = base_alias.to_string();
if let Some(parent_type) = node.parent_type {
let merged_props = self.get_merged_properties(node.schema.as_ref());
let relative_keys: Vec<String> = merged_props.keys().cloned().collect();
if let Some(relation) = self.db.get_relation(&parent_type.name, &r#type.name, prop, Some(&relative_keys)) {
let source_col = &relation.source_columns[0];
let dest_col = &relation.destination_columns[0];
let (relation, is_parent_source) = self
.db
.get_relation(&parent_type.name, &r#type.name, prop, Some(&relative_keys))
.ok_or_else(|| {
format!(
"Could not dynamically resolve database relation mapping for {} -> {} on property {}",
parent_type.name, r#type.name, prop
)
})?;
if let Some(pta) = &node.parent_type_aliases {
if let Some(a) = pta.get(&relation.source_type) {
relation_alias = a.clone();
} else if let Some(a) = pta.get(&relation.destination_type) {
relation_alias = a.clone();
}
}
let source_col = &relation.source_columns[0];
let dest_col = &relation.destination_columns[0];
if relation.source_type == parent_type.name || parent_type.hierarchy.contains(&relation.source_type) {
where_clauses.push(format!("{}.{} = {}.{}", relation_alias, source_col, base_alias, dest_col));
relation_resolved = true;
} else if relation.destination_type == parent_type.name || parent_type.hierarchy.contains(&relation.destination_type) {
where_clauses.push(format!("{}.{} = {}.{}", base_alias, source_col, relation_alias, dest_col));
relation_resolved = true;
if let Some(pta) = &node.parent_type_aliases {
let p_search_type = if is_parent_source {
&relation.source_type
} else {
&relation.destination_type
};
if let Some(a) = pta.get(p_search_type) {
parent_relation_alias = a.clone();
}
}
}
if !relation_resolved {
let parent_name = node.parent_type.map(|t| t.name.as_str()).unwrap_or("unknown");
return Err(format!("Could not dynamically resolve database relation mapping for {} -> {} on property {}", parent_name, r#type.name, prop));
let c_search_type = if is_parent_source {
&relation.destination_type
} else {
&relation.source_type
};
if let Some(a) = type_aliases.get(c_search_type) {
child_relation_alias = a.clone();
}
let sql_string = if is_parent_source {
format!(
"{}.{} = {}.{}",
parent_relation_alias, source_col, child_relation_alias, dest_col
)
} else {
format!(
"{}.{} = {}.{}",
child_relation_alias, source_col, parent_relation_alias, dest_col
)
};
where_clauses.push(sql_string);
}
}
Ok(())