mod compacted_key_encoder;
mod compacted_row_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::{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(
row_type: &RowType,
key_fields: &[String],
data_lake_format: &Option<DataLakeFormat>,
) -> Result<Box<dyn KeyEncoder>> {
match data_lake_format {
Some(DataLakeFormat::Paimon) => Err(Error::UnsupportedOperation {
message: "KeyEncoder for Paimon format is not yet implemented".to_string(),
}),
Some(DataLakeFormat::Lance) => Ok(Box::new(CompactedKeyEncoder::create_key_encoder(
row_type, key_fields,
)?)),
Some(DataLakeFormat::Iceberg) => Err(Error::UnsupportedOperation {
message: "KeyEncoder for Iceberg format is not yet implemented".to_string(),
}),
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),
}
}
}