// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

syntax="proto2";

package doris;
option java_package = "org.apache.doris.proto";

import "olap_common.proto";

message StreamInfoMessage {
    enum Kind {
        ROW_INDEX = 0;
        PRESENT = 1;
        DATA = 2;
        LENGTH = 3;
        DICTIONARY_DATA = 4;
        SECONDARY = 5;
        ROW_INDEX_STATISTIC = 6;
        BLOOM_FILTER = 7;
    }
    required Kind kind = 1;
    required uint32 column_unique_id = 2;
    required uint64 length = 3;
}

message ColumnEncodingMessage {
    enum Kind {
        DIRECT = 0;
        DICTIONARY = 1;
    }
    optional Kind kind = 1;
    optional uint32 dictionary_size = 2;
}

message ColumnDataHeaderMessage {
    required string magic_string = 1 [default = "COLUMN DATA"];
    required uint32 version = 2 [default = 1];
    required uint64 number_of_rows = 4; 
    // 列Schema
    repeated ColumnMessage column = 5;
    // 每一列的统计信息
    required uint64 index_length = 7;
    required uint64 data_length = 8;
    required CompressKind compress_kind = 9 [default = COMPRESS_LZO];
    repeated StreamInfoMessage stream_info = 10;
    repeated ColumnEncodingMessage column_encoding = 11;
    required uint32 stream_buffer_size = 12;
    optional uint32 num_rows_per_block = 13 [default = 0];
    // bloom filter params
    optional uint32 bf_hash_function_num = 14;
    optional uint32 bf_bit_num = 15;
}

