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

SERIES EXPR WIP

parent 9e6f1410
Loading
Loading
Loading
Loading
+36 −29
Original line number Diff line number Diff line
@@ -52,27 +52,34 @@ point chart examples:
--- middle axis!
--- TimeDomain!

BEGIN CHART [TITLE title [subtitle]];

DRAW {LINES|LINES|BARS|POINTS|LINESPOINTS}
    series_name_expr
    [XAXIS expr
        [DISPLAY {TOP|BOTTOM|BOTH|OFF}]
        [TITLE title]
        [SCALE min_expr, max_expr]
        [LOGARITHMIC]]
    [YAXIS expr
        [DISPLAY {LEFT|RIGHT|BOTH|OFF}]
        [TITLE title]
        [SCALE min_expr, max_expr]
        [LOGARITHMIC]]
    [LABELS label_expr [{INSIDE|OUTSIDE}]];
    [ORIENTATION {HORIZONTAL|VERTICAL}]
    [STACKED {ON|OFF}]
    [COLOR color_expr]
    [LINESTYLE linestyle_expr]
    [POINTSTYLE pointstyle_expr]
    FROM select_statement;
BEGIN BAR CHART WITH
  SELECT
    axpr as title  expr
  subtitle = expr;
  [orientation = {HORIZONTAL|VERTICAL}]
  [stacked = [TRUE|FALSE]]
  [labels = [{INSIDE|OUTSIDE|OFF}]];
  [FROM select_statement];

CREATE AXIS
  position = {TOP|RIGHT|BOTTOM|BOTH|LEFT}
  title = expr
  min = expr
  max = expr
  logarithmic = expr
  [FROM select_statement];

CREATE SERIES
  name = expr
  x = expr
  y = expr
  z = expr
  label = expr
  linestyle = expr
  pointstyle = expr
  color = expr
  [FROM select_statement];


SELECT
    [ALL | DISTINCT | DISTINCTROW ]
@@ -110,11 +117,11 @@ We can create the chart pictured above with this sql query"
  IMPORT gdp_per_country FROM "gdp_per_country.csv";

  -- draw a simple bar chart
  DRAW BAR CHART;
  BEGIN BAR CHART;

  -- draw gdp of the top 10 countries
  SERIES "gdp per country" FROM
    SELECT gbp, country FROM gdp_per_country ORDER BY gdp DESC LIMIT 10;
  CREATE SERIES WITH
    SELECT "gdp per country" as name gbp as x, country as y FROM gdp_per_country ORDER BY gdp DESC LIMIT 10;


Now lets add a custom style and axis deinitions:
@@ -154,10 +161,10 @@ Lets add another experiment as a second series in the chart:
  IMPORT experiment1 FROM "experiment_1.csv";
  IMPORT experiment2 FROM "experiment_2.csv";

  DRAW LINE CHART;
  BEGIN LINES;

  SERIES "experiment1" FROM
    SELECT count(*) as qps, nth_percentile(runtime, 90) as latency
  CREATE SERIES WITH SELECT
    "experiment1" as title, count(*) as x, nth_percentile(runtime, 90) as y
    FROM experiment1
    GROUP BY time_window(time, 1s);

+23 −18
Original line number Diff line number Diff line
@@ -196,15 +196,15 @@ ASTNode* Parser::statement() {
  switch (cur_token_->getType()) {
    case Token::T_SELECT:
      return selectStatement();
    case Token::T_SERIES:
      return seriesStatement();
    case Token::T_DRAW:
      return drawStatement();
    case Token::T_CREATE:
      return createStatement();
    //case Token::T_BEGIN:
    //  return beginStatement();
  }

  addError(
      ERR_UNEXPECTED_TOKEN,
      "expected one of SELECT, IMPORT, SERIES or DRAW\n");
      "expected one of SELECT, CREATE or BEGIN\n");
  return nullptr;
}

@@ -274,25 +274,29 @@ ASTNode* Parser::selectStatement() {
  return select;
}

