This is an automated email from the ASF dual-hosted git repository.
liurenjie1024 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
The following commit(s) were added to refs/heads/main by this push:
new 07b7744 Simplify PrimitiveLiteral (#502)
07b7744 is described below
commit 07b774414b4833e2dbce5f15a3131fbab1db3971
Author: ZENOTME <[email protected]>
AuthorDate: Tue Aug 13 12:56:40 2024 +0800
Simplify PrimitiveLiteral (#502)
* simplify PrimitiveLiteral
* fix test
---------
Co-authored-by: ZENOTME <[email protected]>
---
crates/iceberg/src/spec/datatypes.rs | 101 ++++-----
crates/iceberg/src/spec/transform.rs | 36 +--
crates/iceberg/src/spec/values.rs | 249 ++++++++++-----------
crates/iceberg/src/transform/bucket.rs | 28 +--
crates/iceberg/src/transform/temporal.rs | 44 ++--
crates/iceberg/src/transform/truncate.rs | 6 +-
.../src/writer/file_writer/parquet_writer.rs | 12 +-
7 files changed, 239 insertions(+), 237 deletions(-)
diff --git a/crates/iceberg/src/spec/datatypes.rs
b/crates/iceberg/src/spec/datatypes.rs
index d888387..833f17f 100644
--- a/crates/iceberg/src/spec/datatypes.rs
+++ b/crates/iceberg/src/spec/datatypes.rs
@@ -245,14 +245,14 @@ impl PrimitiveType {
| (PrimitiveType::Long, PrimitiveLiteral::Long(_))
| (PrimitiveType::Float, PrimitiveLiteral::Float(_))
| (PrimitiveType::Double, PrimitiveLiteral::Double(_))
- | (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Decimal(_))
- | (PrimitiveType::Date, PrimitiveLiteral::Date(_))
- | (PrimitiveType::Time, PrimitiveLiteral::Time(_))
- | (PrimitiveType::Timestamp, PrimitiveLiteral::Timestamp(_))
- | (PrimitiveType::Timestamptz,
PrimitiveLiteral::Timestamptz(_))
+ | (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Int128(_))
+ | (PrimitiveType::Date, PrimitiveLiteral::Int(_))
+ | (PrimitiveType::Time, PrimitiveLiteral::Long(_))
+ | (PrimitiveType::Timestamp, PrimitiveLiteral::Long(_))
+ | (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(_))
| (PrimitiveType::String, PrimitiveLiteral::String(_))
- | (PrimitiveType::Uuid, PrimitiveLiteral::Uuid(_))
- | (PrimitiveType::Fixed(_), PrimitiveLiteral::Fixed(_))
+ | (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(_))
+ | (PrimitiveType::Fixed(_), PrimitiveLiteral::Binary(_))
| (PrimitiveType::Binary, PrimitiveLiteral::Binary(_))
)
}
@@ -933,11 +933,15 @@ mod tests {
Type::Struct(StructType {
fields: vec![
NestedField::required(1, "id",
Type::Primitive(PrimitiveType::Uuid))
-
.with_initial_default(Literal::Primitive(PrimitiveLiteral::Uuid(
-
Uuid::parse_str("0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb").unwrap(),
+
.with_initial_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+
Uuid::parse_str("0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb")
+ .unwrap()
+ .as_u128(),
)))
-
.with_write_default(Literal::Primitive(PrimitiveLiteral::Uuid(
-
Uuid::parse_str("ec5911be-b0a7-458c-8438-c9a3e53cffae").unwrap(),
+
.with_write_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+
Uuid::parse_str("ec5911be-b0a7-458c-8438-c9a3e53cffae")
+ .unwrap()
+ .as_u128(),
)))
.into(),
NestedField::optional(2, "data",
Type::Primitive(PrimitiveType::Int)).into(),
@@ -1002,11 +1006,15 @@ mod tests {
let struct_type = Type::Struct(StructType::new(vec![
NestedField::required(1, "id",
Type::Primitive(PrimitiveType::Uuid))
-
.with_initial_default(Literal::Primitive(PrimitiveLiteral::Uuid(
-
Uuid::parse_str("0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb").unwrap(),
+
.with_initial_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+ Uuid::parse_str("0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb")
+ .unwrap()
+ .as_u128(),
)))
- .with_write_default(Literal::Primitive(PrimitiveLiteral::Uuid(
-
Uuid::parse_str("ec5911be-b0a7-458c-8438-c9a3e53cffae").unwrap(),
+
.with_write_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+ Uuid::parse_str("ec5911be-b0a7-458c-8438-c9a3e53cffae")
+ .unwrap()
+ .as_u128(),
)))
.into(),
NestedField::optional(2, "data",
Type::Primitive(PrimitiveType::Int)).into(),
@@ -1127,45 +1135,32 @@ mod tests {
#[test]
fn test_primitive_type_compatitable() {
- let types = vec![
- PrimitiveType::Boolean,
- PrimitiveType::Int,
- PrimitiveType::Long,
- PrimitiveType::Float,
- PrimitiveType::Double,
- PrimitiveType::Decimal {
- precision: 9,
- scale: 2,
- },
- PrimitiveType::Date,
- PrimitiveType::Time,
- PrimitiveType::Timestamp,
- PrimitiveType::Timestamptz,
- PrimitiveType::String,
- PrimitiveType::Uuid,
- PrimitiveType::Fixed(8),
- PrimitiveType::Binary,
- ];
- let literals = vec![
- PrimitiveLiteral::Boolean(true),
- PrimitiveLiteral::Int(1),
- PrimitiveLiteral::Long(1),
- PrimitiveLiteral::Float(1.0.into()),
- PrimitiveLiteral::Double(1.0.into()),
- PrimitiveLiteral::Decimal(1),
- PrimitiveLiteral::Date(1),
- PrimitiveLiteral::Time(1),
- PrimitiveLiteral::Timestamp(1),
- PrimitiveLiteral::Timestamptz(1),
- PrimitiveLiteral::String("1".to_string()),
- PrimitiveLiteral::Uuid(Uuid::new_v4()),
- PrimitiveLiteral::Fixed(vec![1]),
- PrimitiveLiteral::Binary(vec![1]),
+ let pairs = vec![
+ (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(true)),
+ (PrimitiveType::Int, PrimitiveLiteral::Int(1)),
+ (PrimitiveType::Long, PrimitiveLiteral::Long(1)),
+ (PrimitiveType::Float, PrimitiveLiteral::Float(1.0.into())),
+ (PrimitiveType::Double, PrimitiveLiteral::Double(1.0.into())),
+ (
+ PrimitiveType::Decimal {
+ precision: 9,
+ scale: 2,
+ },
+ PrimitiveLiteral::Int128(1),
+ ),
+ (PrimitiveType::Date, PrimitiveLiteral::Int(1)),
+ (PrimitiveType::Time, PrimitiveLiteral::Long(1)),
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(1)),
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(1)),
+ (
+ PrimitiveType::Uuid,
+ PrimitiveLiteral::UInt128(Uuid::new_v4().as_u128()),
+ ),
+ (PrimitiveType::Fixed(8), PrimitiveLiteral::Binary(vec![1])),
+ (PrimitiveType::Binary, PrimitiveLiteral::Binary(vec![1])),
];
- for (i, t) in types.iter().enumerate() {
- for (j, l) in literals.iter().enumerate() {
- assert_eq!(i == j, t.compatible(l));
- }
+ for (ty, literal) in pairs {
+ assert!(ty.compatible(&literal));
}
}
}
diff --git a/crates/iceberg/src/spec/transform.rs
b/crates/iceberg/src/spec/transform.rs
index 54e2105..9148844 100644
--- a/crates/iceberg/src/spec/transform.rs
+++ b/crates/iceberg/src/spec/transform.rs
@@ -464,23 +464,29 @@ impl Transform {
/// `StartsWith`, `NotStartsWith`), the original datum is returned
/// unmodified.
fn adjust_boundary(op: &PredicateOperator, datum: &Datum) ->
Result<Option<Datum>> {
- let literal = datum.literal();
-
let adjusted_boundary = match op {
- PredicateOperator::LessThan => match literal {
- PrimitiveLiteral::Int(v) => Some(Datum::int(v - 1)),
- PrimitiveLiteral::Long(v) => Some(Datum::long(v - 1)),
- PrimitiveLiteral::Decimal(v) => Some(Datum::decimal(v - 1)?),
- PrimitiveLiteral::Date(v) => Some(Datum::date(v - 1)),
- PrimitiveLiteral::Timestamp(v) =>
Some(Datum::timestamp_micros(v - 1)),
+ PredicateOperator::LessThan => match (datum.data_type(),
datum.literal()) {
+ (PrimitiveType::Int, PrimitiveLiteral::Int(v)) =>
Some(Datum::int(v - 1)),
+ (PrimitiveType::Long, PrimitiveLiteral::Long(v)) =>
Some(Datum::long(v - 1)),
+ (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Int128(v))
=> {
+ Some(Datum::decimal(v - 1)?)
+ }
+ (PrimitiveType::Date, PrimitiveLiteral::Int(v)) =>
Some(Datum::date(v - 1)),
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) => {
+ Some(Datum::timestamp_micros(v - 1))
+ }
_ => Some(datum.to_owned()),
},
- PredicateOperator::GreaterThan => match literal {
- PrimitiveLiteral::Int(v) => Some(Datum::int(v + 1)),
- PrimitiveLiteral::Long(v) => Some(Datum::long(v + 1)),
- PrimitiveLiteral::Decimal(v) => Some(Datum::decimal(v + 1)?),
- PrimitiveLiteral::Date(v) => Some(Datum::date(v + 1)),
- PrimitiveLiteral::Timestamp(v) =>
Some(Datum::timestamp_micros(v + 1)),
+ PredicateOperator::GreaterThan => match (datum.data_type(),
datum.literal()) {
+ (PrimitiveType::Int, PrimitiveLiteral::Int(v)) =>
Some(Datum::int(v + 1)),
+ (PrimitiveType::Long, PrimitiveLiteral::Long(v)) =>
Some(Datum::long(v + 1)),
+ (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Int128(v))
=> {
+ Some(Datum::decimal(v + 1)?)
+ }
+ (PrimitiveType::Date, PrimitiveLiteral::Int(v)) =>
Some(Datum::date(v + 1)),
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) => {
+ Some(Datum::timestamp_micros(v + 1))
+ }
_ => Some(datum.to_owned()),
},
PredicateOperator::Eq
@@ -555,7 +561,7 @@ impl Transform {
transformed: &Datum,
) -> Option<AdjustedProjection> {
let should_adjust = match self {
- Transform::Day => matches!(original.literal(),
PrimitiveLiteral::Timestamp(_)),
+ Transform::Day => matches!(original.data_type(),
PrimitiveType::Timestamp),
Transform::Year | Transform::Month => true,
_ => false,
};
diff --git a/crates/iceberg/src/spec/values.rs
b/crates/iceberg/src/spec/values.rs
index 8c2e4ab..03fd1ec 100644
--- a/crates/iceberg/src/spec/values.rs
+++ b/crates/iceberg/src/spec/values.rs
@@ -65,24 +65,14 @@ pub enum PrimitiveLiteral {
Float(OrderedFloat<f32>),
/// Stored as 8-byte little-endian
Double(OrderedFloat<f64>),
- /// Stores days from the 1970-01-01 in an 4-byte little-endian int
- Date(i32),
- /// Stores microseconds from midnight in an 8-byte little-endian long
- Time(i64),
- /// Timestamp without timezone
- Timestamp(i64),
- /// Timestamp with timezone
- Timestamptz(i64),
/// UTF-8 bytes (without length)
String(String),
- /// 16-byte big-endian value
- Uuid(Uuid),
- /// Binary value
- Fixed(Vec<u8>),
/// Binary value (without length)
Binary(Vec<u8>),
- /// Stores unscaled value as big int. According to iceberg spec, the
precision must less than 38(`MAX_DECIMAL_PRECISION`) , so i128 is suit here.
- Decimal(i128),
+ /// Stored as 16-byte little-endian
+ Int128(i128),
+ /// Stored as 16-byte little-endian
+ UInt128(u128),
}
impl PrimitiveLiteral {
@@ -248,26 +238,26 @@ impl PartialOrd for Datum {
PrimitiveType::Double,
) => val.partial_cmp(other_val),
(
- PrimitiveLiteral::Date(val),
- PrimitiveLiteral::Date(other_val),
+ PrimitiveLiteral::Int(val),
+ PrimitiveLiteral::Int(other_val),
PrimitiveType::Date,
PrimitiveType::Date,
) => val.partial_cmp(other_val),
(
- PrimitiveLiteral::Time(val),
- PrimitiveLiteral::Time(other_val),
+ PrimitiveLiteral::Long(val),
+ PrimitiveLiteral::Long(other_val),
PrimitiveType::Time,
PrimitiveType::Time,
) => val.partial_cmp(other_val),
(
- PrimitiveLiteral::Timestamp(val),
- PrimitiveLiteral::Timestamp(other_val),
+ PrimitiveLiteral::Long(val),
+ PrimitiveLiteral::Long(other_val),
PrimitiveType::Timestamp,
PrimitiveType::Timestamp,
) => val.partial_cmp(other_val),
(
- PrimitiveLiteral::Timestamptz(val),
- PrimitiveLiteral::Timestamptz(other_val),
+ PrimitiveLiteral::Long(val),
+ PrimitiveLiteral::Long(other_val),
PrimitiveType::Timestamptz,
PrimitiveType::Timestamptz,
) => val.partial_cmp(other_val),
@@ -278,14 +268,14 @@ impl PartialOrd for Datum {
PrimitiveType::String,
) => val.partial_cmp(other_val),
(
- PrimitiveLiteral::Uuid(val),
- PrimitiveLiteral::Uuid(other_val),
+ PrimitiveLiteral::UInt128(val),
+ PrimitiveLiteral::UInt128(other_val),
PrimitiveType::Uuid,
PrimitiveType::Uuid,
- ) => val.partial_cmp(other_val),
+ ) =>
Uuid::from_u128(*val).partial_cmp(&Uuid::from_u128(*other_val)),
(
- PrimitiveLiteral::Fixed(val),
- PrimitiveLiteral::Fixed(other_val),
+ PrimitiveLiteral::Binary(val),
+ PrimitiveLiteral::Binary(other_val),
PrimitiveType::Fixed(_),
PrimitiveType::Fixed(_),
) => val.partial_cmp(other_val),
@@ -296,8 +286,8 @@ impl PartialOrd for Datum {
PrimitiveType::Binary,
) => val.partial_cmp(other_val),
(
- PrimitiveLiteral::Decimal(val),
- PrimitiveLiteral::Decimal(other_val),
+ PrimitiveLiteral::Int128(val),
+ PrimitiveLiteral::Int128(other_val),
PrimitiveType::Decimal {
precision: _,
scale,
@@ -320,28 +310,33 @@ impl Display for Datum {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match (&self.r#type, &self.literal) {
(_, PrimitiveLiteral::Boolean(val)) => write!(f, "{}", val),
- (_, PrimitiveLiteral::Int(val)) => write!(f, "{}", val),
- (_, PrimitiveLiteral::Long(val)) => write!(f, "{}", val),
+ (PrimitiveType::Int, PrimitiveLiteral::Int(val)) => write!(f,
"{}", val),
+ (PrimitiveType::Long, PrimitiveLiteral::Long(val)) => write!(f,
"{}", val),
(_, PrimitiveLiteral::Float(val)) => write!(f, "{}", val),
(_, PrimitiveLiteral::Double(val)) => write!(f, "{}", val),
- (_, PrimitiveLiteral::Date(val)) => write!(f, "{}",
days_to_date(*val)),
- (_, PrimitiveLiteral::Time(val)) => write!(f, "{}",
microseconds_to_time(*val)),
- (_, PrimitiveLiteral::Timestamp(val)) => {
+ (PrimitiveType::Date, PrimitiveLiteral::Int(val)) => {
+ write!(f, "{}", days_to_date(*val))
+ }
+ (PrimitiveType::Time, PrimitiveLiteral::Long(val)) => {
+ write!(f, "{}", microseconds_to_time(*val))
+ }
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) => {
write!(f, "{}", microseconds_to_datetime(*val))
}
- (_, PrimitiveLiteral::Timestamptz(val)) => {
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) => {
write!(f, "{}", microseconds_to_datetimetz(*val))
}
(_, PrimitiveLiteral::String(val)) => write!(f, r#""{}""#, val),
- (_, PrimitiveLiteral::Uuid(val)) => write!(f, "{}", val),
- (_, PrimitiveLiteral::Fixed(val)) => display_bytes(val, f),
+ (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(val)) => {
+ write!(f, "{}", Uuid::from_u128(*val))
+ }
(_, PrimitiveLiteral::Binary(val)) => display_bytes(val, f),
(
PrimitiveType::Decimal {
precision: _,
scale,
},
- PrimitiveLiteral::Decimal(val),
+ PrimitiveLiteral::Int128(val),
) => {
write!(f, "{}", Decimal::from_i128_with_scale(*val, *scale))
}
@@ -398,21 +393,21 @@ impl Datum {
PrimitiveType::Double => {
PrimitiveLiteral::Double(OrderedFloat(f64::from_le_bytes(bytes.try_into()?)))
}
- PrimitiveType::Date =>
PrimitiveLiteral::Date(i32::from_le_bytes(bytes.try_into()?)),
- PrimitiveType::Time =>
PrimitiveLiteral::Time(i64::from_le_bytes(bytes.try_into()?)),
+ PrimitiveType::Date =>
PrimitiveLiteral::Int(i32::from_le_bytes(bytes.try_into()?)),
+ PrimitiveType::Time =>
PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()?)),
PrimitiveType::Timestamp => {
-
PrimitiveLiteral::Timestamp(i64::from_le_bytes(bytes.try_into()?))
+ PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()?))
}
PrimitiveType::Timestamptz => {
-
PrimitiveLiteral::Timestamptz(i64::from_le_bytes(bytes.try_into()?))
+ PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()?))
}
PrimitiveType::String => {
PrimitiveLiteral::String(std::str::from_utf8(bytes)?.to_string())
}
PrimitiveType::Uuid => {
-
PrimitiveLiteral::Uuid(Uuid::from_u128(u128::from_be_bytes(bytes.try_into()?)))
+
PrimitiveLiteral::UInt128(u128::from_be_bytes(bytes.try_into()?))
}
- PrimitiveType::Fixed(_) =>
PrimitiveLiteral::Fixed(Vec::from(bytes)),
+ PrimitiveType::Fixed(_) =>
PrimitiveLiteral::Binary(Vec::from(bytes)),
PrimitiveType::Binary =>
PrimitiveLiteral::Binary(Vec::from(bytes)),
PrimitiveType::Decimal {
precision: _,
@@ -438,15 +433,10 @@ impl Datum {
PrimitiveLiteral::Long(val) => ByteBuf::from(val.to_le_bytes()),
PrimitiveLiteral::Float(val) => ByteBuf::from(val.to_le_bytes()),
PrimitiveLiteral::Double(val) => ByteBuf::from(val.to_le_bytes()),
- PrimitiveLiteral::Date(val) => ByteBuf::from(val.to_le_bytes()),
- PrimitiveLiteral::Time(val) => ByteBuf::from(val.to_le_bytes()),
- PrimitiveLiteral::Timestamp(val) =>
ByteBuf::from(val.to_le_bytes()),
- PrimitiveLiteral::Timestamptz(val) =>
ByteBuf::from(val.to_le_bytes()),
PrimitiveLiteral::String(val) => ByteBuf::from(val.as_bytes()),
- PrimitiveLiteral::Uuid(val) =>
ByteBuf::from(val.as_u128().to_be_bytes()),
- PrimitiveLiteral::Fixed(val) => ByteBuf::from(val.as_slice()),
+ PrimitiveLiteral::UInt128(val) => ByteBuf::from(val.to_be_bytes()),
PrimitiveLiteral::Binary(val) => ByteBuf::from(val.as_slice()),
- PrimitiveLiteral::Decimal(_) => todo!(),
+ PrimitiveLiteral::Int128(_) => todo!(),
}
}
@@ -576,12 +566,12 @@ impl Datum {
/// let t = Datum::date(2);
///
/// assert_eq!(&format!("{t}"), "1970-01-03");
- /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Date(2)), t.into());
+ /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(2)), t.into());
/// ```
pub fn date(days: i32) -> Self {
Self {
r#type: PrimitiveType::Date,
- literal: PrimitiveLiteral::Date(days),
+ literal: PrimitiveLiteral::Int(days),
}
}
@@ -668,7 +658,7 @@ impl Datum {
Ok(Self {
r#type: PrimitiveType::Time,
- literal: PrimitiveLiteral::Time(value),
+ literal: PrimitiveLiteral::Long(value),
})
}
@@ -680,7 +670,7 @@ impl Datum {
Self {
r#type: PrimitiveType::Time,
- literal: PrimitiveLiteral::Time(micro_secs),
+ literal: PrimitiveLiteral::Long(micro_secs),
}
}
@@ -740,7 +730,7 @@ impl Datum {
pub fn timestamp_micros(value: i64) -> Self {
Self {
r#type: PrimitiveType::Timestamp,
- literal: PrimitiveLiteral::Timestamp(value),
+ literal: PrimitiveLiteral::Long(value),
}
}
@@ -798,7 +788,7 @@ impl Datum {
pub fn timestamptz_micros(value: i64) -> Self {
Self {
r#type: PrimitiveType::Timestamptz,
- literal: PrimitiveLiteral::Timestamptz(value),
+ literal: PrimitiveLiteral::Long(value),
}
}
@@ -868,7 +858,7 @@ impl Datum {
pub fn uuid(uuid: Uuid) -> Self {
Self {
r#type: PrimitiveType::Uuid,
- literal: PrimitiveLiteral::Uuid(uuid),
+ literal: PrimitiveLiteral::UInt128(uuid.as_u128()),
}
}
@@ -907,7 +897,7 @@ impl Datum {
let value: Vec<u8> = input.into_iter().collect();
Self {
r#type: PrimitiveType::Fixed(value.len() as u64),
- literal: PrimitiveLiteral::Fixed(value),
+ literal: PrimitiveLiteral::Binary(value),
}
}
@@ -968,7 +958,7 @@ impl Datum {
if let Type::Primitive(p) = r#type {
Ok(Self {
r#type: p,
- literal: PrimitiveLiteral::Decimal(decimal.mantissa()),
+ literal: PrimitiveLiteral::Int128(decimal.mantissa()),
})
} else {
unreachable!("Decimal type must be primitive.")
@@ -980,7 +970,7 @@ impl Datum {
match target_type {
Type::Primitive(target_primitive_type) => {
match (&self.literal, &self.r#type, target_primitive_type) {
- (PrimitiveLiteral::Date(val), _, PrimitiveType::Int) =>
Ok(Datum::int(*val)),
+ (PrimitiveLiteral::Int(val), _, PrimitiveType::Int) =>
Ok(Datum::int(*val)),
(PrimitiveLiteral::Int(val), _, PrimitiveType::Date) =>
Ok(Datum::date(*val)),
// TODO: implement more type conversions
(_, self_type, target_type) if self_type == target_type =>
Ok(self),
@@ -1242,7 +1232,7 @@ impl Literal {
/// Creates date literal from number of days from unix epoch directly.
pub fn date(days: i32) -> Self {
- Self::Primitive(PrimitiveLiteral::Date(days))
+ Self::Primitive(PrimitiveLiteral::Int(days))
}
/// Creates a date in `%Y-%m-%d` format, assume in utc timezone.
@@ -1293,7 +1283,7 @@ impl Literal {
/// Creates time in microseconds directly
pub fn time(value: i64) -> Self {
- Self::Primitive(PrimitiveLiteral::Time(value))
+ Self::Primitive(PrimitiveLiteral::Long(value))
}
/// Creates time literal from [`chrono::NaiveTime`].
@@ -1356,12 +1346,12 @@ impl Literal {
/// Creates a timestamp from unix epoch in microseconds.
pub fn timestamp(value: i64) -> Self {
- Self::Primitive(PrimitiveLiteral::Timestamp(value))
+ Self::Primitive(PrimitiveLiteral::Long(value))
}
/// Creates a timestamp with timezone from unix epoch in microseconds.
pub fn timestamptz(value: i64) -> Self {
- Self::Primitive(PrimitiveLiteral::Timestamptz(value))
+ Self::Primitive(PrimitiveLiteral::Long(value))
}
/// Creates a timestamp from [`DateTime`].
@@ -1421,7 +1411,7 @@ impl Literal {
/// Creates uuid literal.
pub fn uuid(uuid: Uuid) -> Self {
- Self::Primitive(PrimitiveLiteral::Uuid(uuid))
+ Self::Primitive(PrimitiveLiteral::UInt128(uuid.as_u128()))
}
/// Creates uuid from str. See [`Uuid::parse_str`].
@@ -1454,12 +1444,12 @@ impl Literal {
/// ```rust
/// use iceberg::spec::{Literal, PrimitiveLiteral};
/// let t1 = Literal::fixed(vec![1u8, 2u8]);
- /// let t2 = Literal::Primitive(PrimitiveLiteral::Fixed(vec![1u8, 2u8]));
+ /// let t2 = Literal::Primitive(PrimitiveLiteral::Binary(vec![1u8, 2u8]));
///
/// assert_eq!(t1, t2);
/// ```
pub fn fixed<I: IntoIterator<Item = u8>>(input: I) -> Self {
-
Literal::Primitive(PrimitiveLiteral::Fixed(input.into_iter().collect()))
+
Literal::Primitive(PrimitiveLiteral::Binary(input.into_iter().collect()))
}
/// Creates a binary literal from bytes.
@@ -1479,7 +1469,7 @@ impl Literal {
/// Creates a decimal literal.
pub fn decimal(decimal: i128) -> Self {
- Self::Primitive(PrimitiveLiteral::Decimal(decimal))
+ Self::Primitive(PrimitiveLiteral::Int128(decimal))
}
/// Creates decimal literal from string. See [`Decimal::from_str_exact`].
@@ -1643,22 +1633,22 @@ impl Literal {
))?)),
))),
(PrimitiveType::Date, JsonValue::String(s)) => {
- Ok(Some(Literal::Primitive(PrimitiveLiteral::Date(
+ Ok(Some(Literal::Primitive(PrimitiveLiteral::Int(
date::date_to_days(&NaiveDate::parse_from_str(&s,
"%Y-%m-%d")?),
))))
}
(PrimitiveType::Time, JsonValue::String(s)) => {
- Ok(Some(Literal::Primitive(PrimitiveLiteral::Time(
+ Ok(Some(Literal::Primitive(PrimitiveLiteral::Long(
time::time_to_microseconds(&NaiveTime::parse_from_str(&s, "%H:%M:%S%.f")?),
))))
}
(PrimitiveType::Timestamp, JsonValue::String(s)) =>
Ok(Some(Literal::Primitive(
-
PrimitiveLiteral::Timestamp(timestamp::datetime_to_microseconds(
+ PrimitiveLiteral::Long(timestamp::datetime_to_microseconds(
&NaiveDateTime::parse_from_str(&s,
"%Y-%m-%dT%H:%M:%S%.f")?,
)),
))),
(PrimitiveType::Timestamptz, JsonValue::String(s)) => {
- Ok(Some(Literal::Primitive(PrimitiveLiteral::Timestamptz(
+ Ok(Some(Literal::Primitive(PrimitiveLiteral::Long(
timestamptz::datetimetz_to_microseconds(&Utc.from_utc_datetime(
&NaiveDateTime::parse_from_str(&s,
"%Y-%m-%dT%H:%M:%S%.f+00:00")?,
)),
@@ -1668,7 +1658,7 @@ impl Literal {
Ok(Some(Literal::Primitive(PrimitiveLiteral::String(s))))
}
(PrimitiveType::Uuid, JsonValue::String(s)) =>
Ok(Some(Literal::Primitive(
- PrimitiveLiteral::Uuid(Uuid::parse_str(&s)?),
+ PrimitiveLiteral::UInt128(Uuid::parse_str(&s)?.as_u128()),
))),
(PrimitiveType::Fixed(_), JsonValue::String(_)) => todo!(),
(PrimitiveType::Binary, JsonValue::String(_)) => todo!(),
@@ -1681,7 +1671,7 @@ impl Literal {
) => {
let mut decimal = Decimal::from_str_exact(&s)?;
decimal.rescale(*scale);
- Ok(Some(Literal::Primitive(PrimitiveLiteral::Decimal(
+ Ok(Some(Literal::Primitive(PrimitiveLiteral::Int128(
decimal.mantissa(),
))))
}
@@ -1777,51 +1767,58 @@ impl Literal {
/// See [this
spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for
reference.
pub fn try_into_json(self, r#type: &Type) -> Result<JsonValue> {
match (self, r#type) {
- (Literal::Primitive(prim), _) => match prim {
- PrimitiveLiteral::Boolean(val) => Ok(JsonValue::Bool(val)),
- PrimitiveLiteral::Int(val) =>
Ok(JsonValue::Number((val).into())),
- PrimitiveLiteral::Long(val) =>
Ok(JsonValue::Number((val).into())),
- PrimitiveLiteral::Float(val) => match Number::from_f64(val.0
as f64) {
- Some(number) => Ok(JsonValue::Number(number)),
- None => Ok(JsonValue::Null),
- },
- PrimitiveLiteral::Double(val) => match Number::from_f64(val.0)
{
- Some(number) => Ok(JsonValue::Number(number)),
- None => Ok(JsonValue::Null),
- },
- PrimitiveLiteral::Date(val) => {
+ (Literal::Primitive(prim), Type::Primitive(prim_type)) => match
(prim_type, prim) {
+ (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(val)) => {
+ Ok(JsonValue::Bool(val))
+ }
+ (PrimitiveType::Int, PrimitiveLiteral::Int(val)) => {
+ Ok(JsonValue::Number((val).into()))
+ }
+ (PrimitiveType::Long, PrimitiveLiteral::Long(val)) => {
+ Ok(JsonValue::Number((val).into()))
+ }
+ (PrimitiveType::Float, PrimitiveLiteral::Float(val)) => {
+ match Number::from_f64(val.0 as f64) {
+ Some(number) => Ok(JsonValue::Number(number)),
+ None => Ok(JsonValue::Null),
+ }
+ }
+ (PrimitiveType::Double, PrimitiveLiteral::Double(val)) => {
+ match Number::from_f64(val.0) {
+ Some(number) => Ok(JsonValue::Number(number)),
+ None => Ok(JsonValue::Null),
+ }
+ }
+ (PrimitiveType::Date, PrimitiveLiteral::Int(val)) => {
Ok(JsonValue::String(date::days_to_date(val).to_string()))
}
- PrimitiveLiteral::Time(val) => Ok(JsonValue::String(
+ (PrimitiveType::Time, PrimitiveLiteral::Long(val)) =>
Ok(JsonValue::String(
time::microseconds_to_time(val).to_string(),
)),
- PrimitiveLiteral::Timestamp(val) => Ok(JsonValue::String(
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) =>
Ok(JsonValue::String(
timestamp::microseconds_to_datetime(val)
.format("%Y-%m-%dT%H:%M:%S%.f")
.to_string(),
)),
- PrimitiveLiteral::Timestamptz(val) => Ok(JsonValue::String(
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) =>
Ok(JsonValue::String(
timestamptz::microseconds_to_datetimetz(val)
.format("%Y-%m-%dT%H:%M:%S%.f+00:00")
.to_string(),
)),
- PrimitiveLiteral::String(val) =>
Ok(JsonValue::String(val.clone())),
- PrimitiveLiteral::Uuid(val) =>
Ok(JsonValue::String(val.to_string())),
- PrimitiveLiteral::Fixed(val) =>
Ok(JsonValue::String(val.iter().fold(
- String::new(),
- |mut acc, x| {
- acc.push_str(&format!("{:x}", x));
- acc
- },
- ))),
- PrimitiveLiteral::Binary(val) =>
Ok(JsonValue::String(val.iter().fold(
+ (PrimitiveType::String, PrimitiveLiteral::String(val)) => {
+ Ok(JsonValue::String(val.clone()))
+ }
+ (_, PrimitiveLiteral::UInt128(val)) => {
+ Ok(JsonValue::String(Uuid::from_u128(val).to_string()))
+ }
+ (_, PrimitiveLiteral::Binary(val)) =>
Ok(JsonValue::String(val.iter().fold(
String::new(),
|mut acc, x| {
acc.push_str(&format!("{:x}", x));
acc
},
))),
- PrimitiveLiteral::Decimal(val) => match r#type {
+ (_, PrimitiveLiteral::Int128(val)) => match r#type {
Type::Primitive(PrimitiveType::Decimal {
precision: _precision,
scale,
@@ -1834,6 +1831,10 @@ impl Literal {
"The iceberg type for decimal literal must be
decimal.",
))?,
},
+ _ => Err(Error::new(
+ ErrorKind::DataInvalid,
+ "The iceberg value doesn't fit to the iceberg type.",
+ )),
},
(Literal::Struct(s), Type::Struct(struct_type)) => {
let mut id_and_value =
Vec::with_capacity(struct_type.fields().len());
@@ -1888,15 +1889,10 @@ impl Literal {
PrimitiveLiteral::Long(any) => Box::new(any),
PrimitiveLiteral::Float(any) => Box::new(any),
PrimitiveLiteral::Double(any) => Box::new(any),
- PrimitiveLiteral::Date(any) => Box::new(any),
- PrimitiveLiteral::Time(any) => Box::new(any),
- PrimitiveLiteral::Timestamp(any) => Box::new(any),
- PrimitiveLiteral::Timestamptz(any) => Box::new(any),
- PrimitiveLiteral::Fixed(any) => Box::new(any),
PrimitiveLiteral::Binary(any) => Box::new(any),
PrimitiveLiteral::String(any) => Box::new(any),
- PrimitiveLiteral::Uuid(any) => Box::new(any),
- PrimitiveLiteral::Decimal(any) => Box::new(any),
+ PrimitiveLiteral::UInt128(any) => Box::new(any),
+ PrimitiveLiteral::Int128(any) => Box::new(any),
},
_ => unimplemented!(),
}
@@ -2197,17 +2193,12 @@ mod _serde {
super::PrimitiveLiteral::Long(v) =>
RawLiteralEnum::Long(v),
super::PrimitiveLiteral::Float(v) =>
RawLiteralEnum::Float(v.0),
super::PrimitiveLiteral::Double(v) =>
RawLiteralEnum::Double(v.0),
- super::PrimitiveLiteral::Date(v) => RawLiteralEnum::Int(v),
- super::PrimitiveLiteral::Time(v) =>
RawLiteralEnum::Long(v),
- super::PrimitiveLiteral::Timestamp(v) =>
RawLiteralEnum::Long(v),
- super::PrimitiveLiteral::Timestamptz(v) =>
RawLiteralEnum::Long(v),
super::PrimitiveLiteral::String(v) =>
RawLiteralEnum::String(v),
- super::PrimitiveLiteral::Uuid(v) => {
-
RawLiteralEnum::Bytes(ByteBuf::from(v.as_u128().to_be_bytes()))
+ super::PrimitiveLiteral::UInt128(v) => {
+ RawLiteralEnum::Bytes(ByteBuf::from(v.to_be_bytes()))
}
- super::PrimitiveLiteral::Fixed(v) =>
RawLiteralEnum::Bytes(ByteBuf::from(v)),
super::PrimitiveLiteral::Binary(v) =>
RawLiteralEnum::Bytes(ByteBuf::from(v)),
- super::PrimitiveLiteral::Decimal(v) => {
+ super::PrimitiveLiteral::Int128(v) => {
RawLiteralEnum::Bytes(ByteBuf::from(v.to_be_bytes()))
}
},
@@ -2777,7 +2768,7 @@ mod tests {
check_json_serde(
record,
- Literal::Primitive(PrimitiveLiteral::Date(17486)),
+ Literal::Primitive(PrimitiveLiteral::Int(17486)),
&Type::Primitive(PrimitiveType::Date),
);
}
@@ -2788,7 +2779,7 @@ mod tests {
check_json_serde(
record,
- Literal::Primitive(PrimitiveLiteral::Time(81068123456)),
+ Literal::Primitive(PrimitiveLiteral::Long(81068123456)),
&Type::Primitive(PrimitiveType::Time),
);
}
@@ -2799,7 +2790,7 @@ mod tests {
check_json_serde(
record,
- Literal::Primitive(PrimitiveLiteral::Timestamp(1510871468123456)),
+ Literal::Primitive(PrimitiveLiteral::Long(1510871468123456)),
&Type::Primitive(PrimitiveType::Timestamp),
);
}
@@ -2810,7 +2801,7 @@ mod tests {
check_json_serde(
record,
-
Literal::Primitive(PrimitiveLiteral::Timestamptz(1510871468123456)),
+ Literal::Primitive(PrimitiveLiteral::Long(1510871468123456)),
&Type::Primitive(PrimitiveType::Timestamptz),
);
}
@@ -2832,8 +2823,10 @@ mod tests {
check_json_serde(
record,
- Literal::Primitive(PrimitiveLiteral::Uuid(
-
Uuid::parse_str("f79c3e09-677c-4bbd-a479-3f349cb785e7").unwrap(),
+ Literal::Primitive(PrimitiveLiteral::UInt128(
+ Uuid::parse_str("f79c3e09-677c-4bbd-a479-3f349cb785e7")
+ .unwrap()
+ .as_u128(),
)),
&Type::Primitive(PrimitiveType::Uuid),
);
@@ -2845,7 +2838,7 @@ mod tests {
check_json_serde(
record,
- Literal::Primitive(PrimitiveLiteral::Decimal(1420)),
+ Literal::Primitive(PrimitiveLiteral::Int128(1420)),
&Type::decimal(28, 2).unwrap(),
);
}
@@ -3012,7 +3005,7 @@ mod tests {
#[test]
fn avro_convert_test_date() {
check_convert_with_avro(
- Literal::Primitive(PrimitiveLiteral::Date(17486)),
+ Literal::Primitive(PrimitiveLiteral::Int(17486)),
&Type::Primitive(PrimitiveType::Date),
);
}
@@ -3020,7 +3013,7 @@ mod tests {
#[test]
fn avro_convert_test_time() {
check_convert_with_avro(
- Literal::Primitive(PrimitiveLiteral::Time(81068123456)),
+ Literal::Primitive(PrimitiveLiteral::Long(81068123456)),
&Type::Primitive(PrimitiveType::Time),
);
}
@@ -3028,7 +3021,7 @@ mod tests {
#[test]
fn avro_convert_test_timestamp() {
check_convert_with_avro(
- Literal::Primitive(PrimitiveLiteral::Timestamp(1510871468123456)),
+ Literal::Primitive(PrimitiveLiteral::Long(1510871468123456)),
&Type::Primitive(PrimitiveType::Timestamp),
);
}
@@ -3036,7 +3029,7 @@ mod tests {
#[test]
fn avro_convert_test_timestamptz() {
check_convert_with_avro(
-
Literal::Primitive(PrimitiveLiteral::Timestamptz(1510871468123456)),
+ Literal::Primitive(PrimitiveLiteral::Long(1510871468123456)),
&Type::Primitive(PrimitiveType::Timestamptz),
);
}
diff --git a/crates/iceberg/src/transform/bucket.rs
b/crates/iceberg/src/transform/bucket.rs
index e19e5b8..83cbbd8 100644
--- a/crates/iceberg/src/transform/bucket.rs
+++ b/crates/iceberg/src/transform/bucket.rs
@@ -21,7 +21,7 @@ use arrow_array::ArrayRef;
use arrow_schema::{DataType, TimeUnit};
use super::TransformFunction;
-use crate::spec::{Datum, PrimitiveLiteral};
+use crate::spec::{Datum, PrimitiveLiteral, PrimitiveType};
#[derive(Debug)]
pub struct Bucket {
@@ -221,17 +221,19 @@ impl TransformFunction for Bucket {
}
fn transform_literal(&self, input: &Datum) -> crate::Result<Option<Datum>>
{
- let val = match input.literal() {
- PrimitiveLiteral::Int(v) => self.bucket_int(*v),
- PrimitiveLiteral::Long(v) => self.bucket_long(*v),
- PrimitiveLiteral::Decimal(v) => self.bucket_decimal(*v),
- PrimitiveLiteral::Date(v) => self.bucket_date(*v),
- PrimitiveLiteral::Time(v) => self.bucket_time(*v),
- PrimitiveLiteral::Timestamp(v) => self.bucket_timestamp(*v),
- PrimitiveLiteral::String(v) => self.bucket_str(v.as_str()),
- PrimitiveLiteral::Uuid(v) => self.bucket_bytes(v.as_ref()),
- PrimitiveLiteral::Binary(v) => self.bucket_bytes(v.as_ref()),
- PrimitiveLiteral::Fixed(v) => self.bucket_bytes(v.as_ref()),
+ let val = match (input.data_type(), input.literal()) {
+ (PrimitiveType::Int, PrimitiveLiteral::Int(v)) =>
self.bucket_int(*v),
+ (PrimitiveType::Long, PrimitiveLiteral::Long(v)) =>
self.bucket_long(*v),
+ (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Int128(v)) =>
self.bucket_decimal(*v),
+ (PrimitiveType::Date, PrimitiveLiteral::Int(v)) =>
self.bucket_date(*v),
+ (PrimitiveType::Time, PrimitiveLiteral::Long(v)) =>
self.bucket_time(*v),
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) =>
self.bucket_timestamp(*v),
+ (PrimitiveType::String, PrimitiveLiteral::String(v)) =>
self.bucket_str(v.as_str()),
+ (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(v)) => {
+ self.bucket_bytes(uuid::Uuid::from_u128(*v).as_ref())
+ }
+ (PrimitiveType::Binary, PrimitiveLiteral::Binary(v)) =>
self.bucket_bytes(v.as_ref()),
+ (PrimitiveType::Fixed(_), PrimitiveLiteral::Binary(v)) =>
self.bucket_bytes(v.as_ref()),
_ => {
return Err(crate::Error::new(
crate::ErrorKind::FeatureUnsupported,
@@ -561,7 +563,7 @@ mod test {
Datum::decimal_from_str(curr)?,
Datum::decimal_from_str(prev)?,
]),
- Some("name IN (6, 2)"),
+ Some("name IN (2, 6)"),
)?;
fixture.assert_projection(
diff --git a/crates/iceberg/src/transform/temporal.rs
b/crates/iceberg/src/transform/temporal.rs
index 44e96af..72506a7 100644
--- a/crates/iceberg/src/transform/temporal.rs
+++ b/crates/iceberg/src/transform/temporal.rs
@@ -25,7 +25,7 @@ use arrow_schema::{DataType, TimeUnit};
use chrono::{DateTime, Datelike, Duration};
use super::TransformFunction;
-use crate::spec::{Datum, PrimitiveLiteral};
+use crate::spec::{Datum, PrimitiveLiteral, PrimitiveType};
use crate::{Error, ErrorKind, Result};
/// Hour in one second.
@@ -68,10 +68,12 @@ impl TransformFunction for Year {
}
fn transform_literal(&self, input: &crate::spec::Datum) ->
Result<Option<crate::spec::Datum>> {
- let val = match input.literal() {
- PrimitiveLiteral::Date(v) => Date32Type::to_naive_date(*v).year()
- UNIX_EPOCH_YEAR,
- PrimitiveLiteral::Timestamp(v) => Self::timestamp_to_year(*v)?,
- PrimitiveLiteral::Timestamptz(v) => Self::timestamp_to_year(*v)?,
+ let val = match (input.data_type(), input.literal()) {
+ (PrimitiveType::Date, PrimitiveLiteral::Int(v)) => {
+ Date32Type::to_naive_date(*v).year() - UNIX_EPOCH_YEAR
+ }
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) =>
Self::timestamp_to_year(*v)?,
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(v)) =>
Self::timestamp_to_year(*v)?,
_ => {
return Err(crate::Error::new(
crate::ErrorKind::FeatureUnsupported,
@@ -137,13 +139,15 @@ impl TransformFunction for Month {
}
fn transform_literal(&self, input: &crate::spec::Datum) ->
Result<Option<crate::spec::Datum>> {
- let val = match input.literal() {
- PrimitiveLiteral::Date(v) => {
+ let val = match (input.data_type(), input.literal()) {
+ (PrimitiveType::Date, PrimitiveLiteral::Int(v)) => {
(Date32Type::to_naive_date(*v).year() - UNIX_EPOCH_YEAR) * 12
+ Date32Type::to_naive_date(*v).month0() as i32
}
- PrimitiveLiteral::Timestamp(v) => Self::timestamp_to_month(*v)?,
- PrimitiveLiteral::Timestamptz(v) => Self::timestamp_to_month(*v)?,
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) =>
Self::timestamp_to_month(*v)?,
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(v)) => {
+ Self::timestamp_to_month(*v)?
+ }
_ => {
return Err(crate::Error::new(
crate::ErrorKind::FeatureUnsupported,
@@ -221,10 +225,12 @@ impl TransformFunction for Day {
}
fn transform_literal(&self, input: &crate::spec::Datum) ->
Result<Option<crate::spec::Datum>> {
- let val = match input.literal() {
- PrimitiveLiteral::Date(v) => *v,
- PrimitiveLiteral::Timestamp(v) => Self::day_timestamp_micro(*v)?,
- PrimitiveLiteral::Timestamptz(v) => Self::day_timestamp_micro(*v)?,
+ let val = match (input.data_type(), input.literal()) {
+ (PrimitiveType::Date, PrimitiveLiteral::Int(v)) => *v,
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) =>
Self::day_timestamp_micro(*v)?,
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(v)) => {
+ Self::day_timestamp_micro(*v)?
+ }
_ => {
return Err(crate::Error::new(
crate::ErrorKind::FeatureUnsupported,
@@ -272,9 +278,11 @@ impl TransformFunction for Hour {
}
fn transform_literal(&self, input: &crate::spec::Datum) ->
Result<Option<crate::spec::Datum>> {
- let val = match input.literal() {
- PrimitiveLiteral::Timestamp(v) => Self::hour_timestamp_micro(*v),
- PrimitiveLiteral::Timestamptz(v) => Self::hour_timestamp_micro(*v),
+ let val = match (input.data_type(), input.literal()) {
+ (PrimitiveType::Timestamp, PrimitiveLiteral::Long(v)) =>
Self::hour_timestamp_micro(*v),
+ (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(v)) => {
+ Self::hour_timestamp_micro(*v)
+ }
_ => {
return Err(crate::Error::new(
crate::ErrorKind::FeatureUnsupported,
@@ -641,7 +649,7 @@ mod test {
Datum::timestamp_from_str(value)?,
Datum::timestamp_from_str(another)?,
]),
- Some("name IN (420034, 411288)"),
+ Some("name IN (411288, 420034)"),
)?;
fixture.assert_projection(
@@ -1294,7 +1302,7 @@ mod test {
Datum::timestamp_from_str(value)?,
Datum::timestamp_from_str(another)?,
]),
- Some("name IN (-363, -364, -365)"),
+ Some("name IN (-363, -365, -364)"),
)?;
fixture.assert_projection(
diff --git a/crates/iceberg/src/transform/truncate.rs
b/crates/iceberg/src/transform/truncate.rs
index 04fe844..cba5409 100644
--- a/crates/iceberg/src/transform/truncate.rs
+++ b/crates/iceberg/src/transform/truncate.rs
@@ -144,7 +144,7 @@ impl TransformFunction for Truncate {
let width = self.width as i64;
Datum::long(Self::truncate_i64(*v, width))
})),
- PrimitiveLiteral::Decimal(v) => Ok(Some({
+ PrimitiveLiteral::Int128(v) => Ok(Some({
let width = self.width as i128;
Datum::decimal(Self::truncate_decimal_i128(*v, width))?
})),
@@ -378,7 +378,7 @@ mod test {
Datum::decimal_from_str(curr)?,
Datum::decimal_from_str(next)?,
]),
- Some("name IN (10090, 9990, 9890)"),
+ Some("name IN (9890, 9990, 10090)"),
)?;
fixture.assert_projection(
@@ -448,7 +448,7 @@ mod test {
Datum::decimal_from_str(curr)?,
Datum::decimal_from_str(next)?,
]),
- Some("name IN (9900, 10000, 10100)"),
+ Some("name IN (10000, 10100, 9900)"),
)?;
fixture.assert_projection(
diff --git a/crates/iceberg/src/writer/file_writer/parquet_writer.rs
b/crates/iceberg/src/writer/file_writer/parquet_writer.rs
index ef21f9d..d41714b 100644
--- a/crates/iceberg/src/writer/file_writer/parquet_writer.rs
+++ b/crates/iceberg/src/writer/file_writer/parquet_writer.rs
@@ -347,9 +347,7 @@ impl MinMaxColAggregator {
let convert_func = |v: ByteArray| -> Result<Datum> {
Result::<Datum>::Ok(Datum::new(
ty.clone(),
- PrimitiveLiteral::Decimal(i128::from_le_bytes(
- v.data().try_into().unwrap(),
- )),
+
PrimitiveLiteral::Int128(i128::from_le_bytes(v.data().try_into().unwrap())),
))
};
self.update_state::<ByteArrayType>(field_id, &stat,
convert_func)
@@ -364,7 +362,7 @@ impl MinMaxColAggregator {
let convert_func = |v: i32| {
Result::<Datum>::Ok(Datum::new(
ty.clone(),
- PrimitiveLiteral::Decimal(i128::from(v)),
+ PrimitiveLiteral::Int128(i128::from(v)),
))
};
self.update_state::<Int32Type>(field_id, &stat, convert_func)
@@ -379,7 +377,7 @@ impl MinMaxColAggregator {
let convert_func = |v: i64| {
Result::<Datum>::Ok(Datum::new(
ty.clone(),
- PrimitiveLiteral::Decimal(i128::from(v)),
+ PrimitiveLiteral::Int128(i128::from(v)),
))
};
self.update_state::<Int64Type>(field_id, &stat, convert_func)
@@ -1180,7 +1178,7 @@ mod tests {
precision: 10,
scale: 5
},
- PrimitiveLiteral::Decimal(1)
+ PrimitiveLiteral::Int128(1)
)
),
(12, Datum::uuid(Uuid::from_u128(0))),
@@ -1210,7 +1208,7 @@ mod tests {
precision: 10,
scale: 5
},
- PrimitiveLiteral::Decimal(100)
+ PrimitiveLiteral::Int128(100)
)
),
(12, Datum::uuid(Uuid::from_u128(3))),