Class: QueryGuard::Explain::ExplainEnricher

Inherits:
Object
  • Object
show all
Defined in:
lib/query_guard/explain/explain_enricher.rb

Overview

Converts EXPLAIN signals into QueryGuard Finding objects. Enriches existing risk findings with actual plan data and index suggestions.

Example:

adapter = PostgreSQLAdapter.new(connection)
enricher = ExplainEnricher.new(adapter)
findings = enricher.enrich(existing_findings, query)

Instance Method Summary collapse

Constructor Details

#initialize(adapter, config = {}) ⇒ ExplainEnricher

Returns a new instance of ExplainEnricher.



13
14
15
16
17
18
# File 'lib/query_guard/explain/explain_enricher.rb', line 13

def initialize(adapter, config = {})
  @adapter = adapter
  @config = config
  @logger = config[:logger]
  @index_suggester = Suggest::IndexSuggester.new
end

Instance Method Details

#can_enrich?(query) ⇒ Boolean

Check if this query can be enriched with EXPLAIN

Parameters:

Returns:

  • (Boolean)


47
48
49
50
51
# File 'lib/query_guard/explain/explain_enricher.rb', line 47

def can_enrich?(query)
  return false if query.nil? || query.sql.nil?

  @adapter.can_explain?(query.sql)
end

#enrich(findings, query, context = nil) ⇒ Array<Core::Finding>

Enrich findings with EXPLAIN analysis

Parameters:

  • findings (Array<Core::Finding>) —

    Existing findings from risk analyzers

  • query (Core::Query) —

    The query to analyze

  • context (Core::Context, nil) (defaults to: nil) —

    Request context

Returns:

  • (Array<Core::Finding>) —

    Original + new findings from EXPLAIN



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/query_guard/explain/explain_enricher.rb', line 26

def enrich(findings, query, context = nil)
  return findings if findings.nil? || query.nil?
  return findings unless can_enrich?(query)

  new_findings = []

  begin
    explain_findings = analyze_with_explain(query, context)
    new_findings.concat(explain_findings)
  rescue StandardError => e
    log_error("EXPLAIN enrichment failed: #{e.message}", query)
    # Graceful degradation: return original findings on error
  end

  findings + new_findings
end