Coverage Report

Created: 2026-05-17 15:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/storage/index/index_writer.cpp
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
#include "common/exception.h"
19
#include "storage/field.h"
20
#include "storage/index/ann/ann_index_writer.h"
21
#include "storage/index/inverted/inverted_index_writer.h"
22
23
namespace doris::segment_v2 {
24
25
18.7k
bool IndexColumnWriter::check_support_inverted_index(const TabletColumn& column) {
26
    // bellow types are not supported in inverted index for extracted columns
27
18.7k
    static std::set<FieldType> invalid_types = {FieldType::OLAP_FIELD_TYPE_JSONB};
28
18.7k
    if (invalid_types.contains(column.type())) {
29
0
        return false;
30
0
    }
31
18.7k
    if (column.is_variant_type()) {
32
389
        return false;
33
389
    }
34
18.4k
    if (column.is_array_type()) {
35
        // only support one level array
36
22
        const auto& subcolumn = column.get_sub_column(0);
37
22
        return !subcolumn.is_array_type() && check_support_inverted_index(subcolumn);
38
22
    }
39
18.3k
    return true;
40
18.4k
}
41
42
14.8k
bool IndexColumnWriter::check_support_ann_index(const TabletColumn& column) {
43
    // only array are supported in ann index
44
14.8k
    return column.is_array_type();
45
14.8k
}
46
47
// create index writer
48
Status IndexColumnWriter::create(const StorageField* field, std::unique_ptr<IndexColumnWriter>* res,
49
                                 IndexFileWriter* index_file_writer,
50
2.30k
                                 const TabletIndex* index_meta) {
51
2.30k
    FieldType type = field->type();
52
2.30k
    std::string field_name;
53
2.30k
    auto storage_format = index_file_writer->get_storage_format();
54
2.30k
    if (storage_format == InvertedIndexStorageFormatPB::V1) {
55
19
        field_name = field->name();
56
2.28k
    } else {
57
2.28k
        if (field->is_extracted_column()) {
58
            // variant sub col
59
            // field_name format: parent_unique_id.sub_col_name
60
0
            field_name = std::to_string(field->parent_unique_id()) + "." + field->name();
61
2.28k
        } else {
62
2.28k
            field_name = std::to_string(field->unique_id());
63
2.28k
        }
64
2.28k
    }
65
66
2.30k
    if (index_meta->is_inverted_index()) {
67
2.30k
        bool single_field = true;
68
2.30k
        if (type == FieldType::OLAP_FIELD_TYPE_ARRAY) {
69
10
            const auto& column = field->get_desc();
70
10
            bool has_item_subcolumn = column.get_subtype_count() > 0;
71
10
            DBUG_EXECUTE_IF("InvertedIndexColumnWriter::create_array_typeinfo_is_nullptr",
72
10
                            { has_item_subcolumn = false; })
73
10
            if (has_item_subcolumn) {
74
10
                type = column.get_sub_column(0).type();
75
10
                single_field = false;
76
10
            } else {
77
0
                return Status::NotSupported("unsupported array type for inverted index: " +
78
0
                                            std::to_string(int(type)));
79
0
            }
80
10
        }
81
82
2.30k
        DBUG_EXECUTE_IF("InvertedIndexColumnWriter::create_unsupported_type_for_inverted_index",
83
2.30k
                        { type = FieldType::OLAP_FIELD_TYPE_JSONB; })
84
2.30k
        switch (type) {
85
0
#define M(TYPE)                                                                                 \
86
2.30k
    case TYPE:                                                                                  \
87
2.30k
        *res = std::make_unique<InvertedIndexColumnWriter<TYPE>>(field_name, index_file_writer, \
88
2.30k
                                                                 index_meta, single_field);     \
89
2.30k
        break;
90
2
            M(FieldType::OLAP_FIELD_TYPE_TINYINT)
91
2
            M(FieldType::OLAP_FIELD_TYPE_SMALLINT)
92
444
            M(FieldType::OLAP_FIELD_TYPE_INT)
93
0
            M(FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT)
94
2
            M(FieldType::OLAP_FIELD_TYPE_BIGINT)
95
2
            M(FieldType::OLAP_FIELD_TYPE_LARGEINT)
96
0
            M(FieldType::OLAP_FIELD_TYPE_CHAR)
97
50
            M(FieldType::OLAP_FIELD_TYPE_VARCHAR)
98
1.77k
            M(FieldType::OLAP_FIELD_TYPE_STRING)
99
2
            M(FieldType::OLAP_FIELD_TYPE_DATE)
100
2
            M(FieldType::OLAP_FIELD_TYPE_DATETIME)
101
1
            M(FieldType::OLAP_FIELD_TYPE_DECIMAL)
102
2
            M(FieldType::OLAP_FIELD_TYPE_DATEV2)
103
2
            M(FieldType::OLAP_FIELD_TYPE_DATETIMEV2)
104
3
            M(FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ)
105
1
            M(FieldType::OLAP_FIELD_TYPE_DECIMAL32)
106
1
            M(FieldType::OLAP_FIELD_TYPE_DECIMAL64)
107
1
            M(FieldType::OLAP_FIELD_TYPE_DECIMAL128I)
108
1
            M(FieldType::OLAP_FIELD_TYPE_DECIMAL256)
109
2
            M(FieldType::OLAP_FIELD_TYPE_BOOL)
110
1
            M(FieldType::OLAP_FIELD_TYPE_IPV4)
111
1
            M(FieldType::OLAP_FIELD_TYPE_IPV6)
112
1
            M(FieldType::OLAP_FIELD_TYPE_FLOAT)
113
1
            M(FieldType::OLAP_FIELD_TYPE_DOUBLE)
114
0
#undef M
115
1
        default:
116
1
            return Status::NotSupported("unsupported type for inverted index: " +
117
1
                                        std::to_string(int(type)));
118
2.30k
        }
119
2.30k
        if (*res != nullptr) {
120
2.30k
            auto st = (*res)->init();
121
2.30k
            if (!st.ok()) {
122
0
                (*res)->close_on_error();
123
0
                return st;
124
0
            }
125
2.30k
        }
126
2.30k
    } else if (index_meta->is_ann_index()) {
127
2
        DCHECK(type == FieldType::OLAP_FIELD_TYPE_ARRAY);
128
2
        *res = std ::make_unique<AnnIndexColumnWriter>(index_file_writer, index_meta);
129
2
        if (*res != nullptr) {
130
2
            auto st = (*res)->init();
131
2
            if (!st.ok()) {
132
0
                (*res)->close_on_error();
133
0
                return st;
134
0
            }
135
2
        }
136
2
    }
137
138
2.30k
    return Status::OK();
139
2.30k
}
140
141
} // namespace doris::segment_v2