Skip to content

Commit 28d9397

Browse files
author
xiao.dong
committed
refactor kind check
1 parent 7d40792 commit 28d9397

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

src/iceberg/expression/inclusive_metrics_evaluator.cc

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class InclusiveMetricsVisitor : public BoundVisitor<bool> {
8686
if (ContainsNullsOnly(id)) {
8787
return kRowCannotMatch;
8888
}
89-
if (expr->reference()->kind() != BoundTerm::Kind::kReference) {
89+
if (internal::checked_pointer_cast<BoundReference>(expr) == nullptr) {
9090
return kRowsMightMatch;
9191
}
9292
auto it = data_file_.nan_value_counts.find(id);
@@ -97,7 +97,7 @@ class InclusiveMetricsVisitor : public BoundVisitor<bool> {
9797
}
9898

9999
Result<bool> NotNaN(const std::shared_ptr<Bound>& expr) override {
100-
if (expr->reference()->kind() != BoundTerm::Kind::kReference) {
100+
if (internal::checked_pointer_cast<BoundReference>(expr) == nullptr) {
101101
// identity transforms are already removed by this time
102102
return kRowsMightMatch;
103103
}
@@ -291,10 +291,9 @@ class InclusiveMetricsVisitor : public BoundVisitor<bool> {
291291

292292
Result<bool> StartsWith(const std::shared_ptr<Bound>& expr,
293293
const Literal& lit) override {
294-
if (expr->reference()->kind() == BoundTerm::Kind::kTransform &&
295-
internal::checked_cast<const BoundTransform&>(*expr)
296-
.transform()
297-
->transform_type() != TransformType::kIdentity) {
294+
auto transform = internal::checked_pointer_cast<BoundTransform>(expr);
295+
if (transform != nullptr &&
296+
transform->transform()->transform_type() != TransformType::kIdentity) {
298297
// truncate must be rewritten in binding. the result is either always or never
299298
// compatible
300299
return kRowsMightMatch;
@@ -411,33 +410,29 @@ class InclusiveMetricsVisitor : public BoundVisitor<bool> {
411410
}
412411

413412
Result<std::optional<Literal>> LowerBound(const std::shared_ptr<Bound>& expr) {
414-
if (expr->reference()->kind() == BoundTerm::Kind::kReference) {
415-
return ParseLowerBound(
416-
internal::checked_cast<const BoundReference&>(*expr->reference()));
417-
} else if (expr->reference()->kind() == BoundTerm::Kind::kTransform) {
418-
return TransformLowerBound(
419-
internal::checked_cast<BoundTransform&>(*expr->reference()));
420-
} else if (expr->reference()->kind() == BoundTerm::Kind::kExtract) {
421-
// TODO(xiao.dong) handle extract lower and upper bounds
422-
return NotImplemented("Extract lower bound not implemented.");
413+
if (auto reference = internal::checked_pointer_cast<BoundReference>(expr);
414+
reference != nullptr) {
415+
return ParseLowerBound(*reference);
416+
} else if (auto transform = internal::checked_pointer_cast<BoundTransform>(expr);
417+
transform != nullptr) {
418+
return TransformLowerBound(*transform);
423419
} else {
424420
return std::nullopt;
425421
}
422+
// TODO(xiao.dong) handle extract lower and upper bounds
426423
}
427424

428425
Result<std::optional<Literal>> UpperBound(const std::shared_ptr<Bound>& expr) {
429-
if (expr->reference()->kind() == BoundTerm::Kind::kReference) {
430-
return ParseUpperBound(
431-
internal::checked_cast<const BoundReference&>(*expr->reference()));
432-
} else if (expr->reference()->kind() == BoundTerm::Kind::kTransform) {
433-
return TransformUpperBound(
434-
internal::checked_cast<BoundTransform&>(*expr->reference()));
435-
} else if (expr->reference()->kind() == BoundTerm::Kind::kExtract) {
436-
// TODO(xiao.dong) handle extract lower and upper bounds
437-
return NotImplemented("Extract upper bound not implemented.");
426+
if (auto reference = internal::checked_pointer_cast<BoundReference>(expr);
427+
reference != nullptr) {
428+
return ParseUpperBound(*reference);
429+
} else if (auto transform = internal::checked_pointer_cast<BoundTransform>(expr);
430+
transform != nullptr) {
431+
return TransformUpperBound(*transform);
438432
} else {
439433
return std::nullopt;
440434
}
435+
// TODO(xiao.dong) handle extract lower and upper bounds
441436
}
442437

443438
Result<std::optional<Literal>> ParseLowerBound(const BoundReference& ref) {
@@ -504,12 +499,12 @@ class InclusiveMetricsVisitor : public BoundVisitor<bool> {
504499

505500
/** Returns true if the expression term produces a non-null value for non-null input. */
506501
bool IsNonNullPreserving(const std::shared_ptr<Bound>& expr) {
507-
if (expr->reference()->kind() == BoundTerm::Kind::kReference) {
502+
if (auto reference = internal::checked_pointer_cast<BoundReference>(expr);
503+
reference != nullptr) {
508504
return true;
509-
} else if (expr->reference()->kind() == BoundTerm::Kind::kTransform) {
510-
return internal::checked_cast<const BoundTransform&>(*expr->reference())
511-
.transform()
512-
->PreservesOrder();
505+
} else if (auto transform = internal::checked_pointer_cast<BoundTransform>(expr);
506+
transform != nullptr) {
507+
return transform->transform()->PreservesOrder();
513508
}
514509
// a non-null variant does not necessarily contain a specific field
515510
// and unknown bound terms are not non-null preserving

0 commit comments

Comments
 (0)