attribute_group_iterator_impl.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. #include "rocksdb/attribute_groups.h"
  8. namespace ROCKSDB_NAMESPACE {
  9. class AttributeGroupIteratorImpl : public AttributeGroupIterator {
  10. public:
  11. AttributeGroupIteratorImpl(
  12. const ReadOptions& read_options, const Comparator* comparator,
  13. std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>&&
  14. cfh_iter_pairs)
  15. : impl_(read_options, comparator, std::move(cfh_iter_pairs),
  16. ResetFunc(this), PopulateFunc(this)) {}
  17. ~AttributeGroupIteratorImpl() override {}
  18. // No copy allowed
  19. AttributeGroupIteratorImpl(const AttributeGroupIteratorImpl&) = delete;
  20. AttributeGroupIteratorImpl& operator=(const AttributeGroupIteratorImpl&) =
  21. delete;
  22. bool Valid() const override { return impl_.Valid(); }
  23. void SeekToFirst() override { impl_.SeekToFirst(); }
  24. void SeekToLast() override { impl_.SeekToLast(); }
  25. void Seek(const Slice& target) override { impl_.Seek(target); }
  26. void SeekForPrev(const Slice& target) override { impl_.SeekForPrev(target); }
  27. void Next() override { impl_.Next(); }
  28. void Prev() override { impl_.Prev(); }
  29. Slice key() const override { return impl_.key(); }
  30. Status status() const override { return impl_.status(); }
  31. const IteratorAttributeGroups& attribute_groups() const override {
  32. assert(Valid());
  33. return attribute_groups_;
  34. }
  35. void Reset() { attribute_groups_.clear(); }
  36. bool PrepareValue() override { return impl_.PrepareValue(); }
  37. private:
  38. class ResetFunc {
  39. public:
  40. explicit ResetFunc(AttributeGroupIteratorImpl* iter) : iter_(iter) {}
  41. void operator()() const {
  42. assert(iter_);
  43. iter_->Reset();
  44. }
  45. private:
  46. AttributeGroupIteratorImpl* iter_;
  47. };
  48. class PopulateFunc {
  49. public:
  50. explicit PopulateFunc(AttributeGroupIteratorImpl* iter) : iter_(iter) {}
  51. void operator()(const autovector<MultiCfIteratorInfo>& items) const {
  52. assert(iter_);
  53. iter_->AddToAttributeGroups(items);
  54. }
  55. private:
  56. AttributeGroupIteratorImpl* iter_;
  57. };
  58. MultiCfIteratorImpl<ResetFunc, PopulateFunc> impl_;
  59. IteratorAttributeGroups attribute_groups_;
  60. void AddToAttributeGroups(const autovector<MultiCfIteratorInfo>& items);
  61. };
  62. class EmptyAttributeGroupIterator : public AttributeGroupIterator {
  63. public:
  64. explicit EmptyAttributeGroupIterator(const Status& s) : status_(s) {}
  65. bool Valid() const override { return false; }
  66. void Seek(const Slice& /*target*/) override {}
  67. void SeekForPrev(const Slice& /*target*/) override {}
  68. void SeekToFirst() override {}
  69. void SeekToLast() override {}
  70. void Next() override { assert(false); }
  71. void Prev() override { assert(false); }
  72. Slice key() const override {
  73. assert(false);
  74. return Slice();
  75. }
  76. Status status() const override { return status_; }
  77. const IteratorAttributeGroups& attribute_groups() const override {
  78. return kNoIteratorAttributeGroups;
  79. }
  80. private:
  81. Status status_;
  82. };
  83. inline std::unique_ptr<AttributeGroupIterator> NewAttributeGroupErrorIterator(
  84. const Status& status) {
  85. return std::make_unique<EmptyAttributeGroupIterator>(status);
  86. }
  87. } // namespace ROCKSDB_NAMESPACE