@@ -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