def find_source_table(expr): # A more complex version of _find_base_table. # TODO: Revisit/refactor this all at some point node = expr.op() # First table expression observed for each argument that the expr # depends on first_tables = [] def push_first(arg): if not isinstance(arg, ir.Expr): return if isinstance(arg, ir.TableExpr): first_tables.append(arg) else: collect(arg.op()) def collect(node): for arg in node.flat_args(): push_first(arg) collect(node) options = util.unique_by_key(first_tables, id) if len(options) > 1: raise NotImplementedError return options[0]
def find_backend(expr): from ibis.client import Client backends = [] def walk(expr): node = expr.op() for arg in node.flat_args(): if isinstance(arg, Client): backends.append(arg) elif isinstance(arg, ir.Expr): walk(arg) walk(expr) backends = util.unique_by_key(backends, id) if len(backends) > 1: raise ValueError('Multiple backends found') return backends[0]
def find_backend(expr): backends = [] def walk(expr): node = expr.op() for arg in node.flat_args(): if isinstance(arg, Client): backends.append(arg) elif isinstance(arg, ir.Expr): walk(arg) walk(expr) backends = util.unique_by_key(backends, id) if len(backends) > 1: raise ValueError('Multiple backends found') elif len(backends) == 0: default = options.default_backend if default is None: raise com.IbisError('Expression depends on no backends, ' 'and found no default') return default return backends[0]
def distinct_roots(*args): all_roots = [] for arg in args: all_roots.extend(arg._root_tables()) return util.unique_by_key(all_roots, id)