YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/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
36
  explicit PossibleArenaDeleter(bool arena_mode) noexcept : arena_mode_(arena_mode) {}
24
25
  template <class P>
26
36
  void operator()(P* p) {
27
36
    if (arena_mode_) {
28
31
      p->~P();
29
31
    } else {
30
5
      delete p;
31
5
    }
32
36
  }
33
 private:
34
  bool arena_mode_;
35
};
36
37
class FilteringIterator : public InternalIterator {
38
 public:
39
  explicit FilteringIterator(InternalIterator* iterator, bool arena_mode)
40
36
      : iterator_(iterator, PossibleArenaDeleter(arena_mode)) {}
41
42
 private:
43
3.92k
  bool Valid() const override {
44
3.92k
    return iterator_->Valid();
45
3.92k
  }
46
47
29
  void SeekToFirst() override {
48
29
    iterator_->SeekToFirst();
49
29
    ApplyFilter(/* backward = */ false);
50
29
  }
51
52
0
  void SeekToLast() override {
53
0
    iterator_->SeekToLast();
54
0
    ApplyFilter(/* backward = */ true);
55
0
  }
56
57
391
  void Seek(const Slice& target) override {
58
391
    iterator_->Seek(target);
59
391
    ApplyFilter(/* backward = */ false);
60
391
  }
61
62
3.46k
  void Next() override {
63
3.46k
    iterator_->Next();
64
3.46k
    ApplyFilter(/* backward = */ false);
65
3.46k
  }
66
67
0
  void Prev() override {
68
0
    iterator_->Prev();
69
0
    ApplyFilter(/* backward = */ true);
70
0
  }
71
72
3.85k
  Slice key() const override {
73
3.85k
    return iterator_->key();
74
3.85k
  }
75
76
15.3k
  Slice value() const override {
77
15.3k
    return iterator_->value();
78
15.3k
  }
79
80
4
  Status status() const override {
81
4
    return iterator_->status();
82
4
  }
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
3.88k
  void ApplyFilter(bool backward) {
101
4.14k
    while (iterator_->Valid()) {
102
4.10k
      if (Satisfied(iterator_->key())) {
103
3.85k
        break;
104
3.85k
      }
105
253
      if (!backward) {
106
253
        iterator_->Next();
107
253
      } else {
108
0
        iterator_->Prev();
109
0
      }
110
253
    }
111
3.88k
  }
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