def test_nested_loop_joins(): from convtools.conversion import join join1 = ( join( c.item(0), c.item(1), c.and_( c.LEFT.item("id") - 1 == c.RIGHT.item("ID"), c.LEFT.item("value") + 100 < c.RIGHT.item("value"), c.LEFT.item("value") > 101, c.RIGHT.item("value") < 209, c.input_arg("flag"), ), ) .as_type(list) .gen_converter(debug=True) ) assert join1( [ [{"id": i, "value": i + 100} for i in range(10)], [{"ID": i, "value": 210 - i} for i in range(10)], ], flag=True, ) == [ ({"id": 3, "value": 103}, {"ID": 2, "value": 208}), ({"id": 4, "value": 104}, {"ID": 3, "value": 207}), ({"id": 5, "value": 105}, {"ID": 4, "value": 206}), ] join2 = ( join( c.item(0), c.item(1), c.and_(c.LEFT * c.RIGHT < 30, c.LEFT + c.RIGHT > 8), ) .as_type(list) .gen_converter(debug=False) ) assert join2([range(4, 10), range(4, 10)]) == [ (4, 5), (4, 6), (4, 7), (5, 4), (5, 5), (6, 4), (7, 4), ] join3 = ( join(c.item(0), c.item(1), Eq(c.LEFT + c.RIGHT, 1)) .as_type(list) .gen_converter(debug=True) ) assert join3(([-1, 0, 1], [2, 1, 1])) == [(-1, 2), (0, 1), (0, 1)]
def test_outer_join(): join1 = ( c.join( c.item(0), c.item(1), Eq(c.LEFT, c.RIGHT, 2), how="full", ) .as_type(list) .gen_converter(debug=False) ) assert join1(([0, 1, 2, 5], [2, 3, 4, 5])) == [ (0, None), (1, None), (2, 2), (5, None), (None, 3), (None, 4), (None, 5), ] join2 = ( c.join( c.item(0), c.item(1), c.and_( c.LEFT == c.RIGHT, c.LEFT + c.RIGHT < 10, c.LEFT > 0, ), how="outer", ) .as_type(list) .gen_converter(debug=False) ) assert join2([(10, 7, 8, 0, 1, 2, 3, 3), (3, 3, 4, 5, 8)]) == [ (10, None), (7, None), (8, None), (0, None), (1, None), (2, None), (3, 3), (3, 3), (3, 3), (3, 3), (None, 4), (None, 5), (None, 8), ]