From e44b72ce532f80ead684a22d6da44988e40d2c98 Mon Sep 17 00:00:00 2001 From: VaclavT Date: Thu, 8 Jul 2021 07:43:10 +0200 Subject: [PATCH] relational operators added --- executor.cpp | 19 +++++++++++++------ main.cpp | 3 ++- parser.cpp | 12 ++++++++++-- parser.h | 19 +++++++++++++------ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/executor.cpp b/executor.cpp index 598e070..b7a474c 100644 --- a/executor.cpp +++ b/executor.cpp @@ -205,12 +205,19 @@ bool Executor::evalRelationalOperator(const RelationalOperatorNode &filter, Tabl } - if (filter.op == RelationalOperatorType::greater) { - return comparator > 0.0; - } - - if (filter.op == RelationalOperatorType::equal) { - return comparator == 0.0; + switch (filter.op) { + case RelationalOperatorType::equal: + return comparator == 0.0; + case RelationalOperatorType::not_equal: + return comparator != 0.0; + case RelationalOperatorType::greater: + return comparator > 0.0; + case RelationalOperatorType::greater_equal: + return comparator >= 0.0; + case RelationalOperatorType::lesser: + return comparator < 0.0; + case RelationalOperatorType::lesser_equal: + return comparator <= 0.0; } throw Exception("invalid relational operator"); diff --git a/main.cpp b/main.cpp index 4d04f2e..cc9bf4b 100644 --- a/main.cpp +++ b/main.cpp @@ -19,7 +19,8 @@ int main(int argc, char *argv[]) { "insert into a (i, s) values(4, 'four')", "select i, s from a where i > 2", "select i, s from a where i = 1", - "select i, s from a where s = 'two'" + "select i, s from a where s = 'two'", + "select i, s from a where i <= 3" // "update a set s = 'three' where i = 3" // "delete from a where i = 3" // "select i, s from a where i > 0" diff --git a/parser.cpp b/parser.cpp index 3030c3a..50f6b48 100644 --- a/parser.cpp +++ b/parser.cpp @@ -170,7 +170,7 @@ std::unique_ptr Parser::parse_operand_node() { case TokenType::identifier: return std::make_unique(tokenString); default: ; - // Throw exception + throw Exception("Unknown operand node"); } } @@ -179,9 +179,17 @@ RelationalOperatorType Parser::parse_operator() { switch (op.type) { case TokenType::equal: return RelationalOperatorType::equal; + case TokenType::not_equal: + return RelationalOperatorType::not_equal; case TokenType::greater: return RelationalOperatorType::greater; + case TokenType::greater_equal: + return RelationalOperatorType::greater_equal; + case TokenType::lesser: + return RelationalOperatorType::lesser; + case TokenType::lesser_equal: + return RelationalOperatorType::lesser_equal; default: ; - // Throw exception + throw Exception("Unknown relational operator"); } } \ No newline at end of file diff --git a/parser.h b/parser.h index bedca1e..4b71028 100644 --- a/parser.h +++ b/parser.h @@ -91,19 +91,26 @@ struct DatabaseValueNode : Node { DatabaseValueNode(std::string name) : Node(NodeType::database_value), col_name(name) {} }; +enum class LogicalOperatorType { + and_operator, + or_operator, + not_operator +}; + struct LogicalOperatorNode : Node { -// and_operator, -// or_operator, -// not_operator, - // and / or / not + LogicalOperatorType op; std::unique_ptr left; std::unique_ptr right; }; enum class RelationalOperatorType { equal, - greater - // =, !=, >, >=, <, <=, like + greater, + greater_equal, + lesser, + lesser_equal, + not_equal + // like }; struct RelationalOperatorNode : Node {