Commit 9b0768f7 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

parse GROUP OVER TIMEWINDOW(...) clause

parent d889af7d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -71,7 +71,8 @@ public:
    T_DOMAIN,
    T_DOMAIN_SCALE,
    T_GRID,
    T_LEGEND
    T_LEGEND,
    T_GROUP_OVER_TIMEWINDOW
  };

  ASTNode(kASTNodeType type);
+33 −0
Original line number Diff line number Diff line
@@ -625,6 +625,11 @@ ASTNode* Parser::groupByClause() {
    return nullptr;
  }

  // FIXPAUL move to sql extensions
  if (consumeIf(Token::T_OVER)) {
    return groupOverClause();
  }

  expectAndConsume(Token::T_BY);

  auto clause = new ASTNode(ASTNode::T_GROUP_BY);
@@ -636,6 +641,34 @@ ASTNode* Parser::groupByClause() {
  return clause;
}

// FIXPAUL move to sql extensions
ASTNode* Parser::groupOverClause() {
  expectAndConsume(Token::T_TIMEWINDOW);
  expectAndConsume(Token::T_LPAREN);

  auto clause = new ASTNode(ASTNode::T_GROUP_OVER_TIMEWINDOW);
  clause->appendChild(expectAndConsumeValueExpr());
  expectAndConsume(Token::T_COMMA);

  auto group_list = new ASTNode(ASTNode::T_GROUP_BY);
  clause->appendChild(group_list);

  clause->appendChild(expectAndConsumeValueExpr());
  if (consumeIf(Token::T_COMMA)) {
    clause->appendChild(expectAndConsumeValueExpr());
  }

  expectAndConsume(Token::T_RPAREN);

  if (consumeIf(Token::T_BY)) {
    do {
      group_list->appendChild(expr());
    } while (consumeIf(Token::T_COMMA));
  }

  return clause;
}

ASTNode* Parser::havingClause() {
  if (!consumeIf(Token::T_HAVING)) {
    return nullptr;
+1 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ protected:
  ASTNode* fromClause();
  ASTNode* whereClause();
  ASTNode* groupByClause();
  ASTNode* groupOverClause();
  ASTNode* havingClause();
  ASTNode* orderByClause();
  ASTNode* limitClause();
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ const char* Token::getTypeName(kTokenType type) {
      return "T_GROUP";

    case T_BY:
      return "T_GROUP";
      return "T_BY";

    case T_HAVING:
      return "T_HAVING";
+3 −1
Original line number Diff line number Diff line
@@ -105,7 +105,9 @@ public:
    T_INSIDE,
    T_OUTSIDE,
    T_ROTATE,
    T_LEGEND
    T_LEGEND,
    T_OVER,
    T_TIMEWINDOW
  };

  Token(kTokenType token_type);
Loading