示例#1
0
def test_between():
    ast = query_parser.parse('x  between 1 and 2')
    eq_(ast, BetweenOp(Var('x'), NumberConst(1), NumberConst(2)))

    ast = query_parser.parse("x  between '1' and '2'")

    eq_(ast, BetweenOp(Var('x'), StringConst('1'), StringConst('2')))
示例#2
0
def test_parse_itemgetter():
    ast = query_parser.parse('$0')
    assert_is_instance(ast, ItemGetterOp)
    eq_(ast.key, 0)

    ast = query_parser.parse('$blah')
    assert_is_instance(ast, ItemGetterOp)
    eq_(ast.key, 'blah')
示例#3
0
def test_parse_itemgetter():
  ast = query_parser.parse('$0')
  assert_is_instance(ast, ItemGetterOp)
  eq_(ast.key, 0)

  ast = query_parser.parse('$blah')
  assert_is_instance(ast, ItemGetterOp)
  eq_(ast.key, 'blah')
示例#4
0
def test_parse_is():
  ast = query_parser.parse('x is y')
  eq_(
    ast,
    IsOp(Var('x'), Var('y'))
  )

  ast = query_parser.parse('x is not y')
  eq_(
    ast,
    IsNotOp(Var('x'), Var('y'))
  )
示例#5
0
def test_multiple_case_when():
    statement = "CASE " \
                  " WHEN column = '' THEN column " \
                  " WHEN column = 'a' THEN column_a " \
                  " WHEN column = 'b' THEN column_b " \
                  " ELSE CONCAT('CMC', column) " \
                  "END"

    ast = query_parser.parse(statement)

    assert_is_instance(ast, CaseWhenOp)
    assert_is_instance(ast.default_value, Function)
    assert_is_instance(ast.conditions[0]['condition'], EqOp)
    assert_is_instance(ast.conditions[0]['expr'], Var)
    assert_is_instance(ast.conditions[1]['condition'], EqOp)
    assert_is_instance(ast.conditions[1]['expr'], Var)
    assert_is_instance(ast.conditions[2]['condition'], EqOp)
    assert_is_instance(ast.conditions[2]['expr'], Var)
    eq_(ast.conditions[0]['condition'].lhs.path, 'column')
    eq_(ast.conditions[0]['condition'].rhs.const, '')
    eq_(ast.conditions[1]['condition'].lhs.path, 'column')
    eq_(ast.conditions[1]['condition'].rhs.const, 'a')
    eq_(ast.conditions[2]['condition'].lhs.path, 'column')
    eq_(ast.conditions[2]['condition'].rhs.const, 'b')
    eq_(ast.conditions[0]['expr'].path, 'column')
    eq_(ast.conditions[1]['expr'].path, 'column_a')
    eq_(ast.conditions[2]['expr'].path, 'column_b')
    eq_(ast.default_value.name, 'CONCAT')
    eq_(ast.default_value.args[0].const, 'CMC')
    eq_(ast.default_value.args[1].path, 'column')
示例#6
0
def test_parse_tuple():
  ast = query_parser.parse('(1,2, "a")')
  assert_is_instance(ast, Tuple)
  eq_(len(ast.exprs), 3)
  assert_is_instance(ast.exprs[0], NumberConst)
  assert_is_instance(ast.exprs[1], NumberConst)
  assert_is_instance(ast.exprs[2], StringConst)
示例#7
0
def test_parse_tuple():
    ast = query_parser.parse('(1,2, "a")')
    assert_is_instance(ast, Tuple)
    eq_(len(ast.exprs), 3)
    assert_is_instance(ast.exprs[0], NumberConst)
    assert_is_instance(ast.exprs[1], NumberConst)
    assert_is_instance(ast.exprs[2], StringConst)
示例#8
0
def test_cast_op():
    statement = "CAST(column AS BIGINT)"
    ast = query_parser.parse(statement)

    assert_is_instance(ast, CastOp)
    assert_is_instance(ast.expr, Var)
    eq_(ast.expr.path, 'column')
    eq_(ast.type, 'BIGINT')
