Class: RailsConsolePro::Services::ColumnStatsCalculator
- Inherits:
-
Object
- Object
- RailsConsolePro::Services::ColumnStatsCalculator
- Defined in:
- lib/rails_console_pro/services/column_stats_calculator.rb
Overview
Service for calculating column statistics
Class Method Summary collapse
Instance Method Summary collapse
- #calculate ⇒ Object
-
#initialize(model_class, connection, table_name, safe_count_proc, config) ⇒ ColumnStatsCalculator
constructor
A new instance of ColumnStatsCalculator.
Constructor Details
#initialize(model_class, connection, table_name, safe_count_proc, config) ⇒ ColumnStatsCalculator
11 12 13 14 15 16 17 |
# File 'lib/rails_console_pro/services/column_stats_calculator.rb', line 11 def initialize(model_class, connection, table_name, safe_count_proc, config) @model_class = model_class @connection = connection @table_name = table_name @safe_count = safe_count_proc @config = config end |
Class Method Details
.calculate(model_class, connection, table_name, safe_count_proc, config) ⇒ Object
7 8 9 |
# File 'lib/rails_console_pro/services/column_stats_calculator.rb', line 7 def self.calculate(model_class, connection, table_name, safe_count_proc, config) new(model_class, connection, table_name, safe_count_proc, config).calculate end |
Instance Method Details
#calculate ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/rails_console_pro/services/column_stats_calculator.rb', line 19 def calculate # Skip for large tables (already checked in execute_stats, but defensive) return {} if ModelValidator.large_table?(@model_class) column_names = ModelValidator.safe_column_names(@model_class) return {} unless column_names.any? column_stats = {} total_count = @safe_count.call # Skip distinct count for very large tables (performance) skip_distinct_threshold = @config.stats_skip_distinct_threshold skip_distinct = total_count >= skip_distinct_threshold column_names.each do |column_name| stats = {} # Count nulls (safe with error handling) begin null_count = @model_class.where("#{@connection.quote_column_name(column_name)} IS NULL").count stats[:null_count] = null_count if null_count > 0 rescue => e # Skip if column doesn't support null checks or query fails end # Count distinct values (only for smaller tables) unless skip_distinct begin distinct_count = @model_class.distinct.count(column_name) stats[:distinct_count] = distinct_count if distinct_count > 0 rescue => e # Skip if calculation fails end end column_stats[column_name] = stats if stats.any? end column_stats rescue => e {} # Return empty hash on any error end |