def __init__(self, table_expr, proj_exprs): from ibis.expr.analysis import ExprValidator # Need to validate that the column expressions are compatible with the # input table; this means they must either be scalar expressions or # array expressions originating from the same root table expression validator = ExprValidator([table_expr]) # Resolve schema and initialize types = [] names = [] clean_exprs = [] for expr in proj_exprs: if isinstance(expr, py_string): expr = table_expr[expr] validator.assert_valid(expr) if isinstance(expr, ValueExpr): name = expr.get_name() names.append(name) types.append(expr.type()) elif rules.is_table(expr): schema = expr.schema() names.extend(schema.names) types.extend(schema.types) else: raise NotImplementedError clean_exprs.append(expr) # validate uniqueness schema = ir.Schema(names, types) HasSchema.__init__(self, schema) Node.__init__(self, [table_expr] + [clean_exprs]) self.table = table_expr self.selections = clean_exprs