Commit bb6e41a4 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

display result table in webinterface :)

parent 3f71b927
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -1165,6 +1165,7 @@ body, html {
  border-left: 1px #D7DBE6 solid;
  border-right: 1px #D7DBE6 solid;
  margin-left:190px;
  min-height: 900px;
}

.titlebar {
@@ -1441,7 +1442,7 @@ ul.ui_tabs{
  list-style-type:none;
  margin:0;
  padding:0;
  height:46px;
  height:36px;
  display:block;
  width:100%;
  font-size:13px;
@@ -1494,12 +1495,20 @@ ul.ui_tabs li.active a{
  outline: none;
}

#query_editor_results ul.ui_tabs {
  padding-top: 16px;
  margin-bottom: 0;
  border-bottom: 1px solid #ddd;
}

#query_editor_error {
  display: none;
  padding: 7px;
  padding: 10px 20px;
  font-family: monospace;
  background: #ecc;
  border: 1px solid #f88;
  margin: 19px;
  border-radius: 3px;
}

#query_editor_error.visible {
@@ -1535,7 +1544,7 @@ table th, table td {
  border: 1px solid #ddd;
  border-left: 1px solid #eee;
  border-right: 1px solid #eee;
  padding: 9px 13px;
  padding: 0 13px;
}
table th {
  font-weight: bold;
+41 −3
Original line number Diff line number Diff line
FnordMetric = (function() {
  var editor = undefined;

  // FIXPAUL what is xss?
  var renderQueryResults = function(results) {
    var tabs = "<ul class='ui_tabs'>";
    for (i = 0; i < results.tables.length; ++i) {
      tabs += "<li class='active'><a>Table</a></li>";
    }
    tabs += "</ul>";

    var results_html = tabs;
    for (i = 0; i < results.tables.length; ++i) {
      var result = results.tables[i];
      results_html += "<table><tbody>";

      results_html += "<tr>";
      for (j = 0; j < result.columns.length; ++j) {
        results_html += "<th>" + result.columns[j] + "</th>";
      }
      results_html += "</tr>";

      for (j = 0; j < result.rows.length; ++j) {
        var row = result.rows[j];
        results_html += "<tr>";
        for (k = 0; k < row.length; ++k) {
          results_html += "<td>" + row[k] + "</td>";
        }
        results_html += "</tr>";
      }


      results_html += "</tbody></table>";
    }

    document.getElementById("query_editor_results").innerHTML = results_html;
  }

  var executeQuery = function() {
    if (typeof editor == undefined) {
      return;
@@ -22,9 +57,10 @@ FnordMetric = (function() {
    var error_div = document.getElementById("query_editor_error");
    if (response.status == "success") {
      error_div.className = "";
      renderQueryResults(response);
    } else {
      error_div.className = "visible";
      error_div.innerHTML = response.error;
      error_div.innerHTML = "<b>Error:</b> " + response.error;
    }
  };

@@ -38,9 +74,11 @@ FnordMetric = (function() {
    document.getElementById("wrap").innerHTML =
        navbar +
        "<div id='query_editor'>" +
          "<textarea id='query_editor_textarea'></textarea>" +
          "<textarea id='query_editor_textarea'>select 1 as one, 2 as two, 3 as three, 4 as four;</textarea>" +
        "</div>" +
        "<div id='query_editor_error'></div>";
        "<div class='headbar small'>Query executed in...</div>" +
        "<div id='query_editor_error'></div>" +
        "<div id='query_editor_results'></div>";

    editor = CodeMirror.fromTextArea(
        document.getElementById("query_editor_textarea"),
+7 −4
Original line number Diff line number Diff line
@@ -57,8 +57,9 @@ public:
    return type_;
  }

  void addSelectStatement(Executable* select_stmt) {
    select_stmts_.push_back(select_stmt);
  void addSelectStatement(Executable* select_stmt, ResultList* target) {
    select_stmts_.emplace_back(select_stmt);
    result_lists_.emplace_back(target);
  }

  void addAxisStatement(AxisStatement* axis_stmt) {
@@ -69,8 +70,9 @@ public:

  template <typename T>
  void executeDrawable(T* drawable) {
    for (const auto& stmt : select_stmts_) {
      SeriesAdapter<T> series_adapter(drawable, stmt);
    for (int i = 0; i < select_stmts_.size(); ++i) {
      const auto& stmt = select_stmts_[i];
      SeriesAdapter<T> series_adapter(drawable, stmt, result_lists_[i]);
      stmt->setTarget(&series_adapter);
      stmt->execute();
    }
@@ -82,6 +84,7 @@ public:

protected:
  std::vector<Executable*> select_stmts_;
  std::vector<ResultList*> result_lists_;
  std::vector<AxisStatement*> axis_stmts_;
  kDrawStatementType type_;
};
+5 −2
Original line number Diff line number Diff line
@@ -90,8 +90,7 @@ void Query::execute() {
    results_.emplace_back(target);

    if (current_draw_statement != nullptr) {
      // FIXPAUL copy results into target...
      current_draw_statement->addSelectStatement(stmt.get());
      current_draw_statement->addSelectStatement(stmt.get(), target);
    } else {
      stmt->setTarget(target);
      stmt->execute();
@@ -112,6 +111,10 @@ ResultList* Query::getResultList(size_t index) const {
  return results_[index].get();
}

size_t Query::getNumResultLists() const {
  return results_.size();
}

size_t Query::getNumCharts() const {
  return charts_.size();
}
+70 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <fnordmetric/query/resultlist.h>
#include <fnordmetric/query/tablerepository.h>
#include <fnordmetric/util/inputstream.h>
#include <fnordmetric/util/jsonoutputstream.h>
#include <fnordmetric/ui/svgtarget.h>

namespace fnordmetric {
@@ -43,6 +44,15 @@ void QueryService::executeQuery(
        break;
      }

      case FORMAT_JSON: {
        util::JSONOutputStream target(output_stream);
        renderJSON(&query, &target);
        break;
      }

      default:
        RAISE(util::RuntimeException, "can't handle this output format");

    }
  } catch (util::RuntimeException e) {
    e.appendMessage(" while executing query: %s", query_string.c_str());
@@ -59,5 +69,65 @@ void QueryService::renderCharts(Query* query, ui::RenderTarget* target) const {
  }
}

void QueryService::renderJSON(Query* query, util::JSONOutputStream* target)
    const {
  target->beginObject();

  if (query->getNumResultLists() > 0) {
    target->addObjectEntry("tables");
    target->beginArray();
    for (int i = 0; i < query->getNumResultLists(); ++i) {
      const auto result_list = query->getResultList(i);
      target->beginObject();

      target->addObjectEntry("columns");
      target->beginArray();
      for (const auto column : result_list->getColumns()) {
        target->addString(column);
        if (column != result_list->getColumns().back()) {
          target->addComma();
        }
      }
      target->endArray();
      target->addComma();

      target->addObjectEntry("rows");
      target->beginArray();
      for (int j = 0; j < result_list->getNumRows(); ++j) {
        const auto& row = result_list->getRow(j);

        target->beginArray();
        for (const auto& col : row) {
          target->addString(col);
          if (col != row.back()) {
            target->addComma();
          }
        }
        target->endArray();

        if (j < result_list->getNumRows() - 1) {
          target->addComma();
        }
      }
      target->endArray();

      target->endObject();
    }
    target->endArray();
    target->addComma();
  }

  target->addObjectEntry("charts");
  target->beginArray();
  target->endArray();
  target->addComma();

  target->addObjectEntry("status");
  target->addString("success");

  target->endObject();
}


}
}
Loading