def filter(table, predicates): """ Select rows from table based on boolean expressions Parameters ---------- predicates : boolean array expressions, or list thereof Returns ------- filtered_expr : TableExpr """ if isinstance(predicates, Expr): predicates = _L.unwrap_ands(predicates) predicates = util.promote_list(predicates) predicates = [ir.bind_expr(table, x) for x in predicates] resolved_predicates = [] for pred in predicates: if isinstance(pred, ir.AnalyticExpr): pred = pred.to_filter() resolved_predicates.append(pred) op = _L.apply_filter(table, resolved_predicates) return TableExpr(op)
def _clean_predicates(self, predicates): import ibis.expr.analysis as L result = [] if not isinstance(predicates, (list, tuple)): predicates = [predicates] for pred in predicates: if isinstance(pred, tuple): if len(pred) != 2: raise com.ExpressionError('Join key tuple must be ' 'length 2') lk, rk = pred lk = self.left._ensure_expr(lk) rk = self.right._ensure_expr(rk) pred = lk == rk else: pred = L.substitute_parents(pred, past_projection=False) if not isinstance(pred, ir.BooleanArray): raise com.ExpressionError('Join predicate must be comparison') preds = L.unwrap_ands(pred) result.extend(preds) return result
def join(left, right, predicates=(), how='inner'): """ Perform a relational join between two tables. Does not resolve resulting table schema. Parameters ---------- left : TableExpr right : TableExpr predicates : join expression(s) how : string, default 'inner' - 'inner': inner join - 'left': left join - 'outer': full outer join - 'semi' or 'left_semi': left semi join - 'anti': anti join Returns ------- joined : TableExpr Note, schema is not materialized yet """ klass = _join_classes[how.lower()] if isinstance(predicates, Expr): predicates = _L.unwrap_ands(predicates) op = klass(left, right, predicates) return TableExpr(op)
def join(left, right, predicates=(), how="inner"): """ Perform a relational join between two tables. Does not resolve resulting table schema. Parameters ---------- left : TableExpr right : TableExpr predicates : join expression(s) how : string, default 'inner' - 'inner': inner join - 'left': left join - 'outer': full outer join - 'semi' or 'left_semi': left semi join - 'anti': anti join Returns ------- joined : TableExpr Note, schema is not materialized yet """ klass = _join_classes[how.lower()] if isinstance(predicates, Expr): predicates = _L.unwrap_ands(predicates) op = klass(left, right, predicates) return TableExpr(op)
def _resolve_predicates(table, predicates): if isinstance(predicates, Expr): predicates = _L.unwrap_ands(predicates) predicates = util.promote_list(predicates) predicates = [ir.bind_expr(table, x) for x in predicates] resolved_predicates = [] for pred in predicates: if isinstance(pred, ir.AnalyticExpr): pred = pred.to_filter() resolved_predicates.append(pred) return resolved_predicates
def _visit(self, expr): node = expr.op() for arg in node.flat_args(): if isinstance(arg, ir.TableExpr): self._visit_table(arg) elif isinstance(arg, ir.BooleanColumn): for sub_expr in L.unwrap_ands(arg): self.predicates.append(sub_expr) self._visit(sub_expr) elif isinstance(arg, ir.Expr): self._visit(arg) else: continue
def _visit(self, expr): node = expr.op() for arg in node.flat_args(): if isinstance(arg, ir.TableExpr): self._visit_table(arg) elif isinstance(arg, ir.BooleanArray): for sub_expr in L.unwrap_ands(arg): self.predicates.append(sub_expr) self._visit(sub_expr) elif isinstance(arg, ir.Expr): self._visit(arg) else: continue
def filter(table, predicates): """ Select rows from table based on boolean expressions Parameters ---------- predicates : boolean array expressions, or list thereof Returns ------- filtered_expr : TableExpr """ if isinstance(predicates, Expr): predicates = _L.unwrap_ands(predicates) op = _L.apply_filter(table, predicates) return TableExpr(op)