# # # # overview_query_util.cfv # # # get_overview_query_result() # get_sessions_overview_query_result() # # # # # # # # get_overview_query_result() # # # # subroutine(get_overview_query_result( string session_id, string profile_name, string database_last_modification_time, string filter_expression), ( # Returns a cached or new overview query result # The query result is used for the Overview Report and to receive the totals in standard table reporting code. debug_message("\n\n#### get_overview_query_result() START \n\n"); debug_message("#### get_overview_query_result() - filter_expression: " . filter_expression . "\n"); # # # Get overview query Id # # node extended_profile_dat = get_extended_profile_dat_node_reference(session_id, profile_name); node cached_overview_query_info = extended_profile_dat{"overview_query_info"}; string query_header_checksum = @cached_overview_query_info{"header_checksum"}; string query_id = "overview_" . md5_digest(database_last_modification_time . filter_expression . query_header_checksum); # # # Use cached overview query_result, else perform a new query # # string profiles_cache_path = "profiles_cache." . profile_name; string saved_query_result_path = profiles_cache_path . ".queries." . query_id; node query_result; node saved_query_result; node item; string item_name; string item_type; if (!?(saved_query_result_path)) then ( # # # No cached overview query exists, perform query now # # volatile.filters = if (filter_expression ne "") then (filter_expression) else ("nofilters"); debug_message("#### get_overview_query_result() - filter expression:\n" . volatile.filters . "\n\n"); delete_node("v.query_info"); v.query_info = ""; v.query_info.report_element_type = "overview"; v.query_info.header = ""; delete_node("v.query_result"); v.query_result = ""; query_result = "v.query_result"; node overview_query_header = cached_overview_query_info{"header"}; clone_node(overview_query_header, "v.query_info.header"); debug_message("#### query_info of overview report:\n" . node_as_string("v.query_info") . "\n"); debug_message("#### get_overview_query_result() - query_db_for_report() START \n"); query_db_for_report("v.query_info", query_result, "tbl"); debug_message("#### get_overview_query_result() - query_db_for_report() DONE \n"); # # Handle average denominator field, if any # # We don't do that here because the average denominator is handled by a report field # which is based on a database field with an expression, and expression evaluation # is handled in the query header if the overview report is part of a table report. # For overview reports we handle the average_denominator_field in the raw overview # code. # # Save query result to cache, also save the node type so that we can restore the types, # else we may get wrong results when dividing float by string. # foreach item query_result ( item_name = node_name(item); item_type = node_type(item); saved_query_result_path . "." . item_name . ".item_type" = item_type; saved_query_result_path . "." . item_name . ".item_value" = @item; ); save_node(saved_query_result_path); debug_message("#### get_overview_query_result() - NO CHACHED OVERVIEW QUERY RESULT --> EXECUTED query_db_for_report() \n"); ) else ( # Create a query_result from saved_query_result, with original node types! saved_query_result = saved_query_result_path; query_result = new_node(); debug_message("#### get_overview_query_result() - GOT OVERVIEW QUERY RESULT FROM CACHE \n"); foreach item saved_query_result ( item_name = node_name(item); item_type = @item{"item_type"}; # Create new query_result node query_result{item_name} = ""; # Set node type set_node_type(query_result{item_name}, item_type); # Set actual value query_result{item_name} = @item{"item_value"}; ); ); # debug_message("#### query_db_for_report\n" . node_as_string(query_result) . "\n"); debug_message("\n\n#### get_overview_query_result() END \n\n"); query_result; )); subroutine(get_sessions_overview_query_result( string profile_name, string database_last_modification_time, string filter_expression), ( # Returns a cached or new sessions overview query result debug_message("\n\n#### get_sessions_overview_query_result() START \n\n"); string query_id = "sessions_overview_" . md5_digest(database_last_modification_time . filter_expression); string profiles_cache_path = "profiles_cache." . profile_name; string saved_query_result_path = profiles_cache_path . ".queries." . query_id; node query_result; if (!?(saved_query_result_path)) then ( # # # No cached overview query exists, perform query now # # volatile.filters = filter_expression; delete_node("v.query_info"); v.query_info = ""; v.query_info.report_element_type = "sessions_overview"; v.query_info.header = ""; delete_node("v.query_result"); v.query_result = ""; query_result = "v.query_result"; # debug_message("#### query_info of overview report:\n" . node_as_string("v.query_info") . "\n"); query_db_for_report("v.query_info", query_result, "tbl"); # Save query result to cache clone_node(query_result, saved_query_result_path); save_node(saved_query_result_path); debug_message("#### get_sessions_overview_query_result() - NO CHACHED SESSIONS OVERVIEW QUERY RESULT --> EXECUTED query_db_for_report() \n"); ) else ( query_result = saved_query_result_path; debug_message("#### get_sessions_overview_query_result() - GOT SESSIONS OVERVIEW QUERY RESULT FROM CACHE \n"); ); debug_message("#### get_sessions_overview_query_result\n" . node_as_string(query_result) . "\n"); debug_message("\n\n#### get_sessions_overview_query_result() END \n\n"); query_result; ));