# # # verify_caches_util.cfv # # # check_profile_cache_integrity() # add_overview_query_header() # check_extended_profile_dat_query_fields_for_hidden_field_categories() # create_cross_reference_groups_table_lookup() # create_extended_profile_dat() # include "templates.util.query_fields_util"; include "templates.statistics.util.get_xref_table_id"; include "templates.statistics.util.weekday_util"; # # # # check_profile_cache_integrity() # # # subroutine(check_profile_cache_integrity(string profile_name), ( # Verfies if the profile cache directories exist, respectively creates them if they don't exist string log_analysis_info_directory = LOGANALYSISINFO_DIRECTORY; string profiles_cache_node_path = "profiles_cache." . profile_name; string profile_cache_directory_path = log_analysis_info_directory . "profiles_cache/" . profile_name; if (!?("filters_cache")) then ( # create filters_cache directory # debug_message("\n\n#### filters_cache folder exists: NO \n\n"); make_directory(log_analysis_info_directory . "filters_cache"); ); if (!?("profiles_cache")) then ( # create profiles_cache directory # debug_message("\n\n#### profiles_cache folder exists: NO \n\n"); make_directory(log_analysis_info_directory . "profiles_cache"); ); if (!?(profiles_cache_node_path)) then ( # create profile directory make_directory(profile_cache_directory_path); ); if (!?(profiles_cache_node_path . ".miscellaneous")) then ( # create filters directory make_directory(profile_cache_directory_path . "/miscellaneous"); ); if (!?(profiles_cache_node_path . ".row_visibility_cutoff_filter_expressions")) then ( # create filters directory make_directory(profile_cache_directory_path . "/row_visibility_cutoff_filter_expressions"); ); if (!?(profiles_cache_node_path . ".queries")) then ( # create queries directory make_directory(profile_cache_directory_path . "/queries"); ); if (!?(profiles_cache_node_path . ".html_report_elements")) then ( # create html_report_elements directory make_directory(profile_cache_directory_path . "/html_report_elements"); ); if (!?(profiles_cache_node_path . ".raw_report_elements")) then ( # create raw_report_elements directory make_directory(profile_cache_directory_path . "/raw_report_elements"); ); if (!?(profiles_cache_node_path . ".raw_graphs")) then ( # create raw_graphs directory make_directory(profile_cache_directory_path . "/raw_graphs"); ); )); # # # # add_overview_query_header() # # # subroutine(add_overview_query_header( node profile_dat), ( node query_fields = profile_dat{"query_fields"}; profile_dat . ".overview_query_info.header" = ""; node overview_query_header = profile_dat . ".overview_query_info.header"; bool is_average_denominator_field = false; node item; int column_count = 0; foreach item query_fields( if (@item{"is_aggregating_field"} and !@item{"is_expression"}) then ( # Clone field to overview query header clone_node(item, overview_query_header . "." . column_count); # Check if this field has an average_denominator_field if (@item{"is_expression"} and item?{"average_denominator_field"}) then ( is_average_denominator_field = true; ); column_count++; ); ); # Add overview query header checksum (it is used for caching id) string overview_query_header_checksum = md5_digest(node_as_string(overview_query_header)); profile_dat . ".overview_query_info.is_average_denominator_field" = is_average_denominator_field; profile_dat . ".overview_query_info.header_checksum" = overview_query_header_checksum; )); # # # # check_extended_profile_dat_query_fields_for_hidden_field_categories() # # # subroutine(check_extended_profile_dat_query_fields_for_hidden_field_categories( string session_id, string profile_name, string extended_profile_dat_path), ( # Check the super_role of this user and profile # If the super role contains field_category permissions # then we have to set the query_field display_format_type of any listed # field_category to hidden. # user_grants only exists for non-root_admins if (?("sessions_cache." . session_id . ".session_info.user_grants")) then ( node user_grants = "sessions_cache." . session_id . ".session_info.user_grants"; string super_role_name; if (?(user_grants . ".profiles_grants." . profile_name)) then ( # If there is a super role for this specific profile super_role_name = @(user_grants . ".profiles_grants." . profile_name . ".super_role") ) else ( # Try super role for all profiles super_role_name = @(user_grants . ".all_profiles_grants.super_role"); ); if (?(user_grants . ".super_roles." . super_role_name . ".field_categories")) then ( node field_categories = user_grants . ".super_roles." . super_role_name . ".field_categories"; node query_fields = extended_profile_dat_path . ".query_fields"; node item; string category; foreach item query_fields ( category = @item{"category"}; if ((category ne "") and field_categories?{category}) then ( # The field category of this query field exists in the super role, # so it must be hidden. We hide the field by changing the query_field # display_format_type to hidden. set_subnode_value(item, "display_format_type", "-%-"); ); ); ); ); )); # # # # create_cross_reference_groups_table_lookup() # # # subroutine(create_cross_reference_groups_table_lookup( node profile, node cross_reference_groups_table_lookup), ( # This creates a lookup for xref tables which could be used instead of regular ssql table # to speed up report display. # We only add relevant cross_reference_groups, they must meet following conditions: # --> use_flat_table must be true # --> The fields do not contain a date_time field # --> The fields contain only one non-aggregating field # The node name of the lookup node is the xref_table_id, its value the corresponding xref table name. if (?(profile . ".database.cross_reference_groups")) then ( node cross_reference_groups = profile . ".database.cross_reference_groups"; node xref_group_item; node xref_field_item; node xref_fields; string sort_by; string sort_direction; bool has_date_time_field; int num_of_non_aggregating_fields = 0; string db_field_name; string aggregation_method; node db_fields = profile . ".database.fields"; node db_field_item; int first_weekday = get_calendar_first_weekday(profile); string xref_table_id; int xref_group_node_position = 0; foreach xref_group_item cross_reference_groups ( if (!@xref_group_item{"disabled"} and @xref_group_item{"use_flat_table"}) then ( node xref_fields = xref_group_item{"fields"}; has_date_time_field = false; num_of_non_aggregating_fields = 0; foreach xref_field_item xref_fields ( db_field_name = node_name(xref_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 (db_field_name eq "date_time") then ( # has_date_time_field = true; # last; # ); if (aggregation_method eq "none") then ( num_of_non_aggregating_fields = num_of_non_aggregating_fields + 1; ); ); ); if (!has_date_time_field and num_of_non_aggregating_fields == 1) then ( # This is a relevant xref group. Add the group to the lookup node if # it doesn't yet exist. # sort_by is a database field name! sort_by = if (xref_group_item?{"sort_by"}) then (@xref_group_item{"sort_by"}) else (""); sort_direction = if (xref_group_item?{"sort_direction"}) then (@xref_group_item{"sort_direction"}) else (""); xref_table_id = get_xref_table_id(xref_fields, sort_by, sort_direction, first_weekday); if (!cross_reference_groups_table_lookup?{xref_table_id}) then ( # Set lookup node name and as value the xref table name. @cross_reference_groups_table_lookup{xref_table_id} = "xref" . xref_group_node_position; ); ); ); xref_group_node_position++; ); ); )); # # # # create_extended_profile_dat() # # # subroutine(create_extended_profile_dat( node profile, string extended_profile_dat_id, string extended_profile_dat_path), ( # Creates / re-creates the extended_profile_dat file in profiles_cache or sessions_cache, specified by extended_profile_dat_path if (?(extended_profile_dat_path)) then ( delete_node(extended_profile_dat_path); ); # # # Create the query_fields and clone it to extended_profile_dat # # node query_fields = query_fields_util_create_query_fields(profile); clone_node(query_fields, extended_profile_dat_path . ".query_fields"); # # # Add the internal_table_filter_expression_helper_column report field to the query fields # This report field is only used to handle the table_filter_expression of a report element # and does not exist in the profile! # # extended_profile_dat_path . ".query_fields.internal_table_filter_expression_helper_column" = ""; node row_visibility_helper = extended_profile_dat_path . ".query_fields.internal_table_filter_expression_helper_column"; # set_subnode_value(row_visibility_helper, "derivation_method", "expression"); set_subnode_value(row_visibility_helper, "report_field_name", "internal_table_filter_expression_helper_column"); set_subnode_value(row_visibility_helper, "report_field_label", "internal_table_filter_expression_helper_column"); set_subnode_value(row_visibility_helper, "column_label", "internal_table_filter_expression_helper_column"); set_subnode_value(row_visibility_helper, "table_field_name", "internal_table_filter_expression_helper_column"); set_subnode_value(row_visibility_helper, "table_field_type", "int"); set_subnode_value(row_visibility_helper, "aggregation_method", "sum"); set_subnode_value(row_visibility_helper, "expression", ""); # expression is set per report element when the report field is used! set_subnode_value(row_visibility_helper, "type", "int"); set_subnode_value(row_visibility_helper, "display_format_type", ""); set_subnode_value(row_visibility_helper, "category", ""); set_subnode_value(row_visibility_helper, "database_field_name", ""); set_subnode_value(row_visibility_helper, "database_field_type", ""); set_subnode_value(row_visibility_helper, "is_aggregating_field", "true"); set_subnode_value(row_visibility_helper, "percent_calculation", "sum"); set_subnode_value(row_visibility_helper, "show_remainder_value", "false"); set_subnode_value(row_visibility_helper, "show_average_value", "false"); set_subnode_value(row_visibility_helper, "show_min_value", "false"); set_subnode_value(row_visibility_helper, "show_max_value", "false"); set_subnode_value(row_visibility_helper, "show_total_value", "false"); set_subnode_value(row_visibility_helper, "is_date_time_in_epoc", "false"); set_subnode_value(row_visibility_helper, "is_expression", "true"); set_subnode_value(row_visibility_helper, "field_name", ""); @row_visibility_helper{"rgb_color"}{"red"} = 0; @row_visibility_helper{"rgb_color"}{"green"} = 0; @row_visibility_helper{"rgb_color"}{"blue"} = 0; @row_visibility_helper{"hex_color"} = "000000"; @row_visibility_helper{"table_bar_graph_single_hex_color"} = "000000"; # # # # Create the overview report query header # # # add_overview_query_header(extended_profile_dat_path); # # # # Get the sessions_page info # # The sessions_page_db_field_name and sessions_page_db_field_number are required # in the session_page_paths report element to resolve page names from item numbers. # # 22/Jan/2010 - log.field_options is no longer available. # 28/Dec/2010 - since nunchaku we get the session page field from the report element in the path through the page code # #* string sessions_page_db_field_name = @(profile . ".log.field_options.sessions_page_field"); string sessions_page_db_field_name = @(profile . ".log.field_options.sessions_page_field"); # KHP 16/Aug/2010 - Get validated database fields node database_fields = get_validated_database_fields(profile); node db_field_item; int sessions_page_db_field_number; int db_field_count = 0; if (sessions_page_db_field_name ne "") then ( foreach db_field_item database_fields ( if (node_name(db_field_item) eq sessions_page_db_field_name) then ( sessions_page_db_field_number = db_field_count; last; ) db_field_count++; ); ) extended_profile_dat_path . ".sessions_page_db_field_name" = sessions_page_db_field_name; extended_profile_dat_path . ".sessions_page_db_field_number" = sessions_page_db_field_number; ); *# # # # Check if there are any hidden query fields via RBAC # # check_extended_profile_dat_query_fields_for_hidden_field_categories(session_id, profile_name, extended_profile_dat_path); # # # Add cross_refecence_groups (xref) lookup. # This shows all xref gropus which are appropriate to be used as alternative sorted table # # extended_profile_dat_path . ".cross_reference_groups_table_lookup" = ""; node cross_reference_groups_table_lookup = extended_profile_dat_path . ".cross_reference_groups_table_lookup"; create_cross_reference_groups_table_lookup(profile, cross_reference_groups_table_lookup); # # # Get extended_profile_dat_checksum # Get this checksum before the extended_profile_dat_id is added! # string extended_profile_dat_checksum = md5_digest(node_as_string(extended_profile_dat_path)); extended_profile_dat_path . ".extended_profile_dat_checksum" = extended_profile_dat_checksum; # # Add current extended_profile_dat_id to extended_profile_dat # # Add the current extended_profile_dat_id to the extended_profile_dat_path, it is used to check # if the extended_profile_dat data are up to date. extended_profile_dat_path . ".extended_profile_dat_id" = extended_profile_dat_id; save_node(extended_profile_dat_path); ));