yiguolei commented on code in PR #49040:
URL: https://github.com/apache/doris/pull/49040#discussion_r2306281404


##########
be/src/olap/rowset/segment_v2/segment.cpp:
##########
@@ -717,77 +690,79 @@ Status Segment::new_column_iterator(const TabletColumn& 
tablet_column,
     if (opt->runtime_state != nullptr) {
         _be_exec_version = opt->runtime_state->be_exec_version();
     }
-    RETURN_IF_ERROR(_create_column_readers_once(opt->stats));
+    RETURN_IF_ERROR(_create_column_meta_once(opt->stats));
 
     // For compability reason unique_id may less than 0 for variant extracted 
column
     int32_t unique_id = tablet_column.unique_id() >= 0 ? 
tablet_column.unique_id()
                                                        : 
tablet_column.parent_unique_id();
     // init default iterator
-    if (!_column_readers.contains(unique_id)) {
+    if (!_column_uid_to_footer_ordinal.contains(unique_id)) {
         RETURN_IF_ERROR(new_default_iterator(tablet_column, iter));
         return Status::OK();
     }
     // init iterator by unique id
-    RETURN_IF_ERROR(_column_readers.at(unique_id)->new_iterator(iter, 
&tablet_column, opt));
+    std::shared_ptr<ColumnReader> reader;
+    RETURN_IF_ERROR(get_column_reader(unique_id, &reader, opt->stats));
+    if (reader == nullptr) {
+        return Status::InternalError("column reader is nullptr, unique_id={}", 
unique_id);
+    }
+    if (reader->get_meta_type() == FieldType::OLAP_FIELD_TYPE_VARIANT) {
+        // use _column_reader_cache to get variant subcolumn(path column) 
reader
+        RETURN_IF_ERROR(
+                assert_cast<VariantColumnReader*>(reader.get())
+                        ->new_iterator(iter, &tablet_column, opt, 
_column_reader_cache.get()));
+    } else {
+        RETURN_IF_ERROR(reader->new_iterator(iter, &tablet_column, opt));
+    }
 
     if (config::enable_column_type_check && !tablet_column.has_path_info() &&
-        !tablet_column.is_agg_state_type() &&
-        tablet_column.type() != 
_column_readers.at(unique_id)->get_meta_type()) {
+        !tablet_column.is_agg_state_type() && tablet_column.type() != 
reader->get_meta_type()) {
         LOG(WARNING) << "different type between schema and column reader,"
                      << " column schema name: " << tablet_column.name()
                      << " column schema type: " << int(tablet_column.type())
-                     << " column reader meta type: "
-                     << int(_column_readers.at(unique_id)->get_meta_type());
+                     << " column reader meta type: " << 
int(reader->get_meta_type());
         return Status::InternalError("different type between schema and column 
reader");
     }
     return Status::OK();
 }
 
-Status Segment::get_column_reader(int32_t col_unique_id, ColumnReader** 
reader) {
-    RETURN_IF_ERROR(_create_column_readers_once(nullptr));
-    if (_column_readers.contains(col_unique_id)) {
-        *reader = _column_readers[col_unique_id].get();
+Status Segment::get_column_reader(int32_t col_uid, 
std::shared_ptr<ColumnReader>* column_reader,
+                                  OlapReaderStatistics* stats) {
+    RETURN_IF_ERROR(_create_column_meta_once(stats));
+    SCOPED_RAW_TIMER(&stats->segment_create_column_readers_timer_ns);
+    // The column is not in this segment, return nullptr
+    if (!_tablet_schema->has_column_unique_id(col_uid)) {
+        *column_reader = nullptr;
         return Status::OK();
     }
-    // The column reader is not found, since the segment does not contain the 
column, example new added column.
-    *reader = nullptr;
-    return Status::OK();
+    return _column_reader_cache->get_column_reader(col_uid, column_reader, 
stats);
 }
 
-Status Segment::new_column_iterator(int32_t unique_id, const 
StorageReadOptions* opt,
-                                    std::unique_ptr<ColumnIterator>* iter) {
-    RETURN_IF_ERROR(_create_column_readers_once(opt->stats));
-    TabletColumn tablet_column = _tablet_schema->column_by_uid(unique_id);
-    RETURN_IF_ERROR(_column_readers.at(unique_id)->new_iterator(iter, 
&tablet_column));
-    return Status::OK();
-}
-
-ColumnReader* Segment::_get_column_reader(const TabletColumn& col) {
-    // init column iterator by path info
-    if (col.has_path_info() || col.is_variant_type()) {
-        auto relative_path = col.path_info_ptr()->copy_pop_front();
-        int32_t unique_id = col.unique_id() > 0 ? col.unique_id() : 
col.parent_unique_id();
-        const auto* node = col.has_path_info() && 
_column_readers.contains(unique_id)
-                                   ? 
((VariantColumnReader*)(_column_readers.at(unique_id).get()))
-                                             
->get_reader_by_path(relative_path)
-                                   : nullptr;
-        if (node != nullptr) {
-            return node->data.reader.get();
-        }
-        return nullptr;
+Status Segment::get_column_reader(const TabletColumn& col,
+                                  std::shared_ptr<ColumnReader>* column_reader,
+                                  OlapReaderStatistics* stats) {
+    RETURN_IF_ERROR(_create_column_meta_once(stats));
+    SCOPED_RAW_TIMER(&stats->segment_create_column_readers_timer_ns);
+    int col_uid = col.unique_id() >= 0 ? col.unique_id() : 
col.parent_unique_id();
+    // The column is not in this segment, return nullptr
+    if (!_tablet_schema->has_column_unique_id(col_uid)) {
+        *column_reader = nullptr;
+        return Status::OK();

Review Comment:
   返回not found 这样的error code



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to