mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-16 13:51:41 +00:00
Correr Blazer sincrónicamente
Deshabilitamos la funcionalidad asincrónica de Blazer porque ejecuta unos malabares extraños con JS, que filtran la consulta hacia el código. La idea es ejecutar consultas más livianas, con lo que por ahora no lo necesitamos. Podríamos recuperar esto usando ActionCable luego. Además, reimplementa la lógica de generación de gráficos en el controlador, para simplificar la vista.
This commit is contained in:
parent
49e5603687
commit
85ad518d8d
4 changed files with 232 additions and 1 deletions
|
@ -33,6 +33,149 @@ module BlazerDecorator
|
|||
def cancel; end
|
||||
end
|
||||
end
|
||||
|
||||
# Blazer hace un gran esfuerzo para ejecutar consultas de forma
|
||||
# asincrónica pero termina enviándolas por JS.
|
||||
module RunSync
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
alias_method :original_show, :show
|
||||
|
||||
include Blazer::BaseHelper
|
||||
|
||||
def show
|
||||
original_show
|
||||
|
||||
options = { user: blazer_user, query: @query, run_id: SecureRandom.uuid, async: false }
|
||||
@data_source = Blazer.data_sources[@query.data_source]
|
||||
@result = Blazer::RunStatement.new.perform(@data_source, @statement, options)
|
||||
chart_data
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# blazer-2.4.2/app/views/blazer/queries/run.html.erb
|
||||
def chart_type
|
||||
case @result.chart_type
|
||||
when /\Aline(2)?\z/
|
||||
chart_options.merge! min: nil
|
||||
when /\Abar(2)?\z/
|
||||
chart_options.merge! library: { tooltips: { intersect: false, axis: 'x' } }
|
||||
when 'pie'
|
||||
chart_options
|
||||
when 'scatter'
|
||||
chart_options.merge! library: { tooltips: { intersect: false } }, xtitle: @result.columns[0],
|
||||
ytitle: @result.columns[1]
|
||||
when nil
|
||||
else
|
||||
if @result.column_types.size == 2
|
||||
chart_options.merge! library: { tooltips: { intersect: false, axis: 'x' } }
|
||||
else
|
||||
chart_options.merge! library: { tooltips: { intersect: false } }
|
||||
end
|
||||
end
|
||||
|
||||
@result.chart_type
|
||||
end
|
||||
|
||||
def chart_data
|
||||
@chart_data ||=
|
||||
case chart_type
|
||||
when 'line'
|
||||
@result.columns[1..-1].each_with_index.map do |k, i|
|
||||
{
|
||||
name: blazer_series_name(k),
|
||||
data: @result.rows.map do |r|
|
||||
[r[0], r[i + 1]]
|
||||
end,
|
||||
library: series_library[i]
|
||||
}
|
||||
end
|
||||
when 'line2'
|
||||
@result.rows.group_by do |r|
|
||||
v = r[1]
|
||||
(@result.boom[@result.columns[1]] || {})[v.to_s] || v
|
||||
end.each_with_index.map do |(name, v), i|
|
||||
{
|
||||
name: blazer_series_name(name),
|
||||
data: v.map do |v2|
|
||||
[v2[0], v2[2]]
|
||||
end,
|
||||
library: series_library[i]
|
||||
}
|
||||
end
|
||||
when 'pie'
|
||||
@result.rows.map do |r|
|
||||
[(@result.boom[@result.columns[0]] || {})[r[0].to_s] || r[0], r[1]]
|
||||
end
|
||||
when 'bar'
|
||||
(@result.rows.first.size - 1).times.map do |i|
|
||||
name = @result.columns[i + 1]
|
||||
|
||||
{
|
||||
name: blazer_series_name(name),
|
||||
data: @result.rows.first(20).map do |r|
|
||||
[(@result.boom[@result.columns[0]] || {})[r[0].to_s] || r[0], r[i + 1]]
|
||||
end
|
||||
}
|
||||
end
|
||||
when 'bar2'
|
||||
first_20 = @result.rows.group_by { |r| r[0] }.values.first(20).flatten(1)
|
||||
labels = first_20.map { |r| r[0] }.uniq
|
||||
series = first_20.map { |r| r[1] }.uniq
|
||||
labels.each do |l|
|
||||
series.each do |s|
|
||||
first_20 << [l, s, 0] unless first_20.find { |r| r[0] == l && r[1] == s }
|
||||
end
|
||||
end
|
||||
|
||||
first_20.group_by do |r|
|
||||
v = r[1]
|
||||
(@result.boom[@result.columns[1]] || {})[v.to_s] || v
|
||||
end.each_with_index.map do |(name, v), _i|
|
||||
{
|
||||
name: blazer_series_name(name),
|
||||
data: v.sort_by do |r2|
|
||||
labels.index(r2[0])
|
||||
end.map do |v2|
|
||||
v3 = v2[0]
|
||||
[(@result.boom[@result.columns[0]] || {})[v3.to_s] || v3, v2[2]]
|
||||
end
|
||||
}
|
||||
end
|
||||
when 'scatter'
|
||||
@result.rows
|
||||
end
|
||||
end
|
||||
|
||||
def target_index
|
||||
@target_index ||= @result.columns.index do |k|
|
||||
k.downcase == 'target'
|
||||
end
|
||||
end
|
||||
|
||||
def series_library
|
||||
@series_library ||= {}.tap do |sl|
|
||||
if target_index
|
||||
color = '#109618'
|
||||
sl[target_index - 1] = {
|
||||
pointStyle: 'line',
|
||||
hitRadius: 5,
|
||||
borderColor: color,
|
||||
pointBackgroundColor: color,
|
||||
backgroundColor: color,
|
||||
pointHoverBackgroundColor: color
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def chart_options
|
||||
@chart_options ||= { id: SecureRandom.hex }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
classes = [Blazer::QueriesController, Blazer::ChecksController, Blazer::DashboardsController]
|
||||
|
@ -42,3 +185,5 @@ classes.each do |klass|
|
|||
klass.include modul unless klass.included_modules.include? modul
|
||||
end
|
||||
end
|
||||
|
||||
Blazer::QueriesController.include BlazerDecorator::RunSync
|
||||
|
|
51
app/views/blazer/queries/show.haml
Normal file
51
app/views/blazer/queries/show.haml
Normal file
|
@ -0,0 +1,51 @@
|
|||
- blazer_title @query.name
|
||||
.container
|
||||
.row
|
||||
.col-12
|
||||
%h1= @query.name
|
||||
- if @query.description.present?
|
||||
%p.lead= @query.description
|
||||
- unless @result.chart_type.blank?
|
||||
.col-12
|
||||
- case @result.chart_type
|
||||
- when 'line'
|
||||
= line_chart @chart_data, **@chart_options
|
||||
- when 'line2'
|
||||
= line_chart @chart_data, **@chart_options
|
||||
- when 'pie'
|
||||
= pie_chart @chart_data, **@chart_options
|
||||
- when 'bar'
|
||||
= column_chart @chart_data, **@chart_options
|
||||
- when 'bar2'
|
||||
= column_chart @chart_data, **@chart_options
|
||||
- when 'scatter'
|
||||
= scatter_chart @chart_data, **@chart_options
|
||||
.col-12
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
- @result.columns.each do |key|
|
||||
- next if key.include? 'ciphertext'
|
||||
- next if key.include? 'encrypted'
|
||||
%th.position-sticky.background-white= key
|
||||
%tbody
|
||||
- @result.rows.each do |row|
|
||||
%tr
|
||||
- row.each_with_index do |v, i|
|
||||
- k = @result.columns[i]
|
||||
- next if k.include? 'ciphertext'
|
||||
- next if k.include? 'encrypted'
|
||||
%td
|
||||
- if v.is_a?(Time)
|
||||
- v = blazer_time_value(@data_source, k, v)
|
||||
|
||||
- unless v.nil?
|
||||
- if v.is_a?(String) && v.empty?
|
||||
%span.text-muted= t('.empty')
|
||||
- elsif @data_source.linked_columns[k]
|
||||
= link_to blazer_format_value(k, v), @data_source.linked_columns[k].gsub('{value}', u(v.to_s)), target: '_blank'
|
||||
- else
|
||||
= blazer_format_value(k, v)
|
||||
|
||||
- if (v2 = (@result.boom[k] || {})[v.nil? ? v : v.to_s])
|
||||
%span.text-muted= v2
|
|
@ -13,6 +13,8 @@
|
|||
"@rails/ujs": "^6.1.3-1",
|
||||
"@rails/webpacker": "5.2.1",
|
||||
"babel-loader": "^8.2.2",
|
||||
"chart.js": "2.9.3",
|
||||
"chartkick": "3.2.1",
|
||||
"circular-dependency-plugin": "^5.2.2",
|
||||
"commonmark": "^0.29.0",
|
||||
"fork-awesome": "^1.1.7",
|
||||
|
|
35
yarn.lock
35
yarn.lock
|
@ -2119,6 +2119,34 @@ chalk@^4.1.0:
|
|||
ansi-styles "^4.1.0"
|
||||
supports-color "^7.1.0"
|
||||
|
||||
chart.js@2.9.3:
|
||||
version "2.9.3"
|
||||
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7"
|
||||
integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==
|
||||
dependencies:
|
||||
chartjs-color "^2.1.0"
|
||||
moment "^2.10.2"
|
||||
|
||||
chartjs-color-string@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71"
|
||||
integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==
|
||||
dependencies:
|
||||
color-name "^1.0.0"
|
||||
|
||||
chartjs-color@^2.1.0:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0"
|
||||
integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==
|
||||
dependencies:
|
||||
chartjs-color-string "^0.6.0"
|
||||
color-convert "^1.9.3"
|
||||
|
||||
chartkick@3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/chartkick/-/chartkick-3.2.1.tgz#a80c2005ae353c5ae011d0a756b6f592fc8fc7a9"
|
||||
integrity sha512-zV0kUeZNqrX28AmPt10QEDXHKadbVFOTAFkCMyJifHzGFkKzGCDXxVR8orZ0fC1HbePzRn5w6kLCOVxDQbMUCg==
|
||||
|
||||
chokidar@^2.1.8:
|
||||
version "2.1.8"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
|
||||
|
@ -2238,7 +2266,7 @@ collection-visit@^1.0.0:
|
|||
map-visit "^1.0.0"
|
||||
object-visit "^1.0.0"
|
||||
|
||||
color-convert@^1.9.0, color-convert@^1.9.1:
|
||||
color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3:
|
||||
version "1.9.3"
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
||||
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
|
||||
|
@ -5005,6 +5033,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
|
|||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||
|
||||
moment@^2.10.2:
|
||||
version "2.29.1"
|
||||
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
|
||||
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
|
||||
|
||||
move-concurrently@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
|
||||
|
|
Loading…
Reference in a new issue