more fixes
This commit is contained in:
@ -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(())
|
||||
|
||||
Reference in New Issue
Block a user