You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by da...@apache.org on 2022/07/19 13:14:36 UTC

[doris] branch master updated: [feature-wip](unique-key-merge-on-write) add segment lookup interface implementation, DSIP-018 (#10922)

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 <li...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org