Skip to content

Commit fea8700

Browse files
committed
chore: better expression error messages on failure
For example, executing a scan with a filter like `root() > pa.scalar(3.3, type=pa.float16())`: ``` Vortex error: While evaluating ZoneMap pruning filter ((($.nan_count = 0u64) and (0u64 = 0u64)) and ($.max <= 3.3007813f16)): Cannot compare different DTypes f64? and f16? ``` Signed-off-by: Daniel King <[email protected]>
1 parent 60492c4 commit fea8700

File tree

6 files changed

+64
-15
lines changed

6 files changed

+64
-15
lines changed

vortex-error/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ impl Display for VortexError {
181181
write!(f, "{msg}\nBacktrace:\n{backtrace}")
182182
}
183183
VortexError::Context(msg, inner) => {
184-
write!(f, "{msg}: {inner}")
184+
write!(f, "{msg}:\n {inner}")
185185
}
186186
VortexError::Shared(inner) => Display::fmt(inner, f),
187187
VortexError::ArrowError(err, backtrace) => {

vortex-layout/src/layouts/chunked/reader.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,13 @@ impl LayoutReader for ChunkedReader {
199199

200200
for (chunk_idx, chunk_range, mask_range) in self.ranges(row_range) {
201201
let chunk_reader = self.chunk_reader(chunk_idx)?;
202-
let chunk_eval =
203-
chunk_reader.pruning_evaluation(&chunk_range, expr, mask.slice(mask_range))?;
202+
let chunk_eval = chunk_reader
203+
.pruning_evaluation(&chunk_range, expr, mask.slice(mask_range))
204+
.map_err(|err| {
205+
err.with_context(format!(
206+
"While evaluating pruning filter on chunk {chunk_idx}"
207+
))
208+
})?;
204209

205210
chunk_evals.push(chunk_eval);
206211
}
@@ -236,8 +241,11 @@ impl LayoutReader for ChunkedReader {
236241

237242
for (chunk_idx, chunk_range, mask_range) in self.ranges(row_range) {
238243
let chunk_reader = self.chunk_reader(chunk_idx)?;
239-
let chunk_eval =
240-
chunk_reader.filter_evaluation(&chunk_range, expr, mask.slice(mask_range))?;
244+
let chunk_eval = chunk_reader
245+
.filter_evaluation(&chunk_range, expr, mask.slice(mask_range))
246+
.map_err(|err| {
247+
err.with_context(format!("While evaluating filter on chunk {chunk_idx}"))
248+
})?;
241249
chunk_evals.push(chunk_eval);
242250
}
243251

@@ -269,8 +277,11 @@ impl LayoutReader for ChunkedReader {
269277

270278
for (chunk_idx, chunk_range, mask_range) in self.ranges(row_range) {
271279
let chunk_reader = self.chunk_reader(chunk_idx)?;
272-
let chunk_eval =
273-
chunk_reader.projection_evaluation(&chunk_range, expr, mask.slice(mask_range))?;
280+
let chunk_eval = chunk_reader
281+
.projection_evaluation(&chunk_range, expr, mask.slice(mask_range))
282+
.map_err(|err| {
283+
err.with_context(format!("While evaluating projection on chunk {chunk_idx}"))
284+
})?;
274285
chunk_evals.push(chunk_eval);
275286
}
276287

vortex-layout/src/layouts/dict/reader.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,10 @@ impl LayoutReader for DictReader {
190190
mask: MaskFuture,
191191
) -> VortexResult<BoxFuture<'static, VortexResult<ArrayRef>>> {
192192
let values_eval = self.values_eval(root());
193-
let codes_eval = self.codes.projection_evaluation(row_range, &root(), mask)?;
193+
let codes_eval = self
194+
.codes
195+
.projection_evaluation(row_range, &root(), mask)
196+
.map_err(|err| err.with_context("While evaluating projection on codes"))?;
194197
let expr = expr.clone();
195198

196199
Ok(async move {

vortex-layout/src/layouts/flat/reader.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,16 @@ impl LayoutReader for FlatReader {
137137
// TODO(joe): fixme casting null to false is *VERY* unsound, if the expression in the filter
138138
// can inspect nulls (e.g. `is_null`).
139139
// you will need to call the array evaluation instead of the mask evaluation.
140-
let array_mask = expr.evaluate(&array)?.try_to_mask_fill_null_false()?;
140+
let array_mask = expr
141+
.evaluate(&array)
142+
.map_err(|err| err.with_context(format!("While evaluating filter {}", expr)))?
143+
.try_to_mask_fill_null_false()?;
141144
mask.intersect_by_rank(&array_mask)
142145
} else {
143146
// Evaluate all rows, avoiding the more expensive rank intersection.
144-
array = expr.evaluate(&array)?;
147+
array = expr
148+
.evaluate(&array)
149+
.map_err(|err| err.with_context(format!("While evaluating filter {}", expr)))?;
145150
let array_mask = array.try_to_mask_fill_null_false()?;
146151
mask.bitand(&array_mask)
147152
};
@@ -190,7 +195,9 @@ impl LayoutReader for FlatReader {
190195

191196
// Evaluate the projection expression.
192197
if !is_root(&expr) {
193-
array = expr.evaluate(&array)?;
198+
array = expr.evaluate(&array).map_err(|err| {
199+
err.with_context(format!("While evaluating projection {}", expr))
200+
})?;
194201
}
195202

196203
Ok(array)

vortex-layout/src/layouts/struct_/reader.rs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,10 @@ impl LayoutReader for StructReader {
238238
match &self.partition_expr(expr.clone()) {
239239
Partitioned::Single(name, partition) => self
240240
.field_reader(name)?
241-
.pruning_evaluation(row_range, partition, mask),
241+
.pruning_evaluation(row_range, partition, mask)
242+
.map_err(|err| {
243+
err.with_context(format!("While evaluating pruning filter partition {name}"))
244+
}),
242245
Partitioned::Multi(_) => {
243246
// TODO(ngates): if all partitions are boolean, we can use a pruning evaluation. Otherwise
244247
// there's not much we can do? Maybe... it's complicated...
@@ -257,16 +260,27 @@ impl LayoutReader for StructReader {
257260
match &self.partition_expr(expr.clone()) {
258261
Partitioned::Single(name, partition) => self
259262
.field_reader(name)?
260-
.filter_evaluation(row_range, partition, mask),
263+
.filter_evaluation(row_range, partition, mask)
264+
.map_err(|err| {
265+
err.with_context(format!("While evaluating filter partition {name}"))
266+
}),
261267
Partitioned::Multi(partitioned) => partitioned.clone().into_mask_future(
262268
mask,
263269
|name, expr, mask| {
264270
self.field_reader(name)?
265271
.filter_evaluation(row_range, expr, mask)
272+
.map_err(|err| {
273+
err.with_context(format!("While evaluating filter partition {name}"))
274+
})
266275
},
267276
|name, expr, mask| {
268277
self.field_reader(name)?
269278
.projection_evaluation(row_range, expr, mask)
279+
.map_err(|err| {
280+
err.with_context(format!(
281+
"While evaluating projection partition {name}"
282+
))
283+
})
270284
},
271285
),
272286
}
@@ -287,7 +301,10 @@ impl LayoutReader for StructReader {
287301
let (projected, is_pack_merge) = match &self.partition_expr(expr.clone()) {
288302
Partitioned::Single(name, partition) => (
289303
self.field_reader(name)?
290-
.projection_evaluation(row_range, partition, mask_fut)?,
304+
.projection_evaluation(row_range, partition, mask_fut)
305+
.map_err(|err| {
306+
err.with_context(format!("While evaluating projection partition {name}"))
307+
})?,
291308
partition.is::<Pack>() || partition.is::<Merge>(),
292309
),
293310

@@ -297,6 +314,11 @@ impl LayoutReader for StructReader {
297314
.into_array_future(mask_fut, |name, expr, mask| {
298315
self.field_reader(name)?
299316
.projection_evaluation(row_range, expr, mask)
317+
.map_err(|err| {
318+
err.with_context(format!(
319+
"While evaluating projection partition {name}"
320+
))
321+
})
300322
})?,
301323
partitioned.root.is::<Pack>() || partitioned.root.is::<Merge>(),
302324
),

vortex-layout/src/layouts/zoned/zone_map.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,13 @@ impl ZoneMap {
139139
/// All zones where the predicate evaluates to `true` can be skipped entirely.
140140
pub fn prune(&self, predicate: &Expression) -> VortexResult<Mask> {
141141
predicate
142-
.evaluate(&self.array.to_array())?
142+
.evaluate(&self.array.to_array())
143+
.map_err(|err| {
144+
err.with_context(format!(
145+
"While evaluating ZoneMap pruning filter {}",
146+
predicate
147+
))
148+
})?
143149
.try_to_mask_fill_null_false()
144150
}
145151
}

0 commit comments

Comments
 (0)