示例#9
0
def test_single_case_when_2():
    statement = "CASE WHEN column LIKE 'true' THEN 1 ELSE 0 END"

    ast = query_parser.parse(statement)
    assert_is_instance(ast, CaseWhenOp)
    assert_is_instance(ast.default_value, Const)
    assert_is_instance(ast.conditions[0]['condition'], LikeOp)
    assert_is_instance(ast.conditions[0]['expr'], Const)
    eq_(ast.default_value.const, 0)
示例#10
0
def test_parse_function_with_multiple_args():
  ast = query_parser.parse('foo(1, x, "hi")')
  assert_is_instance(ast, Function)
  eq_(len(ast.args), 3)
  assert_is_instance(ast.args[0], NumberConst)
  assert_is_instance(ast.args[1], Var)
  assert_is_instance(ast.args[2], StringConst)
  eq_(ast.args[0].const, 1)
  eq_(ast.args[1].path, 'x')
  eq_(ast.args[2].const, 'hi')
示例#11
0
def test_parse_function_with_multiple_args():
    ast = query_parser.parse('foo(1, x, "hi")')
    assert_is_instance(ast, Function)
    eq_(len(ast.args), 3)
    assert_is_instance(ast.args[0], NumberConst)
    assert_is_instance(ast.args[1], Var)
    assert_is_instance(ast.args[2], StringConst)
    eq_(ast.args[0].const, 1)
    eq_(ast.args[1].path, 'x')
    eq_(ast.args[2].const, 'hi')
示例#12
0
def test_single_case_when_1():
    statement = "CASE WHEN column = '' THEN column ELSE CONCAT('CMC', column) END"

    ast = query_parser.parse(statement)

    assert_is_instance(ast, CaseWhenOp)
    assert_is_instance(ast.default_value, Function)
    assert_is_instance(ast.conditions[0]['condition'], EqOp)
    assert_is_instance(ast.conditions[0]['expr'], Var)
    eq_(ast.conditions[0]['condition'].lhs.path, 'column')
    eq_(ast.conditions[0]['condition'].rhs.const, '')
    eq_(ast.conditions[0]['expr'].path, 'column')
    eq_(ast.default_value.name, 'CONCAT')
    eq_(ast.default_value.args[0].const, 'CMC')
    eq_(ast.default_value.args[1].path, 'column')
示例#13
0
def test_single_case_when_3():
    statement = "CASE WHEN column != '' THEN MD5(LOWER(column)) ELSE '' END"

    ast = query_parser.parse(statement)
    assert_is_instance(ast, CaseWhenOp)
    assert_is_instance(ast.default_value, Const)
    assert_is_instance(ast.conditions[0]['condition'], NeOp)
    assert_is_instance(ast.conditions[0]['expr'], Function)
    eq_(ast.conditions[0]['condition'].lhs.path, 'column')
    eq_(ast.conditions[0]['condition'].rhs.const, '')
    eq_(ast.conditions[0]['expr'].name, 'MD5')
    assert_is_instance(ast.conditions[0]['expr'].args[0], Function)
    eq_(ast.conditions[0]['expr'].args[0].name, 'LOWER')
    eq_(ast.conditions[0]['expr'].args[0].args[0].path, 'column')
    eq_(ast.default_value.const, '')
示例#14
0
def test_single_case_when_4():
    statement = "CASE " \
                " WHEN column != '' " \
                " THEN REFLECT('org.apache.commons.codec.digest.DigestUtils', 'shaHex', LOWER(column)) " \
                " ELSE '' " \
                "END"

    ast = query_parser.parse(statement)
    assert_is_instance(ast, CaseWhenOp)
    assert_is_instance(ast.default_value, Const)
    assert_is_instance(ast.conditions[0]['condition'], NeOp)
    assert_is_instance(ast.conditions[0]['expr'], Function)
    eq_(ast.conditions[0]['condition'].lhs.path, 'column')
    eq_(ast.conditions[0]['condition'].rhs.const, '')
    eq_(ast.default_value.const, '')
    eq_(ast.conditions[0]['expr'].name, 'REFLECT')
    assert_is_instance(ast.conditions[0]['expr'].args[0], Const)
    assert_is_instance(ast.conditions[0]['expr'].args[1], Const)
    assert_is_instance(ast.conditions[0]['expr'].args[2], Function)
    eq_(ast.conditions[0]['expr'].args[0].const,
        'org.apache.commons.codec.digest.DigestUtils')
    eq_(ast.conditions[0]['expr'].args[1].const, 'shaHex')
    eq_(ast.conditions[0]['expr'].args[2].name, 'LOWER')
    eq_(ast.conditions[0]['expr'].args[2].args[0].path, 'column')
