Class: SqlGenius::QueriesController

Inherits:
BaseController show all
Includes:
AiFeatures, DatabaseAnalysis, QueryExecution, SharedViewHelpers
Defined in:
app/controllers/sql_genius/queries_controller.rb

Instance Method Summary collapse

Methods included from SharedViewHelpers

#capability?, #path_for, #render_partial

Methods included from AiFeatures

#anomaly_detection, #connection_advisor, #describe_query, #index_advisor, #index_planner, #innodb_health, #migration_risk, #optimize, #pattern_grouper, #rewrite_query, #root_cause, #schema_review, #suggest, #variable_review, #workload_digest

Methods included from DatabaseAnalysis

#duplicate_indexes, #query_stats, #server_overview, #table_sizes, #unused_indexes

Methods included from QueryExecution

#execute, #explain

Instance Method Details

#columnsObject



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/controllers/sql_genius/queries_controller.rb', line 24

def columns
  result = SqlGenius::Core::Analysis::Columns.new(
    rails_connection,
    blocked_tables: sql_genius_config.blocked_tables,
    masked_column_patterns: sql_genius_config.masked_column_patterns,
    default_columns: sql_genius_config.default_columns,
  ).call(table: params[:table])

  case result.status
  when :ok        then render(json: result.columns)
  when :blocked   then render(json: { error: result.error_message }, status: :forbidden)
  when :not_found then render(json: { error: result.error_message }, status: :not_found)
  end
end

#indexObject



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'app/controllers/sql_genius/queries_controller.rb', line 10

def index
  @featured_tables = if sql_genius_config.featured_tables.any?
    sql_genius_config.featured_tables.sort
  else
    queryable_tables.sort
  end
  @all_tables = queryable_tables.sort
  @ai_enabled = sql_genius_config.ai_enabled?
  @framework_version_major = Rails::VERSION::MAJOR
  @framework_version_minor = Rails::VERSION::MINOR
  @identifier_quote_char = identifier_quote_char
  render("sql_genius/queries/dashboard")
end

#query_detailObject



39
40
41
42
# File 'app/controllers/sql_genius/queries_controller.rb', line 39

def query_detail
  @digest = params[:digest].to_s
  render("sql_genius/queries/query_detail")
end

#query_historyObject



44
45
46
47
48
49
50
51
52
53
54
# File 'app/controllers/sql_genius/queries_controller.rb', line 44

def query_history
  digest = params[:digest].to_s

  query_history_service = SqlGenius::Core::Analysis::QueryHistory.new(rails_connection)
  current_query = query_history_service.call(digest)
  history = fetch_query_history_series(digest, query_history_service)

  render(json: { query: current_query, history: history })
rescue StandardError => e
  render(json: { error: e.message }, status: :unprocessable_entity)
end

#slow_queriesObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/controllers/sql_genius/queries_controller.rb', line 56

def slow_queries
  unless sql_genius_config.redis_url.present?
    return render(json: [], status: :ok)
  end

  require "redis"
  redis = Redis.new(url: sql_genius_config.redis_url)
  key = SlowQueryMonitor.redis_key
  raw = redis.lrange(key, 0, 199)
  queries = raw.map do |entry|
    JSON.parse(entry)
  rescue JSON::ParserError
    nil
  end.compact
  render(json: queries)
rescue StandardError => e
  render(json: { error: "Slow query error: #{e.message}" }, status: :unprocessable_entity)
end