diff options
Diffstat (limited to 'ql/ast/nodes/expressions')
52 files changed, 469 insertions, 0 deletions
diff --git a/ql/ast/nodes/expressions/__pycache__/expression.cpython-35.pyc b/ql/ast/nodes/expressions/__pycache__/expression.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..84ede5c --- /dev/null +++ b/ql/ast/nodes/expressions/__pycache__/expression.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/__pycache__/variable.cpython-35.pyc b/ql/ast/nodes/expressions/__pycache__/variable.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..b4ff8dc --- /dev/null +++ b/ql/ast/nodes/expressions/__pycache__/variable.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/addition_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/addition_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..bbc8130 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/addition_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/and_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/and_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..f004296 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/and_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/binary_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/binary_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..18d3fc0 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/binary_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/division_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/division_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..9cd8e0a --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/division_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..5d48766 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..888c85c --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_than_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_than_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..be0e395 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_than_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/less_equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..b7e8155 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/less_than_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_than_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..850a39c --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_than_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/multiplication_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/multiplication_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..ff0e1ab --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/multiplication_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/not_equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/not_equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..fe666cf --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/not_equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/or_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/or_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..0b81fc3 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/or_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/subtraction_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/subtraction_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..cd89879 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/subtraction_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/addition_operator.py b/ql/ast/nodes/expressions/binary_operators/addition_operator.py new file mode 100644 index 0000000..d6e4506 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/addition_operator.py @@ -0,0 +1,27 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class AdditionOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(AdditionOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLInteger, QLInteger): QLInteger, + (QLInteger, QLDecimal): QLDecimal, + (QLMoney, QLMoney): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value + self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/and_operator.py b/ql/ast/nodes/expressions/binary_operators/and_operator.py new file mode 100644 index 0000000..5981a6b --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/and_operator.py @@ -0,0 +1,21 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.undefined import QLUndefined + + +class AndOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(AndOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLBoolean, QLBoolean): QLBoolean, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value and self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/binary_operator.py b/ql/ast/nodes/expressions/binary_operators/binary_operator.py new file mode 100644 index 0000000..048d927 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/binary_operator.py @@ -0,0 +1,17 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class BinaryOperatorNode(ExpressionNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(BinaryOperatorNode, self).__init__(metadata, expression_type, value) + self.__left_expression = left_expression + self.__right_expression = right_expression + + @property + def left_expression(self): + return self.__left_expression + + @property + def right_expression(self): + return self.__right_expression + diff --git a/ql/ast/nodes/expressions/binary_operators/division_operator.py b/ql/ast/nodes/expressions/binary_operators/division_operator.py new file mode 100644 index 0000000..16d5063 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/division_operator.py @@ -0,0 +1,31 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class DivisionOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(DivisionOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLInteger, QLInteger): QLDecimal, + (QLInteger, QLDecimal): QLDecimal, + (QLMoney, QLDecimal): QLMoney, + (QLMoney, QLInteger): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + try: + self.value = self.left_expression.value / self.right_expression.value + except ZeroDivisionError: + self.value = QLUndefined() diff --git a/ql/ast/nodes/expressions/binary_operators/equals_operator.py b/ql/ast/nodes/expressions/binary_operators/equals_operator.py new file mode 100644 index 0000000..21315f9 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/equals_operator.py @@ -0,0 +1,15 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean + + +class EqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(EqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + + @staticmethod + def get_result_type(): + return QLBoolean + + def evaluate(self): + self.value = self.left_expression.value == self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/greater_equals_operator.py b/ql/ast/nodes/expressions/binary_operators/greater_equals_operator.py new file mode 100644 index 0000000..0512688 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/greater_equals_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class GreaterEqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(GreaterEqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value >= self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/greater_than_operator.py b/ql/ast/nodes/expressions/binary_operators/greater_than_operator.py new file mode 100644 index 0000000..460c909 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/greater_than_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class GreaterThanOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(GreaterThanOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value > self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/less_equals_operator.py b/ql/ast/nodes/expressions/binary_operators/less_equals_operator.py new file mode 100644 index 0000000..f5b86df --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/less_equals_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class LessEqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(LessEqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value <= self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/less_than_operator.py b/ql/ast/nodes/expressions/binary_operators/less_than_operator.py new file mode 100644 index 0000000..65b456d --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/less_than_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class LessThanOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(LessThanOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value < self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/multiplication_operator.py b/ql/ast/nodes/expressions/binary_operators/multiplication_operator.py new file mode 100644 index 0000000..b014c0e --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/multiplication_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class MultiplicationOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(MultiplicationOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLDecimal, QLMoney): QLMoney, + (QLInteger, QLInteger): QLInteger, + (QLInteger, QLDecimal): QLDecimal, + (QLInteger, QLMoney): QLMoney, + (QLMoney, QLDecimal): QLMoney, + (QLMoney, QLInteger): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value * self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/not_equals_operator.py b/ql/ast/nodes/expressions/binary_operators/not_equals_operator.py new file mode 100644 index 0000000..3be2e5f --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/not_equals_operator.py @@ -0,0 +1,15 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean + + +class NotEqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(NotEqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + + @staticmethod + def get_result_type(): + return QLBoolean + + def evaluate(self): + self.value = self.left_expression.value != self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/or_operator.py b/ql/ast/nodes/expressions/binary_operators/or_operator.py new file mode 100644 index 0000000..4314868 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/or_operator.py @@ -0,0 +1,21 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.undefined import QLUndefined + + +class OrOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(OrOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLBoolean, QLBoolean): QLBoolean, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value or self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/subtraction_operator.py b/ql/ast/nodes/expressions/binary_operators/subtraction_operator.py new file mode 100644 index 0000000..8ebda15 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/subtraction_operator.py @@ -0,0 +1,27 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class SubtractionOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(SubtractionOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLInteger, QLInteger): QLInteger, + (QLInteger, QLDecimal): QLDecimal, + (QLMoney, QLMoney): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value - self.right_expression.value diff --git a/ql/ast/nodes/expressions/expression.py b/ql/ast/nodes/expressions/expression.py new file mode 100644 index 0000000..1364c0b --- /dev/null +++ b/ql/ast/nodes/expressions/expression.py @@ -0,0 +1,24 @@ +from ql.ast.nodes.base import BaseNode + + +class ExpressionNode(BaseNode): + def __init__(self, metadata, expression_type, value): + super(ExpressionNode, self).__init__(metadata) + self.__expression_type = expression_type + self.__value = value + + @property + def expression_type(self): + return self.__expression_type + + @expression_type.setter + def expression_type(self, value): + self.__expression_type = value + + @property + def value(self): + return self.__value + + @value.setter + def value(self, value): + self.__value = value diff --git a/ql/ast/nodes/expressions/literals/__pycache__/boolean_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/boolean_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..a6d43b1 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/boolean_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/date_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/date_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..33abf57 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/date_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/decimal_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/decimal_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..145ab16 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/decimal_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/integer_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/integer_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..33f5c62 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/integer_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..98af8e6 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/money_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/money_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..9dbf5d0 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/money_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/string_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/string_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..dbb3f72 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/string_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/undefined_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/undefined_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..73ce02b --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/undefined_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/boolean_literal.py b/ql/ast/nodes/expressions/literals/boolean_literal.py new file mode 100644 index 0000000..234e548 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/boolean_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class BooleanNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(BooleanNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/date_literal.py b/ql/ast/nodes/expressions/literals/date_literal.py new file mode 100644 index 0000000..971ab58 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/date_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class DateNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(DateNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/decimal_literal.py b/ql/ast/nodes/expressions/literals/decimal_literal.py new file mode 100644 index 0000000..7cc4eb5 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/decimal_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class DecimalNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(DecimalNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/integer_literal.py b/ql/ast/nodes/expressions/literals/integer_literal.py new file mode 100644 index 0000000..36923f9 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/integer_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class IntegerNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(IntegerNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/literal.py b/ql/ast/nodes/expressions/literals/literal.py new file mode 100644 index 0000000..a0e03ae --- /dev/null +++ b/ql/ast/nodes/expressions/literals/literal.py @@ -0,0 +1,14 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class LiteralNode(ExpressionNode): + def __init__(self, metadata, expression_type, value): + super(LiteralNode, self).__init__(metadata, expression_type, value) + + @ExpressionNode.expression_type.setter + def expression_type(self, unused): + pass + + @ExpressionNode.value.setter + def value(self, unused): + pass diff --git a/ql/ast/nodes/expressions/literals/money_literal.py b/ql/ast/nodes/expressions/literals/money_literal.py new file mode 100644 index 0000000..119e5ff --- /dev/null +++ b/ql/ast/nodes/expressions/literals/money_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class MoneyNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(MoneyNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/string_literal.py b/ql/ast/nodes/expressions/literals/string_literal.py new file mode 100644 index 0000000..4fac895 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/string_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class StringNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(StringNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/undefined_literal.py b/ql/ast/nodes/expressions/literals/undefined_literal.py new file mode 100644 index 0000000..4109df6 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/undefined_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class UndefinedNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(UndefinedNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/unary_operators/__pycache__/negation_operator.cpython-35.pyc b/ql/ast/nodes/expressions/unary_operators/__pycache__/negation_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..9a6e409 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/__pycache__/negation_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/unary_operators/__pycache__/negative_operator.cpython-35.pyc b/ql/ast/nodes/expressions/unary_operators/__pycache__/negative_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..45ad495 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/__pycache__/negative_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/unary_operators/__pycache__/unary_operator.cpython-35.pyc b/ql/ast/nodes/expressions/unary_operators/__pycache__/unary_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..f72b4f0 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/__pycache__/unary_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/unary_operators/negation_operator.py b/ql/ast/nodes/expressions/unary_operators/negation_operator.py new file mode 100644 index 0000000..7b6b0c5 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/negation_operator.py @@ -0,0 +1,20 @@ +from ql.ast.nodes.expressions.unary_operators.unary_operator import UnaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.undefined import QLUndefined + + +class NegationOperatorNode(UnaryOperatorNode): + def __init__(self, metadata, expression_type, expression, value): + super(NegationOperatorNode, self).__init__(metadata, expression_type, expression, value) + self.__valid_types = { + QLBoolean: QLBoolean, + } + + def get_result_type(self): + if self.__valid_types.get(self.expression.expression_type): + return self.__valid_types.get(self.expression.expression_type) + + return QLUndefined + + def evaluate(self): + self.value = QLBoolean(not self.expression.value) diff --git a/ql/ast/nodes/expressions/unary_operators/negative_operator.py b/ql/ast/nodes/expressions/unary_operators/negative_operator.py new file mode 100644 index 0000000..359ed2e --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/negative_operator.py @@ -0,0 +1,23 @@ +from ql.ast.nodes.expressions.unary_operators.unary_operator import UnaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class NegativeOperatorNode(UnaryOperatorNode): + def __init__(self, metadata, expression_type, expression, value): + super(NegativeOperatorNode, self).__init__(metadata, expression_type, expression, value) + self.__valid_types = { + QLDecimal: QLDecimal, + QLInteger: QLInteger, + QLMoney: QLMoney} + + def get_result_type(self): + if self.__valid_types.get(self.expression.expression_type): + return self.__valid_types.get(self.expression.expression_type) + + return QLUndefined + + def evaluate(self): + self.value = -self.expression.value diff --git a/ql/ast/nodes/expressions/unary_operators/unary_operator.py b/ql/ast/nodes/expressions/unary_operators/unary_operator.py new file mode 100644 index 0000000..fa75249 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/unary_operator.py @@ -0,0 +1,11 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class UnaryOperatorNode(ExpressionNode): + def __init__(self, metadata, expression_type, expression, value): + super(UnaryOperatorNode, self).__init__(metadata, expression_type, value) + self.__expression = expression + + @property + def expression(self): + return self.__expression diff --git a/ql/ast/nodes/expressions/variable.py b/ql/ast/nodes/expressions/variable.py new file mode 100644 index 0000000..c126372 --- /dev/null +++ b/ql/ast/nodes/expressions/variable.py @@ -0,0 +1,11 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class VariableNode(ExpressionNode): + def __init__(self, metadata, expression_type, identifier, value): + super(VariableNode, self).__init__(metadata, expression_type, value) + self.__identifier = identifier + + @property + def identifier(self): + return self.__identifier |