coalescing_iterator.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright (c) Meta Platforms, Inc. and affiliates.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #pragma once
  6. #include "db/multi_cf_iterator_impl.h"
  7. namespace ROCKSDB_NAMESPACE {
  8. class CoalescingIterator : public Iterator {
  9. public:
  10. CoalescingIterator(
  11. const ReadOptions& read_options, const Comparator* comparator,
  12. std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>&&
  13. cfh_iter_pairs)
  14. : impl_(read_options, comparator, std::move(cfh_iter_pairs),
  15. ResetFunc(this), PopulateFunc(this)) {}
  16. ~CoalescingIterator() override {}
  17. // No copy allowed
  18. CoalescingIterator(const CoalescingIterator&) = delete;
  19. CoalescingIterator& operator=(const CoalescingIterator&) = delete;
  20. bool Valid() const override { return impl_.Valid(); }
  21. void SeekToFirst() override { impl_.SeekToFirst(); }
  22. void SeekToLast() override { impl_.SeekToLast(); }
  23. void Seek(const Slice& target) override { impl_.Seek(target); }
  24. void SeekForPrev(const Slice& target) override { impl_.SeekForPrev(target); }
  25. void Next() override { impl_.Next(); }
  26. void Prev() override { impl_.Prev(); }
  27. Slice key() const override { return impl_.key(); }
  28. Status status() const override { return impl_.status(); }
  29. Slice value() const override {
  30. assert(Valid());
  31. return value_;
  32. }
  33. const WideColumns& columns() const override {
  34. assert(Valid());
  35. return wide_columns_;
  36. }
  37. void Reset() {
  38. value_.clear();
  39. wide_columns_.clear();
  40. }
  41. bool PrepareValue() override { return impl_.PrepareValue(); }
  42. private:
  43. class ResetFunc {
  44. public:
  45. explicit ResetFunc(CoalescingIterator* iter) : iter_(iter) {}
  46. void operator()() const {
  47. assert(iter_);
  48. iter_->Reset();
  49. }
  50. private:
  51. CoalescingIterator* iter_;
  52. };
  53. class PopulateFunc {
  54. public:
  55. explicit PopulateFunc(CoalescingIterator* iter) : iter_(iter) {}
  56. void operator()(const autovector<MultiCfIteratorInfo>& items) const {
  57. assert(iter_);
  58. iter_->Coalesce(items);
  59. }
  60. private:
  61. CoalescingIterator* iter_;
  62. };
  63. MultiCfIteratorImpl<ResetFunc, PopulateFunc> impl_;
  64. Slice value_;
  65. WideColumns wide_columns_;
  66. struct WideColumnWithOrder {
  67. const WideColumn* column;
  68. int order;
  69. };
  70. class WideColumnWithOrderComparator {
  71. public:
  72. explicit WideColumnWithOrderComparator() {}
  73. bool operator()(const WideColumnWithOrder& a,
  74. const WideColumnWithOrder& b) const {
  75. int c = a.column->name().compare(b.column->name());
  76. return c == 0 ? a.order - b.order > 0 : c > 0;
  77. }
  78. };
  79. using MinHeap =
  80. BinaryHeap<WideColumnWithOrder, WideColumnWithOrderComparator>;
  81. void Coalesce(const autovector<MultiCfIteratorInfo>& items);
  82. };
  83. } // namespace ROCKSDB_NAMESPACE