/root/doris/be/src/olap/iterators.h
Line | Count | Source |
1 | | // Licensed to the Apache Software Foundation (ASF) under one |
2 | | // or more contributor license agreements. See the NOTICE file |
3 | | // distributed with this work for additional information |
4 | | // regarding copyright ownership. The ASF licenses this file |
5 | | // to you under the Apache License, Version 2.0 (the |
6 | | // "License"); you may not use this file except in compliance |
7 | | // with the License. You may obtain a copy of the License at |
8 | | // |
9 | | // http://www.apache.org/licenses/LICENSE-2.0 |
10 | | // |
11 | | // Unless required by applicable law or agreed to in writing, |
12 | | // software distributed under the License is distributed on an |
13 | | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
14 | | // KIND, either express or implied. See the License for the |
15 | | // specific language governing permissions and limitations |
16 | | // under the License. |
17 | | |
18 | | #pragma once |
19 | | |
20 | | #include <cstddef> |
21 | | #include <memory> |
22 | | |
23 | | #include "common/status.h" |
24 | | #include "io/io_common.h" |
25 | | #include "olap/block_column_predicate.h" |
26 | | #include "olap/column_predicate.h" |
27 | | #include "olap/olap_common.h" |
28 | | #include "olap/rowset/segment_v2/ann_index/ann_topn_runtime.h" |
29 | | #include "olap/rowset/segment_v2/row_ranges.h" |
30 | | #include "olap/tablet_schema.h" |
31 | | #include "runtime/runtime_state.h" |
32 | | #include "vec/core/block.h" |
33 | | #include "vec/exprs/score_runtime.h" |
34 | | #include "vec/exprs/vexpr.h" |
35 | | |
36 | | namespace doris { |
37 | | |
38 | | class RowCursor; |
39 | | class Schema; |
40 | | class ColumnPredicate; |
41 | | |
42 | | namespace vectorized { |
43 | | struct IteratorRowRef; |
44 | | }; |
45 | | |
46 | | namespace segment_v2 { |
47 | | struct SubstreamIterator; |
48 | | } |
49 | | |
50 | | class StorageReadOptions { |
51 | | public: |
52 | | struct KeyRange { |
53 | | KeyRange() |
54 | | : lower_key(nullptr), |
55 | | include_lower(false), |
56 | | upper_key(nullptr), |
57 | 0 | include_upper(false) {} |
58 | | |
59 | | KeyRange(const RowCursor* lower_key_, bool include_lower_, const RowCursor* upper_key_, |
60 | | bool include_upper_) |
61 | 0 | : lower_key(lower_key_), |
62 | 0 | include_lower(include_lower_), |
63 | 0 | upper_key(upper_key_), |
64 | 0 | include_upper(include_upper_) {} |
65 | | |
66 | | // the lower bound of the range, nullptr if not existed |
67 | | const RowCursor* lower_key = nullptr; |
68 | | // whether `lower_key` is included in the range |
69 | | bool include_lower; |
70 | | // the upper bound of the range, nullptr if not existed |
71 | | const RowCursor* upper_key = nullptr; |
72 | | // whether `upper_key` is included in the range |
73 | | bool include_upper; |
74 | | }; |
75 | | |
76 | | // reader's key ranges, empty if not existed. |
77 | | // used by short key index to filter row blocks |
78 | | std::vector<KeyRange> key_ranges; |
79 | | |
80 | | // For unique-key merge-on-write, the effect is similar to delete_conditions |
81 | | // that filters out rows that are deleted in realtime. |
82 | | // For a particular row, if delete_bitmap.contains(rowid) means that row is |
83 | | // marked deleted and invisible to user anymore. |
84 | | // segment_id -> roaring::Roaring* |
85 | | std::unordered_map<uint32_t, std::shared_ptr<roaring::Roaring>> delete_bitmap; |
86 | | |
87 | | std::shared_ptr<AndBlockColumnPredicate> delete_condition_predicates = |
88 | | AndBlockColumnPredicate::create_shared(); |
89 | | // reader's column predicate, nullptr if not existed |
90 | | // used to fiter rows in row block |
91 | | std::vector<ColumnPredicate*> column_predicates; |
92 | | std::unordered_map<int32_t, std::shared_ptr<AndBlockColumnPredicate>> col_id_to_predicates; |
93 | | std::unordered_map<int32_t, std::vector<const ColumnPredicate*>> del_predicates_for_zone_map; |
94 | | TPushAggOp::type push_down_agg_type_opt = TPushAggOp::NONE; |
95 | | |
96 | | // REQUIRED (null is not allowed) |
97 | | OlapReaderStatistics* stats = nullptr; |
98 | | bool use_page_cache = false; |
99 | | uint32_t block_row_max = 4096 - 32; // see https://github.com/apache/doris/pull/11816 |
100 | | |
101 | | TabletSchemaSPtr tablet_schema = nullptr; |
102 | | bool enable_unique_key_merge_on_write = false; |
103 | | bool record_rowids = false; |
104 | | std::vector<int> topn_filter_source_node_ids; |
105 | | int topn_filter_target_node_id = -1; |
106 | | // used for special optimization for query : ORDER BY key DESC LIMIT n |
107 | | bool read_orderby_key_reverse = false; |
108 | | // columns for orderby keys |
109 | | std::vector<uint32_t>* read_orderby_key_columns = nullptr; |
110 | | io::IOContext io_ctx; |
111 | | vectorized::VExpr* remaining_vconjunct_root = nullptr; |
112 | | std::vector<vectorized::VExprSPtr> remaining_conjunct_roots; |
113 | | vectorized::VExprContextSPtrs common_expr_ctxs_push_down; |
114 | | const std::set<int32_t>* output_columns = nullptr; |
115 | | // runtime state |
116 | | RuntimeState* runtime_state = nullptr; |
117 | | RowsetId rowset_id; |
118 | | Version version; |
119 | | int64_t tablet_id = 0; |
120 | | // slots that cast may be eliminated in storage layer |
121 | | std::map<std::string, vectorized::DataTypePtr> target_cast_type_for_variants; |
122 | | RowRanges row_ranges; |
123 | | size_t topn_limit = 0; |
124 | | |
125 | | std::map<ColumnId, vectorized::VExprContextSPtr> virtual_column_exprs; |
126 | | std::shared_ptr<segment_v2::AnnTopNRuntime> ann_topn_runtime; |
127 | | std::map<ColumnId, size_t> vir_cid_to_idx_in_block; |
128 | | std::map<size_t, vectorized::DataTypePtr> vir_col_idx_to_type; |
129 | | |
130 | | std::shared_ptr<vectorized::ScoreRuntime> score_runtime; |
131 | | CollectionStatisticsPtr collection_statistics; |
132 | | |
133 | | // Cache for sparse column data to avoid redundant reads |
134 | | // col_unique_id -> cached column_ptr |
135 | | std::unordered_map<int32_t, vectorized::ColumnPtr> sparse_column_cache; |
136 | | }; |
137 | | |
138 | | struct CompactionSampleInfo { |
139 | | int64_t bytes = 0; |
140 | | int64_t rows = 0; |
141 | | int64_t group_data_size; |
142 | | }; |
143 | | |
144 | | class RowwiseIterator; |
145 | | using RowwiseIteratorUPtr = std::unique_ptr<RowwiseIterator>; |
146 | | class RowwiseIterator { |
147 | | public: |
148 | 11.7k | RowwiseIterator() = default; |
149 | 11.7k | virtual ~RowwiseIterator() = default; |
150 | | |
151 | | // Initialize this iterator and make it ready to read with |
152 | | // input options. |
153 | | // Input options may contain scan range in which this scan. |
154 | | // Return Status::OK() if init successfully, |
155 | | // Return other error otherwise |
156 | 0 | virtual Status init(const StorageReadOptions& opts) { |
157 | 0 | return Status::NotSupported("to be implemented"); |
158 | 0 | } |
159 | | |
160 | 0 | virtual Status init(const StorageReadOptions& opts, CompactionSampleInfo* sample_info) { |
161 | 0 | return Status::NotSupported("to be implemented"); |
162 | 0 | } |
163 | | |
164 | | // If there is any valid data, this function will load data |
165 | | // into input batch with Status::OK() returned |
166 | | // If there is no data to read, will return Status::EndOfFile. |
167 | | // If other error happens, other error code will be returned. |
168 | 0 | virtual Status next_batch(vectorized::Block* block) { |
169 | 0 | return Status::NotSupported("to be implemented"); |
170 | 0 | } |
171 | | |
172 | 0 | virtual Status next_block_view(vectorized::BlockView* block_view) { |
173 | 0 | return Status::NotSupported("to be implemented"); |
174 | 0 | } |
175 | | |
176 | 0 | virtual Status next_row(vectorized::IteratorRowRef* ref) { |
177 | 0 | return Status::NotSupported("to be implemented"); |
178 | 0 | } |
179 | 0 | virtual Status unique_key_next_row(vectorized::IteratorRowRef* ref) { |
180 | 0 | return Status::NotSupported("to be implemented"); |
181 | 0 | } |
182 | | |
183 | 0 | virtual bool support_return_data_by_ref() { return false; } |
184 | | |
185 | 0 | virtual Status current_block_row_locations(std::vector<RowLocation>* block_row_locations) { |
186 | 0 | return Status::NotSupported("to be implemented"); |
187 | 0 | } |
188 | | |
189 | | // return schema for this Iterator |
190 | | virtual const Schema& schema() const = 0; |
191 | | |
192 | | // Return the data id such as segment id, used for keep the insert order when do |
193 | | // merge sort in priority queue |
194 | 26.2k | virtual uint64_t data_id() const { return 0; } |
195 | | |
196 | 0 | virtual void update_profile(RuntimeProfile* profile) {} |
197 | | // return rows merged count by iterator |
198 | 0 | virtual uint64_t merged_rows() const { return 0; } |
199 | | |
200 | | // return if it's an empty iterator |
201 | 5.58k | virtual bool empty() const { return false; } |
202 | | }; |
203 | | |
204 | | } // namespace doris |