From b51a64b40a6feb274a541fd677c39dab8d59b55f Mon Sep 17 00:00:00 2001 From: Jim Crist-Harif Date: Fri, 4 Nov 2022 16:50:12 -0500 Subject: [PATCH] feat: support deferred predicates in join --- ibis/expr/operations/relations.py | 4 ++++ ibis/tests/expr/test_table.py | 8 ++++++++ 2 files changed, 12 insertions(+) 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')])