blazer 2.4.2 → 2.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +64 -0
  3. data/README.md +155 -57
  4. data/app/assets/javascripts/blazer/Chart.js +14000 -13979
  5. data/app/assets/javascripts/blazer/bootstrap.js +300 -97
  6. data/app/assets/javascripts/blazer/queries.js +12 -1
  7. data/app/assets/javascripts/blazer/vue.js +10754 -9687
  8. data/app/assets/stylesheets/blazer/application.css +5 -0
  9. data/app/assets/stylesheets/blazer/bootstrap-propshaft.css +10 -0
  10. data/app/assets/stylesheets/blazer/bootstrap-sprockets.css.erb +10 -0
  11. data/app/assets/stylesheets/blazer/{bootstrap.css.erb → bootstrap.css} +527 -455
  12. data/app/controllers/blazer/base_controller.rb +45 -45
  13. data/app/controllers/blazer/dashboards_controller.rb +4 -11
  14. data/app/controllers/blazer/queries_controller.rb +31 -49
  15. data/app/models/blazer/query.rb +9 -3
  16. data/app/views/blazer/_variables.html.erb +5 -4
  17. data/app/views/blazer/dashboards/_form.html.erb +1 -1
  18. data/app/views/blazer/dashboards/show.html.erb +6 -4
  19. data/app/views/blazer/queries/_caching.html.erb +1 -1
  20. data/app/views/blazer/queries/_form.html.erb +3 -3
  21. data/app/views/blazer/queries/run.html.erb +5 -3
  22. data/app/views/blazer/queries/show.html.erb +12 -7
  23. data/app/views/layouts/blazer/application.html.erb +7 -2
  24. data/lib/blazer/adapters/athena_adapter.rb +73 -20
  25. data/lib/blazer/adapters/base_adapter.rb +16 -1
  26. data/lib/blazer/adapters/bigquery_adapter.rb +14 -3
  27. data/lib/blazer/adapters/cassandra_adapter.rb +15 -4
  28. data/lib/blazer/adapters/drill_adapter.rb +10 -0
  29. data/lib/blazer/adapters/druid_adapter.rb +36 -1
  30. data/lib/blazer/adapters/elasticsearch_adapter.rb +19 -4
  31. data/lib/blazer/adapters/hive_adapter.rb +10 -0
  32. data/lib/blazer/adapters/ignite_adapter.rb +12 -2
  33. data/lib/blazer/adapters/influxdb_adapter.rb +22 -10
  34. data/lib/blazer/adapters/mongodb_adapter.rb +4 -0
  35. data/lib/blazer/adapters/neo4j_adapter.rb +17 -2
  36. data/lib/blazer/adapters/opensearch_adapter.rb +52 -0
  37. data/lib/blazer/adapters/presto_adapter.rb +9 -0
  38. data/lib/blazer/adapters/salesforce_adapter.rb +5 -0
  39. data/lib/blazer/adapters/snowflake_adapter.rb +9 -0
  40. data/lib/blazer/adapters/soda_adapter.rb +9 -0
  41. data/lib/blazer/adapters/spark_adapter.rb +5 -0
  42. data/lib/blazer/adapters/sql_adapter.rb +41 -4
  43. data/{app/mailers → lib}/blazer/check_mailer.rb +0 -0
  44. data/lib/blazer/data_source.rb +90 -8
  45. data/lib/blazer/engine.rb +1 -4
  46. data/lib/blazer/result.rb +19 -1
  47. data/lib/blazer/run_statement.rb +7 -3
  48. data/lib/blazer/run_statement_job.rb +4 -2
  49. data/{app/mailers → lib}/blazer/slack_notifier.rb +19 -4
  50. data/lib/blazer/statement.rb +75 -0
  51. data/lib/blazer/version.rb +1 -1
  52. data/lib/blazer.rb +32 -8
  53. data/lib/generators/blazer/templates/config.yml.tt +2 -2
  54. data/lib/tasks/blazer.rake +5 -5
  55. data/licenses/LICENSE-bootstrap.txt +1 -1
  56. metadata +10 -6
