YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/rocksdb/table/filtering_iterator.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#ifndef YB_ROCKSDB_TABLE_FILTERING_ITERATOR_H
15
#define YB_ROCKSDB_TABLE_FILTERING_ITERATOR_H
16
17
#include "yb/rocksdb/table/internal_iterator.h"
18
19
namespace rocksdb {
20
21
class PossibleArenaDeleter {
22
 public:
23
0
  explicit PossibleArenaDeleter(bool arena_mode) noexcept : arena_mode_(arena_mode) {}
24
25
  template <class P>
26
0
  void operator()(P* p) {
27
0
    if (arena_mode_) {
28
0
      p->~P();
29
0
    } else {
30
0
      delete p;
31
0
    }
32
0
  }
33
 private:
34
  bool arena_mode_;
35
};
36
37
class FilteringIterator : public InternalIterator {
38
 public:
39
  explicit FilteringIterator(InternalIterator* iterator, bool arena_mode)
40
0
      : iterator_(iterator, PossibleArenaDeleter(arena_mode)) {}
41
42
 private:
43
0
  bool Valid() const override {
44
0
    return iterator_->Valid();
45
0
  }
46
47
0
  void SeekToFirst() override {
48
0
    iterator_->SeekToFirst();
49
0
    ApplyFilter(/* backward = */ false);
50
0
  }
51
52
0
  void SeekToLast() override {
53
0
    iterator_->SeekToLast();
54
0
    ApplyFilter(/* backward = */ true);
55
0
  }
56
57
0
  void Seek(const Slice& target) override {
58
0
    iterator_->Seek(target);
59
0
    ApplyFilter(/* backward = */ false);
60
0
  }
61
62
0
  void Next() override {
63
0
    iterator_->Next();
64
0
    ApplyFilter(/* backward = */ false);
65
0
  }
66
67
0
  void Prev() override {
68
0
    iterator_->Prev();
69
0
    ApplyFilter(/* backward = */ true);
70
0
  }
71
72
0
  Slice key() const override {
73
0
    return iterator_->key();
74
0
  }
75
76
0
  Slice value() const override {
77
0
    return iterator_->value();
78
0
  }
79
80
0
  Status status() const override {
81
0
    return iterator_->status();
82
0
  }
83
84
0
  Status PinData() override {
85
0
    return iterator_->PinData();
86
0
  }
87
88
0
  Status ReleasePinnedData() override {
89
0
    return iterator_->ReleasePinnedData();
90
0
  }
91
92
0
  bool IsKeyPinned() const override {
93
0
    return iterator_->IsKeyPinned();
94
0
  }
95
96
0
  Status GetProperty(std::string prop_name, std::string* prop) override {
97
0
    return iterator_->GetProperty(std::move(prop_name), prop);
98
0
  }
99
100
0
  void ApplyFilter(bool backward) {
101
0
    while (iterator_->Valid()) {
102
0
      if (Satisfied(iterator_->key())) {
103
0
        break;
104
0
      }
105
0
      if (!backward) {
106
0
        iterator_->Next();
107
0
      } else {
108
0
        iterator_->Prev();
109
0
      }
110
0
    }
111
0
  }
112
113
  virtual bool Satisfied(Slice key) = 0;
114
115
  const std::unique_ptr<InternalIterator, PossibleArenaDeleter> iterator_;
116
};
117
118
} // namespace rocksdb
119
120
#endif // YB_ROCKSDB_TABLE_FILTERING_ITERATOR_H