示例#15
0
def test_more_case_when():
    statement = """CASE
  WHEN
      (LOWER(x) not in ('blah', 'foo', 'baz'))
      AND (y not like 'pattern%' OR LOWER(zz) != 'hoo ha')
  THEN 1
  ELSE 0
END"""
    ast = query_parser.parse(statement)
    assert_is_instance(ast, CaseWhenOp)

    statement = """
  CASE
        WHEN event_prop14 like '%.pdf' or event_prop33 like '%.pdf' THEN  'Whitepaper Download'
        WHEN event_prop13 = 'liveball/us/bsd/form/initiated' THEN 'Contact Us'
        WHEN (event_cust24=1 or event_cust16=1 or event_cust33=1 or event_cust34=1) and product_in_evar24 != '' THEN 'Videos'
        WHEN event_prop34='en.community.dell.com/support-forums' THEN 'Training / Tutorials / Education'
        WHEN event_cust38 = 1 or event_cust39 = 1 or event_cust40 = 1 THEN 'Chat'
    END
  """
    ast = query_parser.parse(statement)
    assert_is_instance(ast, CaseWhenOp)

    ast = query_parser.parse("""
    CASE
    WHEN  LOWER(pagename) rlike '.*(:laptops|notebook|:intel_laptops|:notebook-finder|:laptops-v2|:new-envy|:.*spectre|:features|:elite|:back-to-business|:.*notebook|:tab:|:hp notebooks|:business notebooks|:notebook).*' or LOWER(channel) rlike '(hhos:laptops|pps|hhos:static|hhos:business|cs:premium:laptops|csf:en:notebooks:notebook software and how to questions|cs:ads:elite-products|cs:products:laptops|csf:en:notebooks|cs:ads:elitex3|csf:en:notebooks:business notebooks|csf:en:notebooks)'
    THEN 'personal_computers'
  END
  """)
    ast = query_parser.parse(statement)
    assert_is_instance(ast, CaseWhenOp)

    query_parser.parse("""
  CASE WHEN cast(
  (CASE WHEN coalesce(amount, '') = '' THEN '0' 
  ELSE amount END) AS DOUBLE) > 5000.0 THEN 1 ELSE 0 END


  """)
示例#16
0
def test_reseved():
    ast = query_parser.parse('`reserved`')
    assert_is_instance(ast, Var)
示例#17
0
def test_parse_function_no_args():
    ast = query_parser.parse('foo()')
    assert_is_instance(ast, Function)
    eq_(ast.name, "foo")
    eq_(ast.args, ())
示例#18
0
def test_parse_div():
  ast = query_parser.parse('1 / 2')
  assert_is_instance(ast, DivOp)  
示例#19
0
def test_parse_string():
  ast = query_parser.parse('"Hi mom"')
  assert_is_instance(ast, StringConst)
  eq_(ast.const, "Hi mom")
示例#20
0
def test_parse_or():
  ast = query_parser.parse('x = 1 or z=2')
  assert_is_instance(ast, Or)
示例#21
0
def test_parse_positive_int():
  ast = query_parser.parse('+1')
  assert_is_instance(ast, NumberConst)
  eq_(ast.const, 1)
示例#22
0
def test_parse_variable_path():
    ast = query_parser.parse('foo.x')
    assert_is_instance(ast, Var)
    eq_(ast.path, "foo.x")
示例#23
0
def test_parse_paramgetter():
  ast = query_parser.parse('?0')
  assert_is_instance(ast, ParamGetterOp)
  eq_(ast.expr, 0)
示例#24
0
def test_not_in():
    ast = query_parser.parse('x not in (1, 2)')

    eq_(ast, NotOp(InOp(Var('x'), Tuple(NumberConst(1), NumberConst(2)))))
示例#25
0
def test_parse_neg_int():
    ast = query_parser.parse('-123')
    assert_is_instance(ast, NegOp)
    assert_is_instance(ast.expr, NumberConst)
    eq_(ast.expr.const, 123)
