# # # # # query_header_util.cfv # # # # # collect_report_fields_used_in_parsed_expression() # check_for_missing_report_fields_used_in_expressions() # # # # # # # collect_report_fields_used_in_parsed_expression() # # # subroutine(collect_report_fields_used_in_parsed_expression( node query_fields, node parsed_expression, node report_fields_used_in_expressions), ( debug_message("\n\n#### collect_report_fields_used_in_parsed_expression() \n\n"); # Iterate over each subnode, if it has a node type="cell_by_name" then there may also # be a column_name node which contains the report field name. node item; string report_field_name; foreach item parsed_expression ( if (num_subnodes(item) > 1) then ( if (item?{"type"} and (@item{"type"} eq "cell_by_name" or @item{"type"} eq "cell_by_row_number_and_name") and item?{"column_name"} and @item{"column_name"} ne "") then ( report_field_name = @item{"column_name"}; # Since detection of column_name isn't 100% # make sure that the report field actually exists. if (query_fields?{report_field_name}) then ( @report_fields_used_in_expressions{report_field_name} = ""; ); ) else ( # Rescurively check each subnode collect_report_fields_used_in_parsed_expression(query_fields, item, report_fields_used_in_expressions); ); ); ); )); # # # # check_for_missing_report_fields_used_in_expressions() # # # subroutine(check_for_missing_report_fields_used_in_expressions( node query_fields, node report_fields_in_header, node existing_expressions, node required_sort_by_before_expression_evaluation_fields), ( debug_message("\n\n#### check_for_missing_report_fields_used_in_expressions() \n\n"); debug_message("#### report_fields_in_header:\n" . node_as_string(report_fields_in_header) . "\n"); debug_message("#### existing_expressions:\n" . node_as_string(existing_expressions) . "\n"); # debug_message("#### required_sort_by_before_expression_evaluation_fields:\n" . node_as_string(required_sort_by_before_expression_evaluation_fields) . "\n"); # Returns a node with report fields which are used in # expressions (existing_expressions) but are not yet part of the # query header. The returned node is used to add these report fields # to the query header. delete_node("v.temp_report_fields_used_in_expressions"); v.temp_report_fields_used_in_expressions = ""; node report_fields_used_in_expressions = "v.temp_report_fields_used_in_expressions"; delete_node("v.temp_missing_report_fields"); v.temp_missing_report_fields = ""; node missing_report_fields = "v.temp_missing_report_fields"; # # # # # Collect all report fields which are used in existing_expressions # # # # node item; string expression; node compiled_expression; node parsed_expression; # Set global row_number, number_of_rows and number_of_days which are global variables used in # cell_by_row_number_and_name(), we must set them before we run compile() int row_number = 0; int number_of_rows = 0; int number_of_days = 0; foreach item existing_expressions ( # expression = "subroutine(some_test, (" . @item . "));"; expression = @item; # debug_message("#### expression string which we compile: " . expression . "\n"); compiled_expression = compile(expression); parsed_expression = get_parsed_node(compiled_expression); # delete_node("v.temp_compiled_expression"); # v.temp_compiled_expression = ""; # set_node_value("v.temp_compiled_expression", compile(expression)); debug_message("#### parsed_expression:\n" . node_as_string(parsed_expression) . "\n"); collect_report_fields_used_in_parsed_expression( query_fields, parsed_expression, report_fields_used_in_expressions); ); debug_message("#### report_fields_used_in_expressions:\n" . node_as_string(report_fields_used_in_expressions) . "\n"); # # # # Check if any report field of expressions is not yet part of the query header # # # string report_field_name; foreach item report_fields_used_in_expressions ( report_field_name = node_name(item); if (!report_fields_in_header?{report_field_name}) then ( @missing_report_fields{report_field_name} = ""; ); ); # # # # Check if we need to add any report fields for # sort_by_before_expression_evaluation # # # foreach item required_sort_by_before_expression_evaluation_fields ( report_field_name = node_name(item); if (!report_fields_in_header?{report_field_name}) then ( @missing_report_fields{report_field_name} = ""; ); ); # debug_message("\n" . node_as_string(missing_report_fields) . "\n"); # Return missing report fields missing_report_fields; ));