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

hack hack hack

parent e3ebd2ef
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -7,12 +7,13 @@
#ifndef _FNORDMETRIC_QUERY_DRAWSTATEMENT_H
#define _FNORDMETRIC_QUERY_DRAWSTATEMENT_H
#include <stdlib.h>
#include <assert.h>
#include "compile.h"
#include "execute.h"
#include "executable.h"
#include "seriesstatement.h"
#include "axisstatement.h"
#include <fnordmetric/util/runtimeexception.h>
#include <fnordmetric/query/axisstatement.h>
#include <fnordmetric/query/compile.h>
#include <fnordmetric/query/execute.h>
#include <fnordmetric/query/executable.h>
#include <fnordmetric/query/resultlist.h>
#include <fnordmetric/query/seriesadapter.h>

namespace fnordmetric {
namespace ui {
@@ -36,7 +37,7 @@ public:
  void execute() override {}

  bool nextRow(SValue* row, int row_len) override {
    assert(0);
    RAISE(util::RuntimeException, "DrawStatement#nextRow called");
  }

  size_t getNumCols() const override {
@@ -52,8 +53,8 @@ public:
    return type_;
  }

  void addSeriesStatement(SeriesStatement* series_stmt) {
    series_stmts_.push_back(series_stmt);
  void addSeries(ResultList* series) {
    series_.push_back(series);
  }

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

  template <typename T>
  void executeDrawable(T* drawable) {
    for (const auto& series_stmt : series_stmts_) {
      series_stmt->executeDrawable(drawable);
    for (auto series : series_) {
      SeriesAdapter<T> series_adapter(drawable);
      series_adapter.addSeries(series);
    }

    for (const auto& axis_stmt : axis_stmts_) {
@@ -74,7 +76,7 @@ public:
  }

protected:
  std::vector<SeriesStatement*> series_stmts_;
  std::vector<ResultList*> series_;
  std::vector<AxisStatement*> axis_stmts_;
  kDrawStatementType type_;
};
+6 −12
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <memory>
#include <fnordmetric/util/runtimeexception.h>
#include <fnordmetric/query/query.h>
#include <fnordmetric/query/axisstatement.h>
#include <fnordmetric/query/drawstatement.h>
@@ -14,7 +15,6 @@
#include <fnordmetric/query/parser.h>
#include <fnordmetric/query/queryplan.h>
#include <fnordmetric/query/resultlist.h>
#include <fnordmetric/query/seriesstatement.h>
#include <fnordmetric/query/tablerepository.h>
#include <fnordmetric/query/resultlist.h>

@@ -55,20 +55,10 @@ void Query::execute() {
      continue;
    }

    auto series_stmt = dynamic_cast<query::SeriesStatement*>(stmt.get());
    if (series_stmt != nullptr) {
      if (current_draw_statement == nullptr) {
        throw std::string("SERIES without BEGIN CHART");
      }

      current_draw_statement->addSeriesStatement(series_stmt);
      continue;
    }

    auto axis_stmt = dynamic_cast<query::AxisStatement*>(stmt.get());
    if (axis_stmt != nullptr) {
      if (current_draw_statement == nullptr) {
        throw std::string("AXIS without BEGIN CHART");
        RAISE(util::RuntimeException, "DRAW AXIS without DRAW CHART");
      }

      current_draw_statement->addAxisStatement(axis_stmt);
@@ -80,6 +70,10 @@ void Query::execute() {
    stmt->setTarget(target);
    stmt->execute();
    results_.emplace_back(target);

    if (current_draw_statement != nullptr) {
      current_draw_statement->addSeries(target);
    }
  }

  for (const auto& draw_group : draw_statements) {
+56 −91
Original line number Diff line number Diff line
@@ -533,49 +533,6 @@ TEST_INITIALIZER(QueryTest, InitializeComplexQueries, [] () {
  }
});

/*
TEST_CASE(QueryTest, TestSeriesStatement, [] () {
  auto parser = parseTestQuery(
      "  SERIES \"myseries\" FROM"
      "    SELECT * FROM tbl;");

  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 2);
  EXPECT(*stmt == ASTNode::T_SERIES);

  const auto& name = stmt->getChildren()[0];
  EXPECT(*name == ASTNode::T_SERIES_NAME);
  EXPECT(*name->getToken() == "myseries");

  const auto& select = stmt->getChildren()[1];
  EXPECT(*select == ASTNode::T_SELECT);
  EXPECT(select->getChildren().size() == 2);
});

TEST_CASE(QueryTest, TestDerivedSeriesStatement, [] () {
  auto parser = parseTestQuery(
      "  SERIES fnord FROM"
      "    SELECT fnord, blah FROM tbl;");

  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 2);
  EXPECT(*stmt == ASTNode::T_SERIES);

  const auto& expr = stmt->getChildren()[0];
  EXPECT(*expr == ASTNode::T_COLUMN_NAME);
  EXPECT(*expr->getToken() == "fnord");

  const auto& select = stmt->getChildren()[1];
  EXPECT(*select == ASTNode::T_SELECT);
  EXPECT(select->getChildren().size() == 2);
});

*/

TEST_CASE(QueryTest, TestSelectOnlyQuery, [] () {
  TableRepository repo;
  std::vector<std::unique_ptr<Query>> dst;
@@ -772,64 +729,77 @@ TEST_CASE(QueryTest, TestTableScanGroupWithoutGroupClause, [] () {
  EXPECT(results->getRow(0)[0] == "55");
});

/*

TEST_CASE(QueryTest, TestNamedSeriesQuery, [] () {
TEST_CASE(QueryTest, TestDrawQueryNeedsSeriesColAssert, [] () {
  TableRepository repo;
  repo.addTableRef("testtable",
      std::unique_ptr<TableRef>(new TestTable2Ref()));

  auto query = Query(
      "  SERIES \"myseries\" FROM"
      "  DRAW BAR CHART;"
      "  DRAW LEFT AXIS;"
      ""
      "  SELECT"
      "      one, two"
      "    'series1' as fnord, one AS x, two AS y"
      "  FROM"
      "    testtable;",
      &repo);

  const char err[] = "can't draw SELECT because it has no 'series' column";

  EXPECT_EXCEPTION(err, [&query] () {
    query.execute();
  auto results = query.getResultList(0);
  EXPECT(results->getNumRows() == 10);
  EXPECT(results->getNumColumns() == 3);
  for (int i = 0; i < results->getNumRows(); ++i) {
    const auto& row = results->getRow(i);
    EXPECT(row[0] == "myseries");
    EXPECT(atoi(row[1].c_str()) == 10 - i);
    EXPECT(atoi(row[2].c_str()) == 20 - i * 2);
  }
  });
});

TEST_CASE(QueryTest, TestDerivedSeriesQuery, [] () {
TEST_CASE(QueryTest, TestDrawQueryNeedsXColAssert, [] () {
  TableRepository repo;
  repo.addTableRef("testtable",
      std::unique_ptr<TableRef>(new TestTable2Ref()));

  auto query = Query(
      "  SERIES one * 5 FROM"
      "  DRAW BAR CHART;"
      "  DRAW LEFT AXIS;"
      ""
      "  SELECT"
      "      one, two"
      "    'series1' as series, one AS f, two AS y"
      "  FROM"
      "    testtable;",
      &repo);

  const char err[] = "can't draw SELECT because it has no 'x' column";

  EXPECT_EXCEPTION(err, [&query] () {
    query.execute();
  auto results = query.getResultList(0);
  EXPECT(results->getNumRows() == 10);
  EXPECT(results->getNumColumns() == 3);
  for (int i = 0; i < results->getNumRows(); ++i) {
    const auto& row = results->getRow(i);
    EXPECT(atoi(row[0].c_str()) == atoi(row[1].c_str()) * 5);
  }
  });
});

*/
TEST_CASE(QueryTest, TestDrawQueryNeedsYColAssert, [] () {
  TableRepository repo;
  repo.addTableRef("testtable",
      std::unique_ptr<TableRef>(new TestTable2Ref()));

  auto query = Query(
      "  DRAW BAR CHART;"
      "  DRAW LEFT AXIS;"
      ""
      "  SELECT"
      "    'series1' as series, one AS x, two AS f"
      "  FROM"
      "    testtable;",
      &repo);

  const char err[] = "can't draw SELECT because it has no 'y' column";

  EXPECT_EXCEPTION(err, [&query] () {
    query.execute();
  });
});

TEST_CASE(QueryTest, TestSimpleDrawQuery, [] () {
  TableRepository repo;
  repo.addTableRef("testtable",
      std::unique_ptr<TableRef>(new TestTable2Ref()));


  auto query = Query(
      "  DRAW BAR CHART;"
      "  DRAW LEFT AXIS;"
@@ -853,30 +823,25 @@ TEST_CASE(QueryTest, TestSimpleDrawQuery, [] () {

  query.execute();
  auto chart = query.getChart(0);
  //chart->renderSVG();
  chart->renderSVG();
});

/*
TEST_CASE(QueryTest, TestDerivedSeriesDrawQuery, [] () {
  TableRepository repo;
  repo.addTableRef("testtable",
      std::unique_ptr<TableRef>(new TestTable2Ref()));

  auto query = Query(
      "  BEGIN BAR CHART;"
      ""
      "  CREATE AXIS WITH SELECT 'left' AS position;"
      "  DRAW BAR CHART;"
      "  DRAW LEFT AXIS;"
      ""
      "  CREATE SERIES WITH"
      "  SELECT"
      "      one % 3 as name, one / 3 as x, two + one AS y"
      "    one % 3 as series, one / 3 as x, two + one AS y"
      "  FROM"
      "      testtable;"
      "",
      "    testtable;",
      &repo);

  query.execute();
  auto chart = query.getChart(0);
  //chart->renderSVG();
});\
*/
  chart->renderSVG();
});
+0 −27
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@
#include "limitclause.h"
#include "groupby.h"
#include "symboltable.h"
#include "seriesstatement.h"
#include "drawstatement.h"

namespace fnordmetric {
@@ -25,11 +24,6 @@ namespace query {
Executable* QueryPlan::buildQueryPlan(ASTNode* ast, TableRepository* repo) {
  Executable* exec = nullptr;

  /* series statement */
  if (ast->getType() == ASTNode::T_SERIES) {
    return buildSeriesStatement(ast, repo);
  }

  /* axis statement */
  if (ast->getType() == ASTNode::T_AXIS) {
    return buildAxisStatement(ast, repo);
@@ -125,27 +119,6 @@ Executable* QueryPlan::buildDrawStatement(ASTNode* ast) {
  return new DrawStatement(type);
}


Executable* QueryPlan::buildSeriesStatement(
    ASTNode* ast,
    TableRepository* repo) {
  auto select_ast = ast->getChildren()[0];
  assert(*select_ast == ASTNode::T_SELECT);

  /* build nested select statement */
  auto select = buildQueryPlan(select_ast, repo);

  /* resolve output column names */
  std::vector<std::string> column_names;
  for (const auto& col : select->getColumns()) {
    column_names.emplace_back(col);
  }

  return new SeriesStatement(
      std::move(column_names),
      select);
}

Executable* QueryPlan::buildAxisStatement(
    ASTNode* ast,
    TableRepository* repo) {
+10 −0
Original line number Diff line number Diff line
@@ -42,6 +42,16 @@ public:
    return columns_;
  }

  int getColumnIndex(const std::string& column_name) const {
    for (int i = 0; i < columns_.size(); ++i) {
      if (columns_[i] == column_name) {
        return i;
      }
    }

    return -1;
  }

  void addHeader(const std::vector<std::string>& columns) {
    columns_ = columns;
  }
Loading