class AwesomeExplain::Renderers::Mongoid
Attributes
query[R]
result[R]
Public Class Methods
new(query, result = nil)
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 6 def initialize(query, result = nil) @query = query @result = result || query.explain end
Public Instance Methods
dig_input_stages(stage, str, used_indexes, input_stages = false)
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 87 def dig_input_stages(stage, str, used_indexes, input_stages = false) used_indexes << "#{stage.dig('indexName')} (#{stage.dig('direction')})" if stage.dig('indexName').present? if stage.dig('inputStage').nil? && stage.dig('inputStages').nil? str += ' -> ' + stage_label_and_stats(stage) end if stage.dig('inputStage').present? str += ' ->' if !input_stages str += ' ' + stage_label_and_stats(stage) str = dig_input_stages(stage.dig('inputStage'), str, used_indexes, input_stages) end if stage.dig('inputStages').present? str += ' -> ' + stage_label_and_stats(stage) + ' ->' str += ' [ ' stage.dig('inputStages').each_with_index do |s, idx| str = dig_input_stages(s, str, used_indexes, true) str += ' , ' if idx < stage.dig('inputStages').size - 1 end str += ' ] ' end str end
execution_stats()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 83 def execution_stats root.dig('executionStats') || root['stages']&.first&.dig('$cursor')&.dig('executionStats') || {} end
explain_summary()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 18 def explain_summary table = Terminal::Table.new do |t| winning_plan_label = 'Winning Plan' plan_data = winning_plan_data winning_plan_str = plan_data[0] used_indexes = plan_data[1] winning_plan_label = AwesomeExplain::Utils::Color.fg_color :red, winning_plan_label if winning_plan_str =~ /COLLSCAN/ t << [winning_plan_label, winning_plan_str] t << :separator t << ['Used Indexes', used_indexes.join(', ')] if execution_stats t << :separator t << ['Rejected Plans', rejected_plans.size] t << :separator t << ['Documents Returned', execution_stats.dig('nReturned')] t << :separator t << ['Documents Examined', execution_stats.dig('totalDocsExamined')] t << :separator t << ['Keys Examined', execution_stats.dig('totalKeysExamined')] t << :separator # Execution Time exec_time = execution_stats.dig('executionTimeMillis').to_f/1000 exec_time_ms = execution_stats.dig('executionTimeMillis') exec_label = 'Execution time(s)' exec_label_ms = 'Execution time(ms)' if exec_time > 10 exec_label = AwesomeExplain::Utils::Color.fg_color :red, exec_label exec_label_ms = AwesomeExplain::Utils::Color.fg_color :red, exec_label_ms end t << [exec_label_ms, exec_time_ms] t << :separator t << [exec_label, exec_time] end end table end
parsed_query()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 58 def parsed_query root.dig('parsedQuery') end
print()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 11 def print ap result, indent: -2 puts puts explain_summary puts end
rejected_plans()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 79 def rejected_plans root.dig('queryPlanner', 'rejectedPlans') || root['stages']&.first['$cursor'].dig('queryPlanner', 'rejectedPlans') || {} end
root()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 71 def root result.dig('$cursor') || result end
stage_label_and_stats(stage)
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 111 def stage_label_and_stats(stage) return unless stage.present? str = "#{stage.dig('stage')} (" str += "#{stage.dig('docsExamined')} / " if stage.dig('docsExamined').present? str += stage.dig('nReturned').to_s if stage.dig('nReturned').present? str += ')' str.gsub(' ()', '') end
winning_plan()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 75 def winning_plan root.dig('executionStats', 'executionStages') || root.dig('queryPlanner', 'winningPlan') || root['stages'].first['$cursor'].dig('queryPlanner', 'winningPlan') || {} end
winning_plan_data()
click to toggle source
# File lib/awesome_explain/renderers/mongoid.rb, line 62 def winning_plan_data used_indexes = [] plan = winning_plan plan_str = stage_label_and_stats(plan) plan_str = dig_input_stages(plan.dig('inputStage'), plan_str, used_indexes) if plan&.dig('inputStage') [plan_str, used_indexes] end