@@ -32,45 +32,34 @@ module Blazer
32
32
 
33
33
  private
34
34
 
35
- def process_vars(statement, data_source)
36
- (@bind_vars ||= []).concat(Blazer.extract_vars(statement)).uniq!
35
+ def process_vars(statement, var_params = nil)
36
+ var_params ||= request.query_parameters
37
+ (@bind_vars ||= []).concat(statement.variables).uniq!
38
+ # update in-place so populated in view and consistent across queries on dashboard
37
39
  @bind_vars.each do |var|
38
- params[var] ||= Blazer.data_sources[data_source].variable_defaults[var]
39
- end
40
- @success = @bind_vars.all? { |v| params[v] }
41
-
42
- if @success
43
- @bind_vars.each do |var|
44
- value = params[var].presence
45
- if value
46
- if ["start_time", "end_time"].include?(var)
47
- value = value.to_s.gsub(" ", "+") # fix for Quip bug
48
- end
49
-
50
- if var.end_with?("_at")
51
- begin
52
- value = Blazer.time_zone.parse(value)
53
- rescue
54
- # do nothing
55
- end
56
- end
57
-
58
- if value =~ /\A\d+\z/
59
- value = value.to_i
60
- elsif value =~ /\A\d+\.\d+\z/
61
- value = value.to_f
62
- end
63
- end
64
- value = Blazer.transform_variable.call(var, value) if Blazer.transform_variable
65
- statement.gsub!("{#{var}}", ActiveRecord::Base.connection.quote(value))
40
+ if !var_params[var]
41
+ default = statement.data_source.variable_defaults[var]
42
+ # only add if default exists
43
+ var_params[var] = default if default
66
44
  end
67
45
  end
46
+ runnable = @bind_vars.all? { |v| var_params[v] }
47
+ statement.add_values(var_params) if runnable
48
+ runnable
49
+ end
50
+
51
+ def refresh_query(query)
52
+ statement = query.statement_object
53
+ runnable = process_vars(statement)
54
+ cohort_analysis_statement(statement) if statement.cohort_analysis?
55
+ statement.clear_cache if runnable
68
56
  end
69
57
 
70
58
  def add_cohort_analysis_vars
71
59
  @bind_vars << "cohort_period" unless @bind_vars.include?("cohort_period")
72
- @smart_vars["cohort_period"] = ["day", "week", "month"]
73
- params[:cohort_period] ||= "week"
60
+ @smart_vars["cohort_period"] = ["day", "week", "month"] if @smart_vars
61
+ # TODO create var_params method
62
+ request.query_parameters["cohort_period"] ||= "week"
74
63
  end
75
64
 
76
65
  def parse_smart_variables(var, data_source)
@@ -94,22 +83,33 @@ module Blazer
94
83
  [smart_var, error]
95
84
  end
96
85
 
97
- # don't pass to url helpers
98
- #
99
- # some are dangerous when passed as symbols
100
- # root_url({host: "evilsite.com"})
101
- #
102
- # certain ones (like host) only affect *_url and not *_path
103
- #
104
- # when permitted parameters are passed in Rails 6,
105
- # they appear to be added as GET parameters
106
- # root_url(params.permit(:host))
86
+ def cohort_analysis_statement(statement)
87
+ @cohort_period = params["cohort_period"] || "week"
88
+ @cohort_period = "week" unless ["day", "week", "month"].include?(@cohort_period)
89
+
90
+ # for now
91
+ @conversion_period = @cohort_period
92
+ @cohort_days =
93
+ case @cohort_period
94
+ when "day"
95
+ 1
96
+ when "week"
97
+ 7
98
+ when "month"
99
+ 30
100
+ end
101
+
102
+ statement.apply_cohort_analysis(period: @cohort_period, days: @cohort_days)
103
+ end
104
+
105
+ # TODO allow all keys
106
+ # or show error message for disallowed keys
107
107
  UNPERMITTED_KEYS = [:controller, :action, :id, :host, :query, :dashboard, :query_id, :query_ids, :table_names, :authenticity_token, :utf8, :_method, :commit, :statement, :data_source, :name, :fork_query_id, :blazer, :run_id, :script_name, :original_script_name]
