relational operators added
This commit is contained in:
parent
199a5f9e12
commit
e44b72ce53
19
executor.cpp
19
executor.cpp
|
|
@ -205,12 +205,19 @@ bool Executor::evalRelationalOperator(const RelationalOperatorNode &filter, Tabl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (filter.op == RelationalOperatorType::greater) {
|
switch (filter.op) {
|
||||||
return comparator > 0.0;
|
case RelationalOperatorType::equal:
|
||||||
}
|
return comparator == 0.0;
|
||||||
|
case RelationalOperatorType::not_equal:
|
||||||
if (filter.op == RelationalOperatorType::equal) {
|
return comparator != 0.0;
|
||||||
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");
|
throw Exception("invalid relational operator");
|
||||||
|
|
|
||||||
3
main.cpp
3
main.cpp
|
|
@ -19,7 +19,8 @@ int main(int argc, char *argv[]) {
|
||||||
"insert into a (i, s) values(4, 'four')",
|
"insert into a (i, s) values(4, 'four')",
|
||||||
"select i, s from a where i > 2",
|
"select i, s from a where i > 2",
|
||||||
"select i, s from a where i = 1",
|
"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"
|
// "update a set s = 'three' where i = 3"
|
||||||
// "delete from a where i = 3"
|
// "delete from a where i = 3"
|
||||||
// "select i, s from a where i > 0"
|
// "select i, s from a where i > 0"
|
||||||
|
|
|
||||||
12
parser.cpp
12
parser.cpp
|
|
@ -170,7 +170,7 @@ std::unique_ptr<Node> Parser::parse_operand_node() {
|
||||||
case TokenType::identifier:
|
case TokenType::identifier:
|
||||||
return std::make_unique<DatabaseValueNode>(tokenString);
|
return std::make_unique<DatabaseValueNode>(tokenString);
|
||||||
default: ;
|
default: ;
|
||||||
// Throw exception
|
throw Exception("Unknown operand node");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -179,9 +179,17 @@ RelationalOperatorType Parser::parse_operator() {
|
||||||
switch (op.type) {
|
switch (op.type) {
|
||||||
case TokenType::equal:
|
case TokenType::equal:
|
||||||
return RelationalOperatorType::equal;
|
return RelationalOperatorType::equal;
|
||||||
|
case TokenType::not_equal:
|
||||||
|
return RelationalOperatorType::not_equal;
|
||||||
case TokenType::greater:
|
case TokenType::greater:
|
||||||
return RelationalOperatorType::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: ;
|
default: ;
|
||||||
// Throw exception
|
throw Exception("Unknown relational operator");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
19
parser.h
19
parser.h
|
|
@ -91,19 +91,26 @@ struct DatabaseValueNode : Node {
|
||||||
DatabaseValueNode(std::string name) : Node(NodeType::database_value), col_name(name) {}
|
DatabaseValueNode(std::string name) : Node(NodeType::database_value), col_name(name) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class LogicalOperatorType {
|
||||||
|
and_operator,
|
||||||
|
or_operator,
|
||||||
|
not_operator
|
||||||
|
};
|
||||||
|
|
||||||
struct LogicalOperatorNode : Node {
|
struct LogicalOperatorNode : Node {
|
||||||
// and_operator,
|
LogicalOperatorType op;
|
||||||
// or_operator,
|
|
||||||
// not_operator,
|
|
||||||
// and / or / not
|
|
||||||
std::unique_ptr<Node> left;
|
std::unique_ptr<Node> left;
|
||||||
std::unique_ptr<Node> right;
|
std::unique_ptr<Node> right;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class RelationalOperatorType {
|
enum class RelationalOperatorType {
|
||||||
equal,
|
equal,
|
||||||
greater
|
greater,
|
||||||
// =, !=, >, >=, <, <=, like
|
greater_equal,
|
||||||
|
lesser,
|
||||||
|
lesser_equal,
|
||||||
|
not_equal
|
||||||
|
// like
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RelationalOperatorNode : Node {
|
struct RelationalOperatorNode : Node {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue