# # # # save_db_fields_util.cfv # # # remove_deleted_db_fields_from_cross_reference_groups() # check_db_fields_integrity_in_cross_reference_groups() # # process_new_database_fields() # # update_database_field_names_in_cross_reference_groups() # update_database_field_names_in_report_fields() # # include "templates.util.base_util"; # # # # remove_deleted_db_fields_from_cross_reference_groups() # # # subroutine(remove_deleted_db_fields_from_cross_reference_groups( node cross_reference_groups, node deleted_database_fields), ( # # # This simply deletes deleted_database_fields from the cross reference group and returns the group name # of such groups in manipulated_cross_reference_group_names. # We don't yet check for valid groups but do this at the end of the database field # processing in a separate subroutine because we want to make sure that all database fields are in final state # before checking for valid cross reference groups. # # debug_message("\n\n#### remove_deleted_db_fields_from_cross_reference_groups() START \n"); node manipulated_cross_reference_group_names = new_node(); if (num_subnodes(deleted_database_fields) > 0) then ( node group_item; string group_name; node fields; node deleted_db_field_item; string deleted_db_field_name; foreach group_item cross_reference_groups ( group_name = node_name(group_item); fields = group_item{"fields"}; foreach deleted_db_field_item deleted_database_fields ( deleted_db_field_name = @deleted_db_field_item; if (fields?{deleted_db_field_name}) then ( # # Delete the database field from fields # delete_node(fields{deleted_db_field_name}); # # Add the cross reference group name in manipulated_cross_reference_group_names # manipulated_cross_reference_group_names{group_name} = ""; ); ); ); ); debug_message("#### manipulated_cross_reference_group_names:\n" . node_as_string(manipulated_cross_reference_group_names) . "\n"); # Return manipulated_cross_reference_group_names; debug_message("#### remove_deleted_db_fields_from_cross_reference_groups() END \n\n"); )); # # # # check_db_fields_integrity_in_cross_reference_groups() # # # subroutine(check_db_fields_integrity_in_cross_reference_groups( node db_fields, node cross_reference_groups, node manipulated_cross_reference_group_names), ( # This checks if the given cross reference groups (listed by node name in manipulated_cross_reference_group_names) # have at least one non-numerical and one aggregating field. If a group doesn't meet this requirement then we delete # the group. debug_message("\n\n#### check_db_fields_integrity_in_cross_reference_groups() START \n"); node item; string group_name; node group_item; node field_item; node fields; string db_field_name; string db_field_item; string aggregation_method; bool has_none_aggregating_field; bool has_aggregating_field; foreach item manipulated_cross_reference_group_names ( group_name = node_name(item); group_item = cross_reference_groups{group_name}; fields = group_item{"fields"}; # Check if the group contains at a minimum one non-aggreagting and one aggregating field. has_none_aggregating_field = false; has_aggregating_field = false; foreach field_item fields ( if (!has_none_aggregating_field or !has_aggregating_field) then ( db_field_name = node_name(field_item); if (db_fields?{db_field_name}) then ( db_field_item = db_fields{db_field_name}; aggregation_method = @db_field_item{"aggregation_method"}; if (aggregation_method eq "none") then ( has_none_aggregating_field = true; ) else ( has_aggregating_field = true; ); ); ); ); # debug_message("#### has_none_aggregating_field: " . has_none_aggregating_field . "\n"); # debug_message("#### has_aggregating_field: " . has_aggregating_field . "\n"); if (!has_none_aggregating_field or !has_aggregating_field) then ( # Delete the group delete_node(group_item); ); ); # debug_message("\n\n#### check_db_fields_integrity_in_cross_reference_groups() END \n"); )); # # # # process_new_database_fields() # # # subroutine(process_new_database_fields( node new_db_fields), ( delete_node("v.existing_node_names_with_new_node_names"); v.existing_node_names_with_new_node_names = ""; node item; string ori_label; string ori_node_name; string new_node_name; foreach item new_db_fields ( bool is_new = @item{"is_new"}; if (!is_new) then ( # # Resolve language variable # ori_label = @item{"ori_label"}; if ((ori_label ne "") and (get_expanded_label(ori_label) eq @item{"label"})) then ( # The label didn't change, so we use the ori_label set_subnode_value(item, "label", ori_label); ); # # Handle node name # ori_node_name = @item{"ori_node_name"}; new_node_name = node_name(item); if ((ori_node_name ne "") and (ori_node_name ne new_node_name)) then ( "v.existing_node_names_with_new_node_names." . ori_node_name = new_node_name; ); ); # # Delete helper nodes # delete_node(item{"is_new"}); delete_node(item{"ori_node_name"}); delete_node(item{"node_name"}); delete_node(item{"ori_label"}); ); # # Return existing_node_names_with_new_node_names # "v.existing_node_names_with_new_node_names"; )); # # # # update_database_field_names_in_xrefs() # # # subroutine(update_database_field_names_in_cross_reference_groups( node cross_reference_groups, node existing_node_names_with_new_node_names), ( node xref_item; node fields; node field_item; string db_field_name; string new_db_field_name; foreach xref_item cross_reference_groups ( fields = xref_item{"fields"}; foreach field_item fields ( db_field_name = node_name(field_item); if (existing_node_names_with_new_node_names?{db_field_name}) then ( # Rename existing database field name with new database field name new_db_field_name = @existing_node_names_with_new_node_names{db_field_name}; rename_node(field_item, new_db_field_name); ); ); ); )); # # # # update_database_field_names_in_report_fields() # # # subroutine(update_database_field_names_in_report_fields( node report_fields, node existing_node_names_with_new_node_names), ( node item; string db_field_name; string new_db_field_name; foreach item report_fields ( if (item?{"database_field"}) then ( db_field_name = @item{"database_field"}; if (existing_node_names_with_new_node_names?{db_field_name}) then ( # Replace old database field name with new one new_db_field_name = @existing_node_names_with_new_node_names{db_field_name}; set_subnode_value(item, "database_field", new_db_field_name); ); ); ); ));