def broadcast_collect(expr, broadcastable=Broadcastable, want_to_broadcast=WantToBroadcast, no_recurse=None): """ Collapse expression down using Broadcast - Tabular cases only Expressions of type Broadcastables are swallowed into Broadcast operations >>> t = symbol('t', 'var * {x: int, y: int, z: int, when: datetime}') >>> expr = (t.x + 2*t.y).distinct() >>> broadcast_collect(expr) distinct(Broadcast(_children=(t,), _scalars=(t,), _scalar_expr=t.x + (2 * t.y))) >>> from blaze import exp >>> expr = t.x + 2 * exp(-(t.x - 1.3) ** 2) >>> broadcast_collect(expr) Broadcast(_children=(t,), _scalars=(t,), _scalar_expr=t.x + (2 * (exp(-((t.x - 1.3) ** 2))))) """ if (isinstance(expr, want_to_broadcast) and iscollection(expr.dshape)): leaves = leaves_of_type(broadcastable, expr) expr = broadcast(expr, sorted(leaves, key=str)) if no_recurse is not None and isinstance(expr, no_recurse): return expr # Recurse down children = ( broadcast_collect(i, broadcastable, want_to_broadcast, no_recurse) for i in expr._inputs ) return expr._subs({e: c for e, c in zip(expr._inputs, children)})
def post_compute(expr, query, scope=None): result = query.context.sql(sql_string(query.query)) if iscollection(expr.dshape) and isscalar(expr.dshape.measure): result = result.map(lambda x: x[0]) return result.collect()