108
108
 
109
- # remove unpermitted keys from both params and permitted keys for better sleep
110
- def variable_params(resource)
109
+ def variable_params(resource, var_params = nil)
111
110
  permitted_keys = resource.variables - UNPERMITTED_KEYS.map(&:to_s)
112
- params.except(*UNPERMITTED_KEYS).slice(*permitted_keys).permit!
111
+ var_params ||= request.query_parameters
112
+ var_params.slice(*permitted_keys)
113
113
  end
114
114
  helper_method :variable_params
115
115
 
@@ -21,11 +21,8 @@ module Blazer
21
21
 
22
22
  def show
23
23
  @queries = @dashboard.dashboard_queries.order(:position).preload(:query).map(&:query)
24
- @statements = []
25
24
  @queries.each do |query|
26
- statement = query.statement.dup
27
- process_vars(statement, query.data_source)
28
- @statements << statement
25
+ @success = process_vars(query.statement_object)
29
26
  end
30
27
  @bind_vars ||= []
31
28
 
@@ -48,7 +45,7 @@ module Blazer
48
45
 
49
46
  def update
50
47
  if update_dashboard(@dashboard)
51
- redirect_to dashboard_path(@dashboard, variable_params(@dashboard))
48
+ redirect_to dashboard_path(@dashboard, params: variable_params(@dashboard))
52
49
  else
53
50
  render_errors @dashboard
54
51
  end
@@ -61,13 +58,9 @@ module Blazer
61
58
 
62
59
  def refresh
63
60
  @dashboard.queries.each do |query|
64
- data_source = Blazer.data_sources[query.data_source]
65
- statement = query.statement.dup
66
- process_vars(statement, query.data_source)
67
- Blazer.transform_statement.call(data_source, statement) if Blazer.transform_statement
68
- data_source.clear_cache(statement)
61
+ refresh_query(query)
69
62
  end
70
- redirect_to dashboard_path(@dashboard, variable_params(@dashboard))
63
+ redirect_to dashboard_path(@dashboard, params: variable_params(@dashboard))
71
64
  end
72
65
 
73
66
  private
@@ -52,28 +52,25 @@ module Blazer
52
52
  @query.status = "active" if @query.respond_to?(:status)
53
53
 
54
54
  if @query.save
55
- redirect_to query_path(@query, variable_params(@query))
55
+ redirect_to query_path(@query, params: variable_params(@query))
56
56
  else
57
57
  render_errors @query
58
58
  end
59
59
  end
60
60
 
61
61
  def show
62
- @statement = @query.statement.dup
63
- process_vars(@statement, @query.data_source)
62
+ @statement = @query.statement_object
63
+ @success = process_vars(@statement)
64
64
 
65
65
  @smart_vars = {}
66
66
  @sql_errors = []
67
- data_source = Blazer.data_sources[@query.data_source]
68
67
  @bind_vars.each do |var|
69
- smart_var, error = parse_smart_variables(var, data_source)
68
+ smart_var, error = parse_smart_variables(var, @statement.data_source)
70
69
  @smart_vars[var] = smart_var if smart_var
71
70
  @sql_errors << error if error
72
71
  end
73
72
 
74
- @query.update!(status: "active") if @query.try(:status) == "archived"
75
-
76
- Blazer.transform_statement.call(data_source, @statement) if Blazer.transform_statement
73
+ @query.update!(status: "active") if @query.respond_to?(:status) && @query.status.in?(["archived", nil])
77
74
 
78
75
  add_cohort_analysis_vars if @query.cohort_analysis?
79
76
  end
@@ -82,17 +79,25 @@ module Blazer
82
79
  end
