run.html.erb 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <% if @error %>
  2. <div class="alert alert-danger"><%= @error.first(200) %></div>
  3. <% elsif !@success %>
  4. <% if @only_chart %>
  5. <p class="text-muted">Select variables</p>
  6. <% else %>
  7. <div class="alert alert-info">Can’t preview queries with variables...yet!</div>
  8. <% end %>
  9. <% else %>
  10. <% unless @only_chart %>
  11. <% if @cached_at || @just_cached %>
  12. <p class="text-muted" style="float: right;">
  13. <% if @cached_at %>
  14. Cached <%= time_ago_in_words(@cached_at, include_seconds: true) %> ago
  15. <% elsif !params[:data_source] %>
  16. Cached just now
  17. <% if @data_source.cache_mode == "slow" %>
  18. (over <%= "%g" % @data_source.cache_slow_threshold %>s)
  19. <% end %>
  20. <% end %>
  21. <% if @query && !params[:data_source] %>
  22. <%= link_to "Refresh", refresh_query_path(@query, variable_params), method: :post %>
  23. <% end %>
  24. </p>
  25. <% end %>
  26. <p class="text-muted">
  27. <%= pluralize(@rows.size, "row") %>
  28. <% @checks.select(&:state).each do |check| %>
  29. &middot; <small class="check-state <%= check.state.parameterize.gsub("-", "_") %>"><%= link_to check.state.upcase, edit_check_path(check) %></small>
  30. <% if check.try(:message) %>
  31. &middot; <%= check.message %>
  32. <% end %>
  33. <% end %>
  34. </p>
  35. <% end %>
  36. <% if @rows.any? %>
  37. <% values = @rows.first %>
  38. <% chart_id = SecureRandom.hex %>
  39. <% column_types = @result.column_types %>
  40. <% chart_type = @result.chart_type %>
  41. <% chart_options = {id: chart_id, min: nil} %>
  42. <% series_library = {} %>
  43. <% target_index = @columns.index { |k| k.downcase == "target" } %>
  44. <% if target_index %>
  45. <% series_library[target_index - 1] = {pointStyle: "line", hitRadius: 5, borderColor: "#109618", pointBackgroundColor: "#109618", backgroundColor: "#109618"} %>
  46. <% end %>
  47. <% if blazer_maps? && @markers.any? %>
  48. <div id="map" style="height: <%= @only_chart ? 300 : 500 %>px;"></div>
  49. <script>
  50. L.mapbox.accessToken = '<%= ENV["MAPBOX_ACCESS_TOKEN"] %>';
  51. var map = L.mapbox.map('map', 'ankane.ioo8nki0');
  52. <%= blazer_js_var "markers", @markers %>
  53. var featureLayer = L.mapbox.featureLayer().addTo(map);
  54. var geojson = [];
  55. for (var i = 0; i < markers.length; i++) {
  56. var marker = markers[i];
  57. geojson.push({
  58. type: 'Feature',
  59. geometry: {
  60. type: 'Point',
  61. coordinates: [
  62. marker.longitude,
  63. marker.latitude
  64. ]
  65. },
  66. properties: {
  67. description: marker.title,
  68. 'marker-color': '#f86767',
  69. 'marker-size': 'medium'
  70. }
  71. });
  72. }
  73. featureLayer.setGeoJSON(geojson);
  74. map.fitBounds(featureLayer.getBounds());
  75. </script>
  76. <% elsif chart_type == "line" %>
  77. <%= line_chart @columns[1..-1].each_with_index.map{ |k, i| {name: blazer_series_name(k), data: @rows.map{ |r| [r[0], r[i + 1]] }, library: series_library[i]} }, chart_options %>
  78. <% elsif chart_type == "line2" %>
  79. <%= line_chart @rows.group_by { |r| v = r[1]; (@boom[@columns[1]] || {})[v.to_s] || v }.each_with_index.map { |(name, v), i| {name: blazer_series_name(name), data: v.map { |v2| [v2[0], v2[2]] }, library: series_library[i]} }, chart_options %>
  80. <% elsif chart_type == "bar" %>
  81. <%= column_chart (values.size - 1).times.map { |i| name = @columns[i + 1]; {name: blazer_series_name(name), data: @rows.first(20).map { |r| [(@boom[@columns[0]] || {})[r[0].to_s] || r[0], r[i + 1]] } } }, id: chart_id %>
  82. <% elsif chart_type == "bar2" %>
  83. <% first_20 = @rows.group_by { |r| r[0] }.values.first(20).flatten(1) %>
  84. <% labels = first_20.map { |r| r[0] }.uniq %>
  85. <% series = first_20.map { |r| r[1] }.uniq %>
  86. <% labels.each do |l| %>
  87. <% series.each do |s| %>
  88. <% first_20 << [l, s, 0] unless first_20.find { |r| r[0] == l && r[1] == s } %>
  89. <% end %>
  90. <% end %>
  91. <%= column_chart first_20.group_by { |r| v = r[1]; (@boom[@columns[1]] || {})[v.to_s] || v }.each_with_index.map { |(name, v), i| {name: blazer_series_name(name), data: v.sort_by { |r2| labels.index(r2[0]) }.map { |v2| v3 = v2[0]; [(@boom[@columns[0]] || {})[v3.to_s] || v3, v2[2]] }} }, id: chart_id %>
  92. <% elsif chart_type == "scatter" %>
  93. <%= scatter_chart @rows, xtitle: @columns[0], ytitle: @columns[1], id: chart_id %>
  94. <% elsif @only_chart %>
  95. <% if @rows.size == 1 && @rows.first.size == 1 %>
  96. <% v = @rows.first.first %>
  97. <% if v.is_a?(String) && v == "" %>
  98. <div class="text-muted">empty string</div>
  99. <% else %>
  100. <p style="font-size: 160px;"><%= blazer_format_value(@columns.first, v) %></p>
  101. <% end %>
  102. <% else %>
  103. <% @no_chart = true %>
  104. <% end %>
  105. <% end %>
  106. <% unless @only_chart && !@no_chart %>
  107. <% header_width = 100 / @columns.size.to_f %>
  108. <div class="results-container">
  109. <% if @columns == ["QUERY PLAN"] %>
  110. <pre><code><%= @rows.map { |r| r[0] }.join("\n") %></code></pre>
  111. <% else %>
  112. <table class="table results-table" style="margin-bottom: 0;">
  113. <thead>
  114. <tr>
  115. <% @columns.each_with_index do |key, i| %>
  116. <% type = @column_types[i] %>
  117. <th style="width: <%= header_width %>%;" data-sort="<%= type %>">
  118. <div style="min-width: <%= @min_width_types.include?(i) ? 180 : 60 %>px;">
  119. <%= key %>
  120. </div>
  121. </th>
  122. <% end %>
  123. </tr>
  124. </thead>
  125. <tbody>
  126. <% @rows.each do |row| %>
  127. <tr>
  128. <% row.each_with_index do |v, i| %>
  129. <% k = @columns[i] %>
  130. <td>
  131. <% if v.is_a?(Time) %>
  132. <% v = blazer_time_value(@data_source, k, v) %>
  133. <% end %>
  134. <% unless v.nil? %>
  135. <% if v.is_a?(String) && v == "" %>
  136. <div class="text-muted">empty string</div>
  137. <% elsif @linked_columns[k] %>
  138. <%= link_to blazer_format_value(k, v), @linked_columns[k].gsub("{value}", u(v.to_s)), target: "_blank" %>
  139. <% else %>
  140. <%= blazer_format_value(k, v) %>
  141. <% end %>
  142. <% end %>
  143. <% if v2 = (@boom[k] || {})[v.nil? ? v : v.to_s] %>
  144. <div class="text-muted"><%= v2 %></div>
  145. <% end %>
  146. </td>
  147. <% end %>
  148. </tr>
  149. <% end %>
  150. </tbody>
  151. </table>
  152. <% end %>
  153. </div>
  154. <% end %>
  155. <% elsif @only_chart %>
  156. <p class="text-muted">No rows</p>
  157. <% end %>
  158. <% end %>