Skip to content

Commit

Permalink
Simplify PrimitiveLiteral (#502)
Browse files Browse the repository at this point in the history
* simplify PrimitiveLiteral

* fix test

---------

Co-authored-by: ZENOTME <[email protected]>
  • Loading branch information
ZENOTME and ZENOTME authored Aug 13, 2024
1 parent bbbea97 commit 07b7744
Show file tree
Hide file tree
Showing 7 changed files with 239 additions and 237 deletions.
101 changes: 48 additions & 53 deletions crates/iceberg/src/spec/datatypes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(_))
)
}
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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));
}
}
}
36 changes: 21 additions & 15 deletions crates/iceberg/src/spec/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
};
Expand Down
Loading

0 comments on commit 07b7744

Please sign in to comment.