blob: 7fa1e8be9df86f9403c755127dd590a0e3255caa [file]
// 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.
use crate::spec::stats::BinaryTableStats;
use chrono::serde::ts_milliseconds_option::deserialize as from_millis_opt;
use chrono::serde::ts_milliseconds_option::serialize as to_millis_opt;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
/// Metadata of a data file.
///
/// Impl References: <https://github.com/apache/paimon/blob/release-0.8.2/paimon-core/src/main/java/org/apache/paimon/io/DataFileMeta.java>
#[derive(Debug, Eq, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DataFileMeta {
#[serde(rename = "_FILE_NAME")]
pub file_name: String,
#[serde(rename = "_FILE_SIZE")]
pub file_size: i64,
// row_count tells the total number of rows (including add & delete) in this file.
#[serde(rename = "_ROW_COUNT")]
pub row_count: i64,
#[serde(rename = "_MIN_KEY", with = "serde_bytes")]
pub min_key: Vec<u8>,
#[serde(rename = "_MAX_KEY", with = "serde_bytes")]
pub max_key: Vec<u8>,
#[serde(rename = "_KEY_STATS")]
pub key_stats: BinaryTableStats,
#[serde(rename = "_VALUE_STATS")]
pub value_stats: BinaryTableStats,
#[serde(rename = "_MIN_SEQUENCE_NUMBER")]
pub min_sequence_number: i64,
#[serde(rename = "_MAX_SEQUENCE_NUMBER")]
pub max_sequence_number: i64,
#[serde(rename = "_SCHEMA_ID")]
pub schema_id: i64,
#[serde(rename = "_LEVEL")]
pub level: i32,
#[serde(rename = "_EXTRA_FILES")]
pub extra_files: Vec<String>,
#[serde(
rename = "_CREATION_TIME",
serialize_with = "to_millis_opt",
deserialize_with = "from_millis_opt",
default
)]
pub creation_time: Option<DateTime<Utc>>,
#[serde(rename = "_DELETE_ROW_COUNT")]
// rowCount = add_row_count + delete_row_count.
pub delete_row_count: Option<i64>,
// file index filter bytes, if it is small, store in data file meta
#[serde(rename = "_EMBEDDED_FILE_INDEX", with = "serde_bytes")]
pub embedded_index: Option<Vec<u8>>,
/// File source identifier (e.g. APPEND, COMPACT).
#[serde(
rename = "_FILE_SOURCE",
default,
skip_serializing_if = "Option::is_none"
)]
pub file_source: Option<i32>,
/// Column names covered by `_VALUE_STATS` when stats are written in dense mode.
#[serde(
rename = "_VALUE_STATS_COLS",
default,
skip_serializing_if = "Option::is_none"
)]
pub value_stats_cols: Option<Vec<String>>,
/// External path for the data file (e.g. when data is stored outside the table directory).
#[serde(
rename = "_EXTERNAL_PATH",
default,
skip_serializing_if = "Option::is_none"
)]
pub external_path: Option<String>,
/// The starting row ID for this file's data (used in data evolution mode).
#[serde(
rename = "_FIRST_ROW_ID",
default,
skip_serializing_if = "Option::is_none"
)]
pub first_row_id: Option<i64>,
/// Which table columns this file contains (used in data evolution mode).
#[serde(
rename = "_WRITE_COLS",
default,
skip_serializing_if = "Option::is_none"
)]
pub write_cols: Option<Vec<String>>,
}
impl Display for DataFileMeta {
fn fmt(&self, _: &mut Formatter<'_>) -> std::fmt::Result {
todo!()
}
}
impl DataFileMeta {
/// Returns the row ID range `[first_row_id, first_row_id + row_count - 1]` if `first_row_id` is set.
pub fn row_id_range(&self) -> Option<(i64, i64)> {
self.first_row_id.map(|fid| (fid, fid + self.row_count - 1))
}
}