| 131 | } |
| 132 | |
| 133 | std::pair<std::shared_ptr<::paimon::Predicate>, core::TypedExprPtr> planFilter( |
| 134 | const core::TypedExprPtr& expression, |
| 135 | const RowTypePtr& rowType, |
| 136 | core::ExpressionEvaluator* evaluator) { |
| 137 | std::vector<core::TypedExprPtr> conjuncts; |
| 138 | exec::flattenTopLevelConjuncts(expression, conjuncts); |
| 139 | |
| 140 | std::vector<std::shared_ptr<::paimon::Predicate>> predicates; |
| 141 | std::vector<core::TypedExprPtr> remainingConjuncts; |
| 142 | for (const auto& conjunct : conjuncts) { |
| 143 | auto result = |
| 144 | PaimonFilterTranslator::translate(conjunct, rowType, evaluator); |
| 145 | if (result.ok()) { |
| 146 | predicates.push_back(std::move(result.value)); |
| 147 | } else { |
| 148 | VLOG(1) << "PaimonDataSource: Keeping filter conjunct " |
| 149 | << conjunct->toString() |
| 150 | << " as remaining filter: " << result.reason; |
| 151 | remainingConjuncts.push_back(conjunct); |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | std::shared_ptr<::paimon::Predicate> predicate; |
| 156 | if (predicates.size() == 1) { |
| 157 | predicate = std::move(predicates.front()); |
| 158 | } else if (!predicates.empty()) { |
| 159 | auto result = ::paimon::PredicateBuilder::And(predicates); |
| 160 | BOLT_CHECK( |
| 161 | result.ok(), "PredicateBuilder::And failed for translated conjuncts"); |
| 162 | predicate = std::move(result).value(); |
| 163 | } |
| 164 | |
| 165 | return { |
| 166 | std::move(predicate), combineConjuncts(std::move(remainingConjuncts))}; |
| 167 | } |
| 168 | |
| 169 | } // namespace |
| 170 |
no test coverage detected