Skip to content

Commit d6cdfe3

Browse files
committed
Add test for independent handles in CaseBuilder to verify behavior
1 parent 03a1022 commit d6cdfe3

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

python/tests/test_expr.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,42 @@ def test_case_builder_success_preserves_builder_state():
241241
assert end_two[0].column(0).to_pylist() == ["default-2"]
242242

243243

244+
def test_case_builder_when_handles_are_independent():
245+
ctx = SessionContext()
246+
df = ctx.from_pydict(
247+
{
248+
"flag": [True, False, False, False],
249+
"value": [1, 15, 25, 5],
250+
},
251+
name="tbl",
252+
)
253+
254+
base_builder = functions.when(col("flag"), lit("flag-true"))
255+
256+
first_builder = base_builder.when(col("value") > lit(10), lit("gt10"))
257+
second_builder = base_builder.when(col("value") > lit(20), lit("gt20"))
258+
259+
first_builder = first_builder.when(lit(True), lit("final-one"))
260+
261+
expr_first = first_builder.otherwise(lit("fallback-one")).alias("first")
262+
expr_second = second_builder.otherwise(lit("fallback-two")).alias("second")
263+
264+
result = df.select(expr_first, expr_second).collect()[0]
265+
266+
assert result.column(0).to_pylist() == [
267+
"flag-true",
268+
"gt10",
269+
"gt10",
270+
"final-one",
271+
]
272+
assert result.column(1).to_pylist() == [
273+
"flag-true",
274+
"fallback-two",
275+
"gt20",
276+
"fallback-two",
277+
]
278+
279+
244280
def test_expr_getitem() -> None:
245281
ctx = SessionContext()
246282
data = {

src/expr/conditional_expr.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ impl PyCaseBuilder {
6868
#[pymethods]
6969
impl PyCaseBuilder {
7070
fn when(&self, when: PyExpr, then: PyExpr) -> PyDataFusionResult<PyCaseBuilder> {
71-
let mut builder = self.take_case_builder()?;
71+
let builder = self.take_case_builder()?;
7272
let next_builder = builder.when(when.expr, then.expr);
73-
self.store_case_builder(next_builder);
74-
Ok(self.clone())
73+
self.store_case_builder(next_builder.clone());
74+
Ok(next_builder.into())
7575
}
7676

7777
fn otherwise(&self, else_expr: PyExpr) -> PyDataFusionResult<PyExpr> {

0 commit comments

Comments
 (0)