@@ -5,21 +5,29 @@ class QueriesController < ApplicationController
55 before_action :set_query , only : :show
66
77 def index
8+ @average_query_times_metric_card = RailsPulse ::Queries ::Cards ::AverageQueryTimes . new ( query : @query ) . to_metric_card
9+ @percentile_query_times_metric_card = RailsPulse ::Queries ::Cards ::PercentileQueryTimes . new ( query : @query ) . to_metric_card
10+ @execution_rate_metric_card = RailsPulse ::Queries ::Cards ::ExecutionRate . new ( query : @query ) . to_metric_card
11+
812 setup_chart_and_table_data
913 end
1014
1115 def show
16+ @average_query_times_metric_card = RailsPulse ::Queries ::Cards ::AverageQueryTimes . new ( query : @query ) . to_metric_card
17+ @percentile_query_times_metric_card = RailsPulse ::Queries ::Cards ::PercentileQueryTimes . new ( query : @query ) . to_metric_card
18+ @execution_rate_metric_card = RailsPulse ::Queries ::Cards ::ExecutionRate . new ( query : @query ) . to_metric_card
19+
1220 setup_chart_and_table_data
1321 end
1422
1523 private
1624
1725 def chart_model
18- show_action? ? Operation : Query
26+ Summary
1927 end
2028
2129 def table_model
22- show_action? ? Operation : Query
30+ show_action? ? Operation : Summary
2331 end
2432
2533 def chart_class
@@ -31,75 +39,56 @@ def chart_options
3139 end
3240
3341 def build_chart_ransack_params ( ransack_params )
34- base_params = ransack_params . except ( :s )
42+ base_params = ransack_params . except ( :s ) . merge (
43+ avg_duration : @start_duration ,
44+ period_start_gteq : Time . at ( @start_time ) ,
45+ period_start_lt : Time . at ( @end_time )
46+ )
3547
3648 if show_action?
37- base_params . merge (
38- query_id_eq : @query . id ,
39- occurred_at_gteq : Time . at ( @start_time ) ,
40- occurred_at_lt : Time . at ( @end_time ) ,
41- duration_gteq : @start_duration
42- )
49+ base_params . merge ( summarizable_id_eq : @query . id )
4350 else
44- base_params . merge (
45- operations_occurred_at_gteq : Time . at ( @start_time ) ,
46- operations_occurred_at_lt : Time . at ( @end_time ) ,
47- operations_duration_gteq : @start_duration
48- )
51+ base_params
4952 end
5053 end
5154
5255 def build_table_ransack_params ( ransack_params )
5356 if show_action?
57+ # For Operation model on show page
5458 ransack_params . merge (
55- query_id_eq : @query . id ,
5659 occurred_at_gteq : Time . at ( @table_start_time ) ,
5760 occurred_at_lt : Time . at ( @table_end_time ) ,
58- duration_gteq : @start_duration
59- )
61+ query_id_eq : @query . id
62+ ) . tap { | params | params [ :duration_gteq ] = @start_duration if @start_duration }
6063 else
64+ # For Summary model on index page
6165 ransack_params . merge (
62- operations_occurred_at_gteq : Time . at ( @table_start_time ) ,
63- operations_occurred_at_lt : Time . at ( @table_end_time ) ,
64- operations_duration_gteq : @start_duration
66+ avg_duration : @start_duration ,
67+ period_start_gteq : Time . at ( @table_start_time ) ,
68+ period_start_lt : Time . at ( @table_end_time )
6569 )
6670 end
6771 end
6872
6973 def default_table_sort
70- "occurred_at desc"
74+ show_action? ? "occurred_at desc" : "period_start desc"
7175 end
7276
7377 def build_table_results
7478 if show_action?
75- @ransack_query . result . select ( "id" , "occurred_at" , "duration" )
79+ @ransack_query . result
7680 else
77- # Optimized query: Use INNER JOIN since we only want queries with operations in time range
78- # This dramatically reduces the dataset before aggregation
79- @ransack_query . result ( distinct : false )
80- . joins ( "INNER JOIN rails_pulse_operations ON rails_pulse_operations.query_id = rails_pulse_queries.id" )
81- . where ( "rails_pulse_operations.occurred_at >= ? AND rails_pulse_operations.occurred_at < ?" ,
82- Time . at ( @table_start_time ) , Time . at ( @table_end_time ) )
83- . group ( "rails_pulse_queries.id, rails_pulse_queries.normalized_sql, rails_pulse_queries.created_at, rails_pulse_queries.updated_at" )
84- . select (
85- "rails_pulse_queries.*" ,
86- optimized_aggregations_sql
87- )
81+ Queries ::Tables ::Index . new (
82+ ransack_query : @ransack_query ,
83+ period_type : period_type ,
84+ start_time : @start_time ,
85+ params : params
86+ ) . to_table
8887 end
8988 end
9089
9190 private
9291
93- def optimized_aggregations_sql
94- # Efficient aggregations that work with our composite indexes
95- [
96- "COALESCE(AVG(rails_pulse_operations.duration), 0) AS average_query_time_ms" ,
97- "COUNT(rails_pulse_operations.id) AS execution_count" ,
98- "COALESCE(SUM(rails_pulse_operations.duration), 0) AS total_time_consumed" ,
99- "MAX(rails_pulse_operations.occurred_at) AS occurred_at"
100- ] . join ( ", " )
101- end
102-
10392 def show_action?
10493 action_name == "show"
10594 end
@@ -108,14 +97,13 @@ def pagination_method
10897 show_action? ? :set_pagination_limit : :store_pagination_limit
10998 end
11099
111- def set_query
112- @query = Query . find ( params [ :id ] )
100+ def setup_time_and_response_ranges
101+ @start_time , @end_time , @selected_time_range , @time_diff_hours = setup_time_range
102+ @start_duration , @selected_response_range = setup_duration_range ( :query )
113103 end
114104
115- def setup_metic_cards
116- @average_query_times_card = Queries ::Cards ::AverageQueryTimes . new ( query : @query ) . to_metric_card
117- @percentile_response_times_card = Queries ::Cards ::PercentileQueryTimes . new ( query : @query ) . to_metric_card
118- @execution_rate_card = Queries ::Cards ::ExecutionRate . new ( query : @query ) . to_metric_card
105+ def set_query
106+ @query = Query . find ( params [ :id ] )
119107 end
120108 end
121109end
0 commit comments