def test_compile_targets_named(self): # Test the wildcard expansion. query = self.compile("SELECT length(account), account as a, date;") self.assertEqual( [qc.EvalTarget(qe.Length([qe.AccountColumn()]), 'length_account', False), qc.EvalTarget(qe.AccountColumn(), 'a', False), qc.EvalTarget(qe.DateColumn(), 'date', False)], query.c_targets)
def test_uses_balance_column(self): c_simple = qe.BalanceColumn() self.assertTrue(qx.uses_balance_column(c_simple)) c_simple_not = qe.AccountColumn() self.assertFalse(qx.uses_balance_column(c_simple_not)) c_subexpr = qc.EvalEqual(qe.BalanceColumn(), qc.EvalConstant(2012)) self.assertTrue(qx.uses_balance_column(c_subexpr)) c_subexpr_not = qc.EvalEqual(qe.AccountColumn(), qc.EvalConstant('Assets')) self.assertFalse(qx.uses_balance_column(c_subexpr_not))
def test_get_columns_and_aggregates(self): # Simple column. c_query = qe.PositionColumn() columns, aggregates = qc.get_columns_and_aggregates(c_query) self.assertEqual((1, 0), (len(columns), len(aggregates))) self.assertFalse(qc.is_aggregate(c_query)) # Multiple columns. c_query = qc.EvalAnd(qe.PositionColumn(), qe.DateColumn()) columns, aggregates = qc.get_columns_and_aggregates(c_query) self.assertEqual((2, 0), (len(columns), len(aggregates))) self.assertFalse(qc.is_aggregate(c_query)) # Simple aggregate. c_query = qe.SumPosition([qe.PositionColumn()]) columns, aggregates = qc.get_columns_and_aggregates(c_query) self.assertEqual((0, 1), (len(columns), len(aggregates))) self.assertTrue(qc.is_aggregate(c_query)) # Multiple aggregates. c_query = qc.EvalAnd(qe.First([qe.AccountColumn()]), qe.Last([qe.AccountColumn()])) columns, aggregates = qc.get_columns_and_aggregates(c_query) self.assertEqual((0, 2), (len(columns), len(aggregates))) self.assertTrue(qc.is_aggregate(c_query)) # Simple non-aggregate function. c_query = qe.Length([qe.AccountColumn()]) columns, aggregates = qc.get_columns_and_aggregates(c_query) self.assertEqual((1, 0), (len(columns), len(aggregates))) self.assertFalse(qc.is_aggregate(c_query)) # Mix of column and aggregates (this is used to detect this illegal case). c_query = qc.EvalAnd(qe.Length([qe.AccountColumn()]), qe.SumPosition([qe.PositionColumn()])) columns, aggregates = qc.get_columns_and_aggregates(c_query) self.assertEqual((1, 1), (len(columns), len(aggregates))) self.assertTrue(qc.is_aggregate(c_query))
def test_expr_unaryop(self): self.assertEqual( qc.EvalNot(qe.AccountColumn()), qc.compile_expression(qp.Not(qp.Column('account')), qe.TargetsEnvironment()))