def test_index_access_right_hand(): actual = ExpressionParser.parse(to_tokens("field = array[0]")) expected = Condition( Column("field"), "=", Index(Column("array"), [Integer(0)]), ) assert actual == expected
def test_chained_field(): actual, _ = ExpressionParser.parse( to_tokens("table.field[offset(0)].subfield[offset(0)]")) expected = ChainedColumns( Column("table"), ChainedColumns( Index(Column("field"), [FunctionCall("offset", Integer(0))]), Index(Column("subfield"), [FunctionCall("offset", Integer(0))]), ), ) assert actual == expected
def test_multiple_indices_access(): actual, _ = ExpressionParser.parse(to_tokens("array[index(0), 'foo'] alias")) expected = Alias( Index( Column("array"), [FunctionCall("index", Integer(0)), String("foo", quotes="'")], ), with_as=False, alias="alias", ) assert actual == expected
def test_boolean_condition(): actual, _ = ExpressionParser.parse(to_tokens("f1 IS NOT NULL AND f2 > 0 fnew")) expected = Alias( BooleanCondition( "AND", Condition(Column("f1"), "is not", Null()), Condition(Column("f2"), ">", Integer(0)), ), with_as=False, alias="fnew", ) assert actual == expected
def test_consecutive_parenthesis(): actual = ExpressionParser.parse(to_tokens("((col+1) = 3 AND col2=4)")) expected = Parenthesis( BooleanCondition( "and", Condition(Parenthesis(Addition(Column("col"), Integer(1))), "=", Integer(3)), Condition( Column("col2"), "=", Integer(4), ), )) assert actual == expected
def test_nested_date_functions(): actual, _ = ExpressionParser.parse( to_tokens("DATE(TIMESTAMP_TRUNC(CAST(date AS TIMESTAMP), MONTH))")) expected = FunctionCall( "DATE", FunctionCall( "TIMESTAMP_TRUNC", CastFunctionCall( Column("date"), Type("TIMESTAMP"), ), Type("MONTH"), ), ) assert actual == expected
def test_nested_date_functions(): actual = ExpressionParser.parse( to_tokens("DATE(TIMESTAMP_TRUNC(CAST(a.date AS TIMESTAMP), MONTH))")) expected = FunctionCall( "date", FunctionCall( "timestamp_trunc", FunctionCall( "cast", Alias(Column("a.date"), alias=Type("timestamp"), with_as=True)), Type("month"), ), ) assert actual == expected
def test_boolean_condition_as_expression(): sql = "field is not null and col > 0" actual, _ = ExpressionParser.parse(to_tokens(sql)) expected = BooleanCondition( "and", Condition( Column("field"), "is not", Null(), ), Condition( Column("col"), ">", Integer(0), ), ) assert actual == expected
def test_chained_columns_with_arithmetic_operator(): actual, _ = ExpressionParser.parse( to_tokens("IF((a.field + b.field) = 200, 'true', 'false') fa")) expected = Alias( FunctionCall( "IF", *[ Condition( Parenthesis( ArithmaticOperator( "+", ChainedColumns(Column("a"), Column("field")), ChainedColumns(Column("b"), Column("field")), )), "=", Integer(200), ), String("true", quotes="'"), String("false", quotes="'"), ]), with_as=False, alias="fa", ) assert actual == expected
def test_simple_function_multiple_params(): actual = ExpressionParser.parse(to_tokens("test(col, 'Test')")) expected = FunctionCall("test", Column("col"), String("Test", quotes="'")) assert actual == expected
def test_addition(): actual = ExpressionParser.parse(to_tokens("2+4")) expected = Addition(Integer(2), Integer(4)) assert actual == expected
def test_index_function_access(): actual = ExpressionParser.parse(to_tokens("array[index(0)]")) expected = Index(Column("array"), [FunctionCall("index", Integer(0))]) assert actual == expected
def test_simple_function_parsing_no_args(): actual = ExpressionParser.parse(to_tokens("test()")) expected = FunctionCall("test") assert actual == expected
def test_index_access_alias(): actual = ExpressionParser.parse(to_tokens("array[0] alias")) expected = Alias(Index(Column("array"), [Integer(0)]), with_as=False, alias="alias") assert actual == expected
def test_index_access(): actual = ExpressionParser.parse(to_tokens("array[0]")) expected = Index(Column("array"), [Integer(0)]) assert actual == expected
def test_conditional_expression(): actual = ExpressionParser.parse(to_tokens("field = 4")) expected = Condition(Column("field"), "=", Integer(4)) assert actual == expected
def test_negative_integer(): actual = ExpressionParser.parse(to_tokens("-2")) expected = Integer(-2) assert actual == expected
def test_string_value(): actual = ExpressionParser.parse(to_tokens("'VAL'")) expected = String("VAL", quotes="'") assert actual == expected
def test_string_value_back_quotes(): actual = ExpressionParser.parse(to_tokens("`val`")) expected = String("val", quotes="`") assert actual == expected
def test_parenthesis_multiple_elements(): actual = ExpressionParser.parse(to_tokens("(field,other_field,3,'test')")) expected = Parenthesis(Column("field"), Column("other_field"), Integer(3), String("test", quotes="'")) assert actual == expected
def test_parenthesis_conditional(): actual = ExpressionParser.parse(to_tokens("(field+3) = 4")) expected = Condition(Parenthesis(Addition(Column("field"), Integer(3))), "=", Integer(4)) assert actual == expected
def test_multiple_parentheses(): actual = ExpressionParser.parse(to_tokens("((2))")) expected = Parenthesis(Parenthesis(Integer(2))) assert actual == expected
def test_parenthesis(): actual = ExpressionParser.parse(to_tokens("(field)")) expected = Parenthesis(Column("field")) assert actual == expected
def test_nested_functions(): actual = ExpressionParser.parse(to_tokens("test(foo(col))")) expected = FunctionCall("test", FunctionCall("foo", Column("col"))) assert actual == expected
def test_parse_date_function(): actual = ExpressionParser.parse(to_tokens("col >= DATE('2020-01-01')")) expected = Condition( Column("col"), ">=", FunctionCall("date", String("2020-01-01", quotes="'"))) assert actual == expected
def test_chained_addition(): actual = ExpressionParser.parse(to_tokens("2+4+5")) expected = Addition(Integer(2), Addition(Integer(4), Integer(5))) assert actual == expected
def test_string_value_double_quotes(): actual = ExpressionParser.parse(to_tokens('"val"')) expected = String("val", quotes='"') assert actual == expected
def test_parse_date_function1(): actual = ExpressionParser.parse(to_tokens("DATE('2020-01-01')")) expected = FunctionCall("date", String("2020-01-01", quotes="'")) assert actual == expected
def test_aliased_column(): actual = ExpressionParser.parse(to_tokens("col AS column_name")) expected = Alias(Column("col"), alias=Column("column_name"), with_as=True) assert actual == expected
def test_simple_function_parsing(): actual = ExpressionParser.parse(to_tokens("test(col)")) expected = FunctionCall("test", Column("col")) assert actual == expected