Skip to content

Commit af6dc15

Browse files
authored
Merge pull request #414 from posit-dev/fix-segments-lazyframe-error
fix: segments-based LazyFrame error
2 parents 6e06973 + 4642310 commit af6dc15

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

pointblank/validate.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21113,6 +21113,8 @@ def _evaluate_segments(self, validation_info):
2111321113
continue
2111421114

2111521115
# Evaluate the segments expression
21116+
seg_tuples = []
21117+
2111621118
try:
2111721119
# Get the table for this step, it can either be:
2111821120
# 1. the target table itself
@@ -21158,6 +21160,8 @@ def _evaluate_segments(self, validation_info):
2115821160

2115921161
except Exception: # pragma: no cover
2116021162
validation.eval_error = True
21163+
expanded_validation_info.append(validation)
21164+
continue
2116121165

2116221166
# For each segmentation resolved, create a new validation step and add it to the list of
2116321167
# expanded validation steps
@@ -22651,6 +22655,10 @@ def _seg_expr_from_string(data_tbl: Any, segments_expr: str) -> tuple[str, str]:
2265122655
data_nw = nw.from_native(data_tbl)
2265222656
unique_vals = data_nw.select(nw.col(segments_expr)).unique()
2265322657

22658+
# LazyFrames must be collected before item indexing
22659+
if is_narwhals_lazyframe(unique_vals):
22660+
unique_vals = unique_vals.collect()
22661+
2265422662
# Convert to list of values
2265522663
seg_categories = unique_vals[segments_expr].to_list()
2265622664
elif tbl_type in IBIS_BACKENDS:

tests/test_segments.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,20 @@ def test_segments_with_multiple_seg_groups(tbl_type):
211211
)
212212
.interrogate()
213213
)
214+
214215
assert validation.n_passed(i=1, scalar=True) == 7
215216
assert validation.n_passed(i=2, scalar=True) == 3
216217
assert validation.n_passed(i=3, scalar=True) == 2
218+
219+
220+
def test_segments_str_lazyframe():
221+
df = pl.DataFrame({"x": [1.0, -1.0, 2.0], "region": ["US", "US", "EU"]})
222+
validation_lazy = Validate(data=df.lazy()).col_vals_gt("x", 0, segments="region").interrogate()
223+
validation_eager = Validate(data=df).col_vals_gt("x", 0, segments="region").interrogate()
224+
225+
# Both should produce the same number of expanded steps
226+
assert len(validation_lazy.validation_info) == len(validation_eager.validation_info)
227+
228+
# EU: 1 row, 1 passes; US: 2 rows, 1 passes
229+
assert validation_lazy.n_passed(i=1, scalar=True) == validation_eager.n_passed(i=1, scalar=True)
230+
assert validation_lazy.n_passed(i=2, scalar=True) == validation_eager.n_passed(i=2, scalar=True)

0 commit comments

Comments
 (0)