ASTNode* Parser::seriesStatement() {
  auto series = new ASTNode(ASTNode::T_SERIES);
ASTNode* Parser::createStatement() {
  consumeToken();

  if (lookahead(0, Token::T_STRING)) {
    auto name = series->appendChild(ASTNode::T_SERIES_NAME);
    name->setToken(consumeToken());
  } else {
    series->appendChild(expr());
  switch (cur_token_->getType()) {
    case Token::T_SERIES:
      consumeToken();
      if (cur_token_->getType() == Token::T_WITH) {
        consumeToken();
        auto series = new ASTNode(ASTNode::T_SERIES);
        series->appendChild(selectStatement());
        return series;
      }

  if (!expectAndConsume(Token::T_FROM)) {
    return nullptr;
    default:
      addError(
          ERR_UNEXPECTED_TOKEN,
          "expected one of SERIES, AXIS\n");
  }

  series->appendChild(selectStatement());
  return series;
  return nullptr;
}

/*
ASTNode* Parser::drawStatement() {
  auto draw = new ASTNode(ASTNode::T_DRAW);
  consumeToken();
@@ -322,7 +326,7 @@ ASTNode* Parser::drawStatement() {
  return draw;
}


*/

ASTNode* Parser::selectSublist() {
  /* table_name.* */
@@ -628,6 +632,7 @@ void Parser::addError(kParserErrorType type, const char* msg) {
  ParserError error;
  error.type = type;
  fprintf(stderr, "[ERROR] %s\n", msg);
  throw std::string(msg, strlen(msg)); // FIXPAUL
  errors_.push_back(error);
}

+1 −2
Original line number Diff line number Diff line
@@ -75,8 +75,7 @@ protected:
  ASTNode* selectStatement();
  ASTNode* selectSublist();
  ASTNode* tableName();
  ASTNode* seriesStatement();
  ASTNode* drawStatement();
  ASTNode* createStatement();

  ASTNode* fromClause();
  ASTNode* whereClause();
+0 −1
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ Query::Query(const char* query_string, query::TableRepository* repo) {
  for (auto stmt : parser.getStatements()) {
    switch (stmt->getType()) {
      case query::ASTNode::T_SELECT:
      case query::ASTNode::T_DRAW:
      case query::ASTNode::T_SERIES:
        addStatement(stmt, repo);
        break;
+45 −50
Original line number Diff line number Diff line
@@ -28,40 +28,41 @@ public:
  QueryTest() {}

  void run() {
    testTokenizerSimple();
    testTokenizerEscaping();
    testTokenizerAsClause();
    testSelectMustBeFirstAssert();
    testSelectWildcard();
    testSelectTableWildcard();
    testSelectDerivedColumn();
    testSelectDerivedColumnWithTableName();
    testSimpleValueExpression();
    testArithmeticValueExpression();
    testArithmeticValueExpressionParens();
    testArithmeticValueExpressionPrecedence();
    testNegatedValueExpression();
    testMethodCallValueExpression();
    testFromList();
    testWhereClause();
    testGroupByClause();
    testOrderByClause();
    testHavingClause();
    testLimitClause();
    testLimitOffsetClause();
    testComplexQueries();
    testSeriesStatement();
    testDerivedSeriesStatement();
    testSelectOnlyQuery();
    testSimpleTableScanQuery();
    testTableScanWhereQuery();
    testTableScanWhereLimitQuery();
    testTableScanGroupByQuery();
    testTableScanGroupByCountQuery();
    testTableScanGroupBySumQuery();
    testTableScanGroupWithoutGroupClause();
    testNamedSeriesQuery();
    testDerivedSeriesQuery();
    //testTokenizerSimple();
    //testTokenizerEscaping();
    //testTokenizerAsClause();
    //testSelectMustBeFirstAssert();
    //testSelectWildcard();
    //testSelectTableWildcard();
    //testSelectDerivedColumn();
    //testSelectDerivedColumnWithTableName();
    //testSimpleValueExpression();
    //testArithmeticValueExpression();
    //testArithmeticValueExpressionParens();
    //testArithmeticValueExpressionPrecedence();
    //testNegatedValueExpression();
    //testMethodCallValueExpression();
    //testFromList();
    //testWhereClause();
    //testGroupByClause();
    //testOrderByClause();
    //testHavingClause();
    //testLimitClause();
    //testLimitOffsetClause();
    //testComplexQueries();
    //testSeriesStatement();
    //testDerivedSeriesStatement();
    //testSelectOnlyQuery();
    //testSimpleTableScanQuery();
    //testTableScanWhereQuery();
    //testTableScanWhereLimitQuery();
    //testTableScanGroupByQuery();
    //testTableScanGroupByCountQuery();
    //testTableScanGroupBySumQuery();
    //testTableScanGroupWithoutGroupClause();
    //testNamedSeriesQuery();
    //testDerivedSeriesQuery();
    testSimpleDrawQuery();
  }

  Parser parseTestQuery(const char* query) {
@@ -845,38 +846,32 @@ public:
    }
  }


  void testRenderSeriesQuery() {
    /*
  void testSimpleDrawQuery() {
    TableRepository repo;
    repo.addTableRef("testtable",
        std::unique_ptr<TableRef>(new TestTable2Ref()));

    auto query = Query(
        "  DRAW BAR CHART;"
        ""
        "  SERIES \"myseries\" FROM"
        "  CREATE SERIES WITH"
        "    SELECT"
        "      one, two"
        "    FROM"
        "      testtable;"
        ""
        "  series \"otherseries\" from"
        "      testtable;",
 /*       ""
        "  CREATE SERIES WITH"
        "    select"
        "      one, two + 5"
        "      one as x, two + 5 as y"
        "    from"
        "      testtable;"
        ""
        "  series \"fuseries\" from"
        "  CREATE SERIES WITH"
        "    select"
        "      one, two + 3"
        "      one as x, two + 3 as y"
        "    from"
        "      testtable;",
        "      testtable;",*/
        &repo);

    SVGTarget target;
    query.execute(&target);
    */
    query.execute();
  }

};
Loading