diff --git a/ibis/expr/operations/relations.py b/ibis/expr/operations/relations.py index eae216792bb4..c96dd53a3bc6 100644 --- a/ibis/expr/operations/relations.py +++ b/ibis/expr/operations/relations.py @@ -13,6 +13,7 @@ import ibis.expr.types as ir import ibis.util as util from ibis.common.annotations import attribute +from ibis.expr.deferred import Deferred from ibis.expr.operations.core import Named, Node, Value from ibis.expr.operations.generic import TableColumn from ibis.expr.operations.logical import Equals, ExistsSubquery, NotExistsSubquery @@ -109,6 +110,9 @@ def _clean_join_predicates(left, right, predicates): pred = left.to_expr()[pred] == right.to_expr()[pred] elif isinstance(pred, Value): pred = pred.to_expr() + elif isinstance(pred, Deferred): + # resolve deferred expressions on the left table + pred = pred.resolve(left.to_expr()) elif not isinstance(pred, ir.Expr): raise NotImplementedError diff --git a/ibis/tests/expr/test_table.py b/ibis/tests/expr/test_table.py index a9f1e0e766d0..1590b07ce64b 100644 --- a/ibis/tests/expr/test_table.py +++ b/ibis/tests/expr/test_table.py @@ -794,6 +794,14 @@ def test_join_no_predicate_list(con): assert_equal(joined, expected) +def test_join_deferred(con): + region = con.table("tpch_region") + nation = con.table("tpch_nation") + res = region.join(nation, _.r_regionkey == nation.n_regionkey) + exp = region.join(nation, region.r_regionkey == nation.n_regionkey) + assert_equal(res, exp) + + def test_asof_join(): left = ibis.table([('time', 'int32'), ('value', 'double')]) right = ibis.table([('time', 'int32'), ('value2', 'double')])