| 305 | } |
| 306 | |
| 307 | Result<FragmentIterator> FileSystemDataset::GetFragmentsImpl( |
| 308 | compute::Expression predicate) { |
| 309 | if (predicate == compute::literal(true)) { |
| 310 | // trivial predicate; skip subtree pruning |
| 311 | return MakeVectorIterator(FragmentVector(fragments_.begin(), fragments_.end())); |
| 312 | } |
| 313 | |
| 314 | std::vector<int> fragment_indices; |
| 315 | |
| 316 | std::vector<compute::Expression> predicates{predicate}; |
| 317 | RETURN_NOT_OK(subtrees_->forest.Visit( |
| 318 | [&](Forest::Ref ref) -> Result<bool> { |
| 319 | if (auto fragment_index = |
| 320 | std::get_if<int>(&subtrees_->fragments_and_subtrees[ref.i])) { |
| 321 | fragment_indices.push_back(*fragment_index); |
| 322 | return false; |
| 323 | } |
| 324 | |
| 325 | const auto& subtree_expr = |
| 326 | std::get<compute::Expression>(subtrees_->fragments_and_subtrees[ref.i]); |
| 327 | ARROW_ASSIGN_OR_RAISE(auto simplified, |
| 328 | SimplifyWithGuarantee(predicates.back(), subtree_expr)); |
| 329 | |
| 330 | if (!simplified.IsSatisfiable()) { |
| 331 | return false; |
| 332 | } |
| 333 | |
| 334 | predicates.push_back(std::move(simplified)); |
| 335 | return true; |
| 336 | }, |
| 337 | [&](Forest::Ref ref) { predicates.pop_back(); })); |
| 338 | |
| 339 | std::sort(fragment_indices.begin(), fragment_indices.end()); |
| 340 | |
| 341 | FragmentVector fragments(fragment_indices.size()); |
| 342 | std::transform(fragment_indices.begin(), fragment_indices.end(), fragments.begin(), |
| 343 | [this](int i) { return fragments_[i]; }); |
| 344 | |
| 345 | return MakeVectorIterator(std::move(fragments)); |
| 346 | } |
| 347 | |
| 348 | Status FileWriter::Write(RecordBatchReader* batches) { |
| 349 | while (true) { |
nothing calls this directly
no test coverage detected