83
80
 
84
81
  def run
85
- @statement = params[:statement]
86
- # before process_vars
87
- @cohort_analysis = Query.new(statement: @statement).cohort_analysis?
88
- data_source = params[:data_source]
89
- process_vars(@statement, data_source)
90
- @only_chart = params[:only_chart]
91
- @run_id = blazer_params[:run_id]
92
82
  @query = Query.find_by(id: params[:query_id]) if params[:query_id]
83
+
84
+ # use query data source when present
85
+ # need to update viewable? logic below if this changes
93
86
  data_source = @query.data_source if @query && @query.data_source
87
+ data_source ||= params[:data_source]
94
88
  @data_source = Blazer.data_sources[data_source]
95
89
 
90
+ @statement = Blazer::Statement.new(params[:statement], @data_source)
91
+ # before process_vars
92
+ @cohort_analysis = @statement.cohort_analysis?
93
+
94
+ # fallback for now for users with open tabs
95
+ # TODO remove fallback in future version
96
+ @var_params = request.request_parameters["variables"] || request.request_parameters
97
+ @success = process_vars(@statement, @var_params)
98
+ @only_chart = params[:only_chart]
99
+ @run_id = blazer_params[:run_id]
100
+
96
101
  run_cohort_analysis if @cohort_analysis
97
102
 
98
103
  # ensure viewable
@@ -128,7 +133,7 @@ module Blazer
128
133
 
129
134
  options = {user: blazer_user, query: @query, refresh_cache: params[:check], run_id: @run_id, async: Blazer.async}
130
135
  if Blazer.async && request.format.symbol != :csv
131
- Blazer::RunStatementJob.perform_later(@data_source.id, @statement, options)
136
+ Blazer::RunStatementJob.perform_later(@data_source.id, @statement.statement, options.merge(values: @statement.values))
132
137
  wait_start = Time.now
133
138
  loop do
134
139
  sleep(0.1)
@@ -136,7 +141,7 @@ module Blazer
136
141
  break if @result || Time.now - wait_start > 3
137
142
  end
138
143
  else
139
- @result = Blazer::RunStatement.new.perform(@data_source, @statement, options)
144
+ @result = Blazer::RunStatement.new.perform(@statement, options)
140
145
  end
141
146
 
142
147
  if @result
@@ -166,13 +171,8 @@ module Blazer
166
171
  end
167
172
 
168
173
  def refresh
169
- data_source = Blazer.data_sources[@query.data_source]
170
- @statement = @query.statement.dup
171
- process_vars(@statement, @query.data_source)
172
- Blazer.transform_statement.call(data_source, @statement) if Blazer.transform_statement
173
- @statement = cohort_analysis_statement(data_source, @statement) if @query.cohort_analysis?
174
- data_source.clear_cache(@statement)
175
- redirect_to query_path(@query, variable_params(@query))
174
+ refresh_query(@query)
175
+ redirect_to query_path(@query, params: variable_params(@query))
176
176
  end
177
177
 
178
178
  def update
@@ -180,11 +180,12 @@ module Blazer
180
180
  @query = Blazer::Query.new
181
181
  @query.creator = blazer_user if @query.respond_to?(:creator)
182
182
  end
183
+ @query.status = "active" if @query.respond_to?(:status)
183
184
  unless @query.editable?(blazer_user)
184
185
  @query.errors.add(:base, "Sorry, permission denied")
185
186
  end
186
187
  if @query.errors.empty? && @query.update(query_params)
187
- redirect_to query_path(@query, variable_params(@query))
188
+ redirect_to query_path(@query, params: variable_params(@query))
188
189
  else
189
190
  render_errors @query
190
191
  end
@@ -281,6 +282,9 @@ module Blazer
281
282
  render layout: false
282
283
  end
283
284
  format.csv do