示例#26
0
def test_parse_not_int():
    ast = query_parser.parse('not 1')
    assert_is_instance(ast, NotOp)
    assert_is_instance(ast.expr, NumberConst)
    eq_(ast.expr.const, 1)
示例#27
0
def test_parse_is_null():
    ast = query_parser.parse('x is null')
    eq_(ast, IsOp(Var('x'), NullConst()))
示例#28
0
def test_parse_is():
    ast = query_parser.parse('x is y')
    eq_(ast, IsOp(Var('x'), Var('y')))

    ast = query_parser.parse('x is not y')
    eq_(ast, IsNotOp(Var('x'), Var('y')))
示例#29
0
def test_parse_neg_int():
  ast = query_parser.parse('-123')
  assert_is_instance(ast, NegOp)
  assert_is_instance(ast.expr, NumberConst)
  eq_(ast.expr.const, 123)
示例#30
0
def test_parse_paramgetter():
    ast = query_parser.parse('?0')
    assert_is_instance(ast, ParamGetterOp)
    eq_(ast.expr, 0)
示例#31
0
def test_parse_mul():
    ast = query_parser.parse('1 *2')
    assert_is_instance(ast, MulOp)
示例#32
0
def test_parse_int():
  ast = query_parser.parse('123')
  assert_is_instance(ast, NumberConst)
  eq_(ast.const, 123)
示例#33
0
def test_parse_and():
  ast = query_parser.parse('x = 1 and z=2')
  assert_is_instance(ast, And)
示例#34
0
def test_parse_string():
    ast = query_parser.parse('"Hi mom"')
    assert_is_instance(ast, StringConst)
    eq_(ast.const, "Hi mom")
示例#35
0
def test_parse_not_int():
  ast = query_parser.parse('not 1')
  assert_is_instance(ast, NotOp)
  assert_is_instance(ast.expr, NumberConst)
  eq_(ast.expr.const, 1)
示例#36
0
def test_parse_float():
    ast = query_parser.parse('123.1')
    assert_is_instance(ast, NumberConst)
    eq_(ast.const, 123.1)
示例#37
0
def test_parse_mul():
  ast = query_parser.parse('1 *2')
  assert_is_instance(ast, MulOp)
示例#38
0
def test_parse_add():
    ast = query_parser.parse('1  + 2')
    assert_is_instance(ast, AddOp)
示例#39
0
def test_parse_add():
  ast = query_parser.parse('1  + 2')
  assert_is_instance(ast, AddOp)
示例#40
0
def test_parse_div():
    ast = query_parser.parse('1 / 2')
    assert_is_instance(ast, DivOp)
示例#41
0
def test_parse_variable_path():
  ast = query_parser.parse('foo.x')
  assert_is_instance(ast, Var)
  eq_(ast.path, "foo.x")
示例#42
0
def test_parse_is_null():
  ast = query_parser.parse('x is null')
  eq_(
    ast,
    IsOp(Var('x'), NullConst())
  )
示例#43
0
def test_parse_function_no_args():
  ast = query_parser.parse('foo()')
  assert_is_instance(ast, Function)
  eq_(ast.name, "foo")
  eq_(ast.args, ())
示例#44
0
def test_parse_function_with_args():
    ast = query_parser.parse('foo(1)')
    assert_is_instance(ast, Function)
    eq_(len(ast.args), 1)
    assert_is_instance(ast.args[0], NumberConst)
    eq_(ast.args[0].const, 1)
示例#45
0
def test_parse_function_with_args():
  ast = query_parser.parse('foo(1)')
  assert_is_instance(ast, Function)
  eq_(len(ast.args), 1)
  assert_is_instance(ast.args[0], NumberConst)
  eq_(ast.args[0].const, 1)
示例#46
0
def test_parse_or():
    ast = query_parser.parse('x = 1 or z=2')
    assert_is_instance(ast, Or)
示例#47
0
def test_parse_and():
    ast = query_parser.parse('x = 1 and z=2')
    assert_is_instance(ast, And)
示例#48
0
def test_parse_positive_int():
    ast = query_parser.parse('+1')
    assert_is_instance(ast, NumberConst)
    eq_(ast.const, 1)