This is an automated email from the ASF dual-hosted git repository. dataroaring pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 371c7be235 [feature-wip](unique-key-merge-on-write) add segment lookup interface implementation, DSIP-018 (#10922) 371c7be235 is described below commit 371c7be235e693d6c33aab041720b55e29b3a040 Author: Xin Liao <liaoxin...@126.com> AuthorDate: Tue Jul 19 21:14:32 2022 +0800 [feature-wip](unique-key-merge-on-write) add segment lookup interface implementation, DSIP-018 (#10922) --- be/src/olap/rowset/segment_v2/segment.cpp | 39 +++++++++++++++++++++++-------- be/src/olap/rowset/segment_v2/segment.h | 3 +++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index f4e96833d3..6810b19c99 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -151,15 +151,21 @@ Status Segment::_load_index() { opts.stats = &tmp_stats; opts.type = INDEX_PAGE; - Slice body; - PageFooterPB footer; - RETURN_IF_ERROR(PageIO::read_and_decompress_page(opts, &_sk_index_handle, &body, &footer)); - DCHECK_EQ(footer.type(), SHORT_KEY_PAGE); - DCHECK(footer.has_short_key_page_footer()); - - _mem_tracker->consume(body.get_size()); - _sk_index_decoder.reset(new ShortKeyIndexDecoder); - return _sk_index_decoder->parse(body, footer.short_key_page_footer()); + if (_tablet_schema.keys_type() == UNIQUE_KEYS && _footer.has_primary_key_index_meta()) { + _pk_index_reader.reset(new PrimaryKeyIndexReader()); + return _pk_index_reader->parse(_file_reader, _footer.primary_key_index_meta()); + } else { + Slice body; + PageFooterPB footer; + RETURN_IF_ERROR( + PageIO::read_and_decompress_page(opts, &_sk_index_handle, &body, &footer)); + DCHECK_EQ(footer.type(), SHORT_KEY_PAGE); + DCHECK(footer.has_short_key_page_footer()); + + _mem_tracker->consume(body.get_size()); + _sk_index_decoder.reset(new ShortKeyIndexDecoder); + return _sk_index_decoder->parse(body, footer.short_key_page_footer()); + } }); } @@ -224,7 +230,20 @@ Status Segment::new_bitmap_index_iterator(const TabletColumn& tablet_column, } Status Segment::lookup_row_key(const Slice& key, RowLocation* row_location) { - //TODO(liaoxin01): implement it after index related code merged. + RETURN_IF_ERROR(_load_index()); + DCHECK(_pk_index_reader != nullptr); + if (!_pk_index_reader->check_present(key)) { + return Status::NotFound("Can't find key in the segment"); + } + bool exact_match = false; + std::unique_ptr<segment_v2::IndexedColumnIterator> index_iterator; + RETURN_IF_ERROR(_pk_index_reader->new_iterator(&index_iterator)); + RETURN_IF_ERROR(index_iterator->seek_at_or_after(&key, &exact_match)); + if (!exact_match) { + return Status::NotFound("Can't find key in the segment"); + } + row_location->row_id = index_iterator->get_current_ordinal(); + row_location->segment_id = _segment_id; return Status::OK(); } diff --git a/be/src/olap/rowset/segment_v2/segment.h b/be/src/olap/rowset/segment_v2/segment.h index d1d721449f..e2b71a05d2 100644 --- a/be/src/olap/rowset/segment_v2/segment.h +++ b/be/src/olap/rowset/segment_v2/segment.h @@ -27,6 +27,7 @@ #include "gutil/macros.h" #include "io/fs/file_system.h" #include "olap/iterators.h" +#include "olap/primary_key_index.h" #include "olap/rowset/segment_v2/page_handle.h" #include "olap/short_key_index.h" #include "olap/tablet_schema.h" @@ -145,6 +146,8 @@ private: PageHandle _sk_index_handle; // short key index decoder std::unique_ptr<ShortKeyIndexDecoder> _sk_index_decoder; + // primary key index reader + std::unique_ptr<PrimaryKeyIndexReader> _pk_index_reader; }; } // namespace segment_v2 --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org