285
+ # not ideal, but useful for testing
286
+ raise Error, @error if @error && Rails.env.test?
287
+
284
288
  send_data csv_data(@columns, @rows, @data_source), type: "text/csv; charset=utf-8; header=present", disposition: "attachment; filename=\"#{@query.try(:name).try(:parameterize).presence || 'query'}.csv\""
285
289
  end
286
290
  end
@@ -362,34 +366,12 @@ module Blazer
362
366
  end
363
367
 
364
368
  def run_cohort_analysis
365
- unless @data_source.supports_cohort_analysis?
369
+ unless @statement.data_source.supports_cohort_analysis?
366
370
  @cohort_error = "This data source does not support cohort analysis"
367
371
  end
368
372
 
369
373
  @show_cohort_rows = !params[:query_id] || @cohort_error
370
-
371
- unless @show_cohort_rows
372
- @statement = cohort_analysis_statement(@data_source, @statement)
373
- end
374
- end
375
-
376
- def cohort_analysis_statement(data_source, statement)
377
- @cohort_period = params["cohort_period"] || "week"
378
- @cohort_period = "week" unless ["day", "week", "month"].include?(@cohort_period)
379
-
380
- # for now
381
- @conversion_period = @cohort_period
382
- @cohort_days =
383
- case @cohort_period
384
- when "day"
385
- 1
386
- when "week"
387
- 7
388
- when "month"
389
- 30
390
- end
391
-
392
- data_source.cohort_analysis_statement(statement, period: @cohort_period, days: @cohort_days)
374
+ cohort_analysis_statement(@statement) unless @show_cohort_rows
393
375
  end
394
376
 
395
377
  def render_cohort_analysis
@@ -8,7 +8,7 @@ module Blazer
8
8
 
9
9
  validates :statement, presence: true
10
10
 
11
- scope :active, -> { column_names.include?("status") ? where(status: "active") : all }
11
+ scope :active, -> { column_names.include?("status") ? where(status: ["active", nil]) : all }
12
12
  scope :named, -> { where.not(name: "") }
13
13
 
14
14
  def to_param
@@ -35,13 +35,19 @@ module Blazer
35
35
  end
36
36
 
37
37
  def variables
38
- variables = Blazer.extract_vars(statement)
38
+ # don't require data_source to be loaded
39
+ variables = Statement.new(statement).variables
39
40
  variables += ["cohort_period"] if cohort_analysis?
40
41
  variables
41
42
  end
42
43
 
43
44
  def cohort_analysis?
44
- /\/\*\s*cohort analysis\s*\*\//i.match?(statement)
45
+ # don't require data_source to be loaded
46
+ Statement.new(statement).cohort_analysis?
47
+ end
48
+
49
+ def statement_object
50
+ Statement.new(statement, data_source)
45
51
  end
46
52
  end
47
53
  end
@@ -1,4 +1,5 @@
1
1
  <% if @bind_vars.any? %>
2
+ <% var_params = request.query_parameters %>
2
3
  <script>
3
4
  <%= blazer_js_var "timeZone", Blazer.time_zone.tzinfo.name %>
4
5
  var now = moment.tz(timeZone)
@@ -19,14 +20,14 @@
19
20
  <% @bind_vars.each_with_index do |var, i| %>
20
21
  <%= label_tag var, var %>
21
22
  <% if (data = @smart_vars[var]) %>
22
- <%= select_tag var, options_for_select([[nil, nil]] + data, selected: params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
23
+ <%= select_tag var, options_for_select([[nil, nil]] + data, selected: var_params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
23
24
  <script>
24
25
  $("#<%= var %>").selectize({
25
26
  create: true
26
27
  });
27
28
  </script>
28
29
  <% elsif var.end_with?("_at") || var == "start_time" || var == "end_time" %>
29
- <%= hidden_field_tag var, params[var] %>
30
+ <%= hidden_field_tag var, var_params[var] %>
30
31
 
31
32
  <div class="selectize-control single" style="width: 200px;">
32
33
  <div id="<%= var %>-select" class="selectize-input" style="display: inline-block;">
@@ -58,13 +59,13 @@
58
59
  })()
59
60
  </script>
60
61
  <% else %>
61
- <%= text_field_tag var, params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !params[var], class: "form-control" %>
62
+ <%= text_field_tag var, var_params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !var_params[var], class: "form-control" %>
62
63
  <% end %>
63
64
  <% end %>
64
65
 
65
66
  <% if date_vars %>
66
67
  <% date_vars.each do |var| %>
67
- <%= hidden_field_tag var, params[var] %>
68
+ <%= hidden_field_tag var, var_params[var] %>
68
69
  <% end %>
69
70
 
70
71
  <%= label_tag nil, date_vars.join(" & ") %>
@@ -1,4 +1,4 @@
1
- <%= form_for @dashboard, url: (@dashboard.persisted? ? dashboard_path(@dashboard, variable_params(@dashboard)) : dashboards_path(variable_params(@dashboard))), html: {id: "app", class: "small-form"} do |f| %>
1
+ <%= form_for @dashboard, url: (@dashboard.persisted? ? dashboard_path(@dashboard, params: variable_params(@dashboard)) : dashboards_path(params: variable_params(@dashboard))), html: {id: "app", class: "small-form"} do |f| %>
2
2
  <% if @dashboard.errors.any? %>
3
3
  <div class="alert alert-danger"><%= @dashboard.errors.full_messages.first %></div>
4
4
  <% end %>
@@ -10,7 +10,7 @@
10
10
  </h3>
11
11
  </div>
12
12
  <div class="col-sm-3 text-right">
13
- <%= link_to "Edit", edit_dashboard_path(@dashboard, variable_params(@dashboard)), class: "btn btn-info" %>
13
+ <%= link_to "Edit", edit_dashboard_path(@dashboard, params: variable_params(@dashboard)), class: "btn btn-info" %>
14
14
  </div>
15
15
  </div>
16
16
  </div>
@@ -21,7 +21,7 @@
21
21
  <% if @data_sources.any? { |ds| ds.cache_mode != "off" } %>
22
22
  <p class="text-muted" style="float: right;">
23
23
  Some queries may be cached
24
- <%= link_to "Refresh", refresh_dashboard_path(@dashboard, variable_params(@dashboard)), method: :post %>
24
+ <%= link_to "Refresh", refresh_dashboard_path(@dashboard, params: variable_params(@dashboard)), method: :post %>
25
25
  </p>
26
26
  <% end %>
27
27
 
@@ -33,13 +33,15 @@
33
33
 
34
34
  <% @queries.each_with_index do |query, i| %>
35
35
  <div class="chart-container">
36
- <h4><%= link_to query.friendly_name, query_path(query, variable_params(query)), target: "_blank" %></h4>
36
+ <h4><%= link_to query.friendly_name, query_path(query, params: variable_params(query)), target: "_blank" %></h4>
37
37
  <div id="chart-<%= i %>" class="chart">
38
38
  <p class="text-muted">Loading...</p>
39
39
  </div>
40
40
  </div>
41
41
  <script>
42
- <%= blazer_js_var "data", {statement: @statements[i], query_id: query.id, data_source: query.data_source, only_chart: true, cohort_period: params[:cohort_period]} %>
42
+ <% data = {statement: query.statement, query_id: query.id, data_source: query.data_source, variables: variable_params(query), only_chart: true} %>
43
+ <% data.merge!(cohort_period: params[:cohort_period]) if params[:cohort_period] %>
44
+ <%= blazer_js_var "data", data %>
43
45
 
44
46
  runQuery(data, function (data) {
45
47
  $("#chart-<%= i %>").html(data)
@@ -10,7 +10,7 @@
10
10
  <% end %>
11
11
 
12
12
  <% if @query && params[:query_id] %>
13
- <%= link_to "Refresh", refresh_query_path(@query, variable_params(@query)), method: :post %>
13
+ <%= link_to "Refresh", refresh_query_path(@query, params: variable_params(@query, @var_params)), method: :post %>
14
14
  <% end %>
15
15
  </p>
16
16
  <% end %>
@@ -3,7 +3,7 @@
3
3
  <% end %>
4
4
 
5
5
  <div id="app" v-cloak>
6
- <%= form_for @query, url: (@query.persisted? ? query_path(@query, variable_params(@query)) : queries_path(variable_params(@query))), html: {autocomplete: "off"} do |f| %>
6
+ <%= form_for @query, url: (@query.persisted? ? query_path(@query, params: variable_params(@query)) : queries_path(params: variable_params(@query))), html: {autocomplete: "off"} do |f| %>
7
7
  <div class="row">
8
8
  <div id="statement-box" class="col-xs-8">
9
9
  <div class= "form-group">
@@ -67,7 +67,7 @@
67
67
  </div>
68
68
 
69
69
  <script>
70
- <%= blazer_js_var "params", variable_params(@query) %>
70
+ <%= blazer_js_var "variableParams", variable_params(@query) %>
71
71
  <%= blazer_js_var "previewStatement", Hash[Blazer.data_sources.map { |k, v| [k, (v.preview_statement rescue "")] }] %>
72
72
 
73
73
  var app = new Vue({
@@ -95,7 +95,7 @@
95
95
  this.error = false
96
96
  cancelAllQueries()
97
97
 
98
- var data = $.extend({}, params, {statement: this.getSQL(), data_source: $("#query_data_source").val()})
98
+ var data = {statement: this.getSQL(), data_source: $("#query_data_source").val(), variables: variableParams}
99
99
 
100
100
  var _this = this
101
101
 
@@ -31,7 +31,7 @@
31
31
 
32
32
  <% if @query && @result.forecastable? && !params[:forecast] %>
33
33
  &middot;
34
- <%= link_to "Forecast", query_path(@query, {forecast: "t"}.merge(variable_params(@query))) %>
34
+ <%= link_to "Forecast", query_path(@query, params: {forecast: "t"}.merge(variable_params(@query))) %>
35
35
  <% end %>
36
36
  </p>
37
37
  <% end %>
@@ -73,12 +73,14 @@
73
73
  <% series_library[1] = {borderDash: [8], borderColor: color, pointBackgroundColor: color, backgroundColor: color, pointHoverBackgroundColor: color} %>
74
74
  <% end %>
75
75
  <% if blazer_maps? && @markers.any? %>
76
- <div id="map" style="height: <%= @only_chart ? 300 : 500 %>px;"></div>
76
+ <% map_id = SecureRandom.hex %>
77
+ <%= content_tag :div, nil, id: map_id, style: "height: #{@only_chart ? 300 : 500}px;" %>
77
78
  <script>
78
79
  <%= blazer_js_var "mapboxAccessToken", Blazer.mapbox_access_token %>
79
80
  <%= blazer_js_var "markers", @markers %>
81
+ <%= blazer_js_var "mapId", map_id %>
80
82
  L.mapbox.accessToken = mapboxAccessToken;
81
- var map = L.mapbox.map('map')
83
+ var map = L.mapbox.map(mapId)
82
84
  .addLayer(L.mapbox.styleLayer('mapbox://styles/mapbox/streets-v11'));
83
85
  var featureLayer = L.mapbox.featureLayer().addTo(map);
84
86
  var geojson = [];
@@ -1,5 +1,12 @@
1
1
  <% blazer_title @query.name %>
2
2
 
3
+ <% if @success %>
4
+ <% run_data = {statement: @query.statement, query_id: @query.id, data_source: @query.data_source, variables: variable_params(@query)} %>
5
+ <% run_data.merge!(forecast: "t") if params[:forecast] %>
6
+ <% run_data.merge!(cohort_period: params[:cohort_period]) if params[:cohort_period] %>
7
+ <% run_data.transform_keys!(&:to_s) if Rails::VERSION::STRING.to_f == 5.0 %>
8
+ <% end %>
9
+
3
10
  <div class="topbar">
4
11
  <div class="container">
5
12
  <div class="row" style="padding-top: 13px;">
@@ -10,11 +17,11 @@
10
17
  </h3>
11
18
  </div>
12
19
  <div class="col-sm-3 text-right">
13
- <%= link_to "Edit", edit_query_path(@query, variable_params(@query)), class: "btn btn-default", disabled: !@query.editable?(blazer_user) %>
14
- <%= link_to "Fork", new_query_path(variable_params(@query).merge(fork_query_id: @query.id, data_source: @query.data_source, name: @query.name)), class: "btn btn-info" %>
20
+ <%= link_to "Edit", edit_query_path(@query, params: variable_params(@query)), class: "btn btn-default", disabled: !@query.editable?(blazer_user) %>
21
+ <%= link_to "Fork", new_query_path(params: variable_params(@query).merge(fork_query_id: @query.id, data_source: @query.data_source, name: @query.name)), class: "btn btn-info" %>
15
22
 
16
23
  <% if !@error && @success %>
17
- <%= button_to "Download", run_queries_path(query_id: @query.id, format: "csv", forecast: params[:forecast], cohort_period: params[:cohort_period]), params: {statement: @statement}, class: "btn btn-primary" %>
24
+ <%= button_to "Download", run_queries_path(format: "csv"), params: run_data, class: "btn btn-primary" %>
18
25
  <% end %>
19
26
  </div>
20
27
  </div>
@@ -39,7 +46,7 @@
39
46
 
40
47
  <%= render partial: "blazer/variables", locals: {action: query_path(@query)} %>
41
48
 
42
- <pre id="code"><code><%= @statement %></code></pre>
49
+ <pre id="code"><code><%= @statement.display_statement %></code></pre>
43
50
 
44
51
  <% if @success %>
45
52
  <div id="results">
@@ -56,9 +63,7 @@
56
63
  $("#results").addClass("query-error").html(message)
57
64
  }
58
65
 
59
- <% data = variable_params(@query).merge(statement: @statement, query_id: @query.id, data_source: @query.data_source) %>
60
- <% data.merge!(forecast: "t") if params[:forecast] %>
61
- <%= blazer_js_var "data", data %>
66
+ <%= blazer_js_var "data", run_data %>
62
67
 
63
68
  runQuery(data, showRun, showError)
64
69
  </script>
@@ -5,8 +5,13 @@
5
5
 
6
6
  <meta charset="utf-8" />
7
7
  <%= favicon_link_tag "blazer/favicon.png" %>
8
- <%= stylesheet_link_tag "blazer/application" %>
9
- <%= javascript_include_tag "blazer/application" %>
8
+ <% if defined?(Propshaft::Railtie) %>
9
+ <%= stylesheet_link_tag "blazer/bootstrap-propshaft", "blazer/bootstrap", "blazer/selectize", "blazer/github", "blazer/daterangepicker", "blazer/application" %>
10
+ <%= javascript_include_tag "blazer/jquery", "blazer/jquery-ujs", "blazer/stupidtable", "blazer/stupidtable-custom-settings", "blazer/jquery.stickytableheaders", "blazer/selectize", "blazer/highlight.min", "blazer/moment", "blazer/moment-timezone-with-data", "blazer/daterangepicker", "blazer/Chart.js", "blazer/chartkick", "blazer/ace/ace", "blazer/ace/ext-language_tools", "blazer/ace/theme-twilight", "blazer/ace/mode-sql", "blazer/ace/snippets/text", "blazer/ace/snippets/sql", "blazer/Sortable", "blazer/bootstrap", "blazer/vue", "blazer/routes", "blazer/queries", "blazer/fuzzysearch", "blazer/application" %>
11
+ <% else %>
12
+ <%= stylesheet_link_tag "blazer/application" %>
13
+ <%= javascript_include_tag "blazer/application" %>
14
+ <% end %>
10
15
  <script>
11
16
  <%= blazer_js_var "rootPath", root_path %>
12
17
  </script>