mod compacted_key_encoder;
mod compacted_row_encoder;
mod iceberg_key_encoder;
mod paimon_key_encoder;
use crate::error::{Error, Result};
use crate::metadata::{DataLakeFormat, KvFormat, RowType};
use crate::row::encode::compacted_key_encoder::CompactedKeyEncoder;
use crate::row::encode::compacted_row_encoder::CompactedRowEncoder;
use crate::row::encode::iceberg_key_encoder::IcebergKeyEncoder;
use crate::row::encode::paimon_key_encoder::PaimonKeyEncoder;
use crate::row::{Datum, InternalRow};
use bytes::Bytes;
#[allow(dead_code)]
pub trait KeyEncoder: Send + Sync {
fn encode_key(&mut self, row: &dyn InternalRow) -> Result<Bytes>;
}
pub struct KeyEncoderFactory;
impl KeyEncoderFactory {
pub fn of_primary_key_encoder(
row_type: &RowType,
key_fields: &[String],
data_lake_format: &Option<DataLakeFormat>,
kv_format_version: i32,
is_default_bucket_key: bool,
) -> Result<Box<dyn KeyEncoder>> {
match kv_format_version {
1 => Self::of(row_type, key_fields, data_lake_format),
2 if is_default_bucket_key => Self::of(row_type, key_fields, data_lake_format),
2 => Ok(Box::new(CompactedKeyEncoder::create_key_encoder(
row_type, key_fields,
)?)),
v => Err(Error::UnsupportedOperation {
message: format!("Unsupported kv format version: {v}"),
}),
}
}
pub fn of_bucket_key_encoder(
row_type: &RowType,
key_fields: &[String],
data_lake_format: &Option<DataLakeFormat>,
) -> Result<Box<dyn KeyEncoder>> {
Self::of(row_type, key_fields, data_lake_format)
}
fn of(
row_type: &RowType,
key_fields: &[String],
data_lake_format: &Option<DataLakeFormat>,
) -> Result<Box<dyn KeyEncoder>> {
match data_lake_format {
Some(DataLakeFormat::Paimon) => {
Ok(Box::new(PaimonKeyEncoder::new(row_type, key_fields)?))
}
Some(DataLakeFormat::Lance) => Ok(Box::new(CompactedKeyEncoder::create_key_encoder(
row_type, key_fields,
)?)),
Some(DataLakeFormat::Iceberg) => {
Ok(Box::new(IcebergKeyEncoder::new(row_type, key_fields)?))
}
None => Ok(Box::new(CompactedKeyEncoder::create_key_encoder(
row_type, key_fields,
)?)),
}
}
}
#[allow(dead_code)]
pub trait RowEncoder: Send + Sync {
fn start_new_row(&mut self) -> Result<()>;
fn encode_field(&mut self, pos: usize, value: Datum) -> Result<()>;
fn finish_row(&mut self) -> Result<Bytes>;
fn close(&mut self) -> Result<()>;
}
#[allow(dead_code)]
pub struct RowEncoderFactory {}
#[allow(dead_code)]
impl RowEncoderFactory {
pub fn create(kv_format: KvFormat, row_type: RowType) -> Result<impl RowEncoder> {
Self::create_for_field_types(kv_format, row_type)
}
pub fn create_for_field_types(
kv_format: KvFormat,
row_type: RowType,
) -> Result<impl RowEncoder> {
match kv_format {
KvFormat::INDEXED => {
todo!()
}
KvFormat::COMPACTED => CompactedRowEncoder::new(row_type),
}
}
}