work on order by began
This commit is contained in:
83
parser.cpp
83
parser.cpp
@@ -176,7 +176,7 @@ namespace usql {
|
||||
return std::make_unique<InsertIntoTableNode>(table_name, column_names, std::move(column_values));
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_value() {
|
||||
std::unique_ptr<Node> Parser::parse_value() {
|
||||
if (m_lexer.tokenType() == TokenType::int_number) {
|
||||
return std::make_unique<IntValueNode>(std::stoi(m_lexer.consumeCurrentToken().token_string));
|
||||
}
|
||||
@@ -205,9 +205,9 @@ std::unique_ptr<Node> Parser::parse_value() {
|
||||
}
|
||||
|
||||
throw Exception("Syntax error, current token: " + m_lexer.currentToken().token_string);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_select_from_table() {
|
||||
std::unique_ptr<Node> Parser::parse_select_from_table() {
|
||||
auto cols = std::make_unique<std::vector<SelectColNode>>();
|
||||
|
||||
m_lexer.skipToken(TokenType::keyword_select);
|
||||
@@ -235,12 +235,13 @@ std::unique_ptr<Node> Parser::parse_select_from_table() {
|
||||
|
||||
std::unique_ptr<Node> where_node = parse_where_clause();
|
||||
|
||||
// if (m_lexer.tokenType() == TokenType::keyword_order_by) {}
|
||||
std::vector<ColOrderNode> orderby_node = parse_orderby_clause();
|
||||
|
||||
// if (m_lexer.tokenType() == TokenType::keyword_offset) {}
|
||||
// if (m_lexer.tokenType() == TokenType::keyword_limit) {}
|
||||
|
||||
return std::make_unique<SelectFromTableNode>(table_name, std::move(cols), std::move(where_node));
|
||||
}
|
||||
return std::make_unique<SelectFromTableNode>(table_name, std::move(cols), std::move(where_node), orderby_node);
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_delete_from_table() {
|
||||
m_lexer.skipToken(TokenType::keyword_delete);
|
||||
@@ -291,26 +292,62 @@ std::unique_ptr<Node> Parser::parse_select_from_table() {
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_where_clause() {
|
||||
// TODO add support for multiple filters
|
||||
// TODO add support for parenthesis
|
||||
if (m_lexer.tokenType() != TokenType::keyword_where) {
|
||||
return std::make_unique<TrueNode>();
|
||||
}
|
||||
|
||||
if (m_lexer.tokenType() != TokenType::keyword_where) {
|
||||
return std::make_unique<TrueNode>();
|
||||
}
|
||||
std::unique_ptr<Node> node;
|
||||
m_lexer.skipToken(TokenType::keyword_where);
|
||||
do {
|
||||
node = parse_relational_expression();
|
||||
|
||||
std::unique_ptr<Node> node;
|
||||
m_lexer.skipToken(TokenType::keyword_where);
|
||||
do {
|
||||
node = parse_relational_expression();
|
||||
if (Lexer::isLogicalOperator(m_lexer.tokenType())) {
|
||||
auto operation = parse_logical_operator();
|
||||
std::unique_ptr<Node> node2 = parse_relational_expression();
|
||||
node = std::make_unique<LogicalOperatorNode>(operation, std::move(node), std::move(node2));
|
||||
}
|
||||
} while (m_lexer.tokenType() != TokenType::eof && m_lexer.tokenType() != TokenType::keyword_order);
|
||||
|
||||
if (Lexer::isLogicalOperator(m_lexer.tokenType())) {
|
||||
auto operation = parse_logical_operator();
|
||||
std::unique_ptr<Node> node2 = parse_relational_expression();
|
||||
node = std::make_unique<LogicalOperatorNode>(operation, std::move(node), std::move(node2));
|
||||
}
|
||||
} while (m_lexer.tokenType() != TokenType::eof); // until whole where clause parsed
|
||||
return node;
|
||||
}
|
||||
|
||||
return node;
|
||||
|
||||
std::vector<ColOrderNode> Parser::parse_orderby_clause() {
|
||||
std::vector<ColOrderNode> order_cols;
|
||||
|
||||
if (m_lexer.tokenType() == TokenType::keyword_order) {
|
||||
m_lexer.skipToken(TokenType::keyword_order);
|
||||
m_lexer.skipToken(TokenType::keyword_by);
|
||||
|
||||
do {
|
||||
int col_index = -1;
|
||||
bool asc = true;
|
||||
|
||||
auto token_type = m_lexer.tokenType();
|
||||
std::string tokenString = m_lexer.consumeCurrentToken().token_string;
|
||||
switch (token_type) {
|
||||
case TokenType::int_number:
|
||||
col_index = std::stoi(tokenString);
|
||||
break;
|
||||
default:
|
||||
throw Exception("column index alloved in order by clause at this moment");
|
||||
}
|
||||
|
||||
if (m_lexer.tokenType() == TokenType::keyword_asc) {
|
||||
m_lexer.skipToken(TokenType::keyword_asc);
|
||||
} else if (m_lexer.tokenType() == TokenType::keyword_desc) {
|
||||
m_lexer.skipToken(TokenType::keyword_desc);
|
||||
asc = false;
|
||||
}
|
||||
|
||||
order_cols.push_back(ColOrderNode{col_index, asc});
|
||||
|
||||
m_lexer.skipTokenOptional(TokenType::comma);
|
||||
|
||||
} while (m_lexer.tokenType() != TokenType::eof); // && m_lexer.tokenType() != TokenType::keyword_offset && m_lexer.tokenType() != TokenType::keyword_limit);
|
||||
}
|
||||
|
||||
return order_cols;
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_relational_expression() {
|
||||
@@ -336,7 +373,7 @@ std::unique_ptr<Node> Parser::parse_select_from_table() {
|
||||
return std::make_unique<DatabaseValueNode>(tokenString);
|
||||
case TokenType::keyword_null:
|
||||
return std::make_unique<NullValueNode>();
|
||||
default:;
|
||||
default:
|
||||
throw Exception("Unknown operand node");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user