MCPcopy Create free account
hub / github.com/apache/paimon-rust / datum_to_vortex_lit

Function datum_to_vortex_lit

crates/paimon/src/arrow/format/vortex.rs:346–428  ·  view source on GitHub ↗

Convert a Paimon `Datum` to a Vortex literal `Expression`. Returns `None` for types not yet supported by this conversion.

(datum: &Datum, file_field: &DataField)

Source from the content-addressed store, hash-verified

344/// Convert a Paimon `Datum` to a Vortex literal `Expression`.
345/// Returns `None` for types not yet supported by this conversion.
346fn datum_to_vortex_lit(datum: &Datum, file_field: &DataField) -> Option<Expression> {
347 use crate::spec::DataType as PaimonDataType;
348 use vortex::array::dtype::Nullability;
349 use vortex::array::scalar::{PValue, Scalar, ScalarValue};
350 match datum {
351 Datum::Bool(v) => Some(lit(*v)),
352 Datum::TinyInt(v) => Some(lit(*v)),
353 Datum::SmallInt(v) => Some(lit(*v)),
354 Datum::Int(v) => Some(lit(*v)),
355 Datum::Long(v) => Some(lit(*v)),
356 Datum::Float(v) => Some(lit(*v)),
357 Datum::Double(v) => Some(lit(*v)),
358 Datum::String(v) => Some(lit(v.as_str())),
359 Datum::Bytes(v) => Some(lit(v.as_slice())),
360 // Date: stored as days since epoch (i32) in both Paimon and Vortex.
361 Datum::Date(v) => {
362 use vortex::extension::datetime::{Date, TimeUnit};
363 let dtype =
364 DType::Extension(Date::new(TimeUnit::Days, Nullability::NonNullable).erased());
365 let scalar =
366 Scalar::try_new(dtype, Some(ScalarValue::Primitive(PValue::I32(*v)))).ok()?;
367 Some(lit(scalar))
368 }
369 // Time: stored as milliseconds since midnight (i32) in Paimon.
370 Datum::Time(v) => {
371 use vortex::extension::datetime::{Time, TimeUnit};
372 let dtype = DType::Extension(
373 Time::new(TimeUnit::Milliseconds, Nullability::NonNullable).erased(),
374 );
375 let scalar =
376 Scalar::try_new(dtype, Some(ScalarValue::Primitive(PValue::I32(*v)))).ok()?;
377 Some(lit(scalar))
378 }
379 // Timestamp: convert (millis, nanos) to the unit matching the field precision.
380 // precision 0-3 → milliseconds, 4-6 → microseconds, 7-9 → nanoseconds.
381 Datum::Timestamp { millis, nanos } => {
382 use vortex::extension::datetime::Timestamp;
383 let precision = match file_field.data_type() {
384 PaimonDataType::Timestamp(ts) => ts.precision(),
385 _ => return None,
386 };
387 let (time_unit, value) = precision_to_time_unit_and_value(*millis, *nanos, precision);
388 let dtype =
389 DType::Extension(Timestamp::new(time_unit, Nullability::NonNullable).erased());
390 let scalar =
391 Scalar::try_new(dtype, Some(ScalarValue::Primitive(PValue::I64(value)))).ok()?;
392 Some(lit(scalar))
393 }
394 Datum::LocalZonedTimestamp { millis, nanos } => {
395 use vortex::extension::datetime::Timestamp;
396 let precision = match file_field.data_type() {
397 PaimonDataType::LocalZonedTimestamp(ts) => ts.precision(),
398 _ => return None,
399 };
400 let (time_unit, value) = precision_to_time_unit_and_value(*millis, *nanos, precision);
401 let dtype = DType::Extension(
402 Timestamp::new_with_tz(time_unit, Some(Arc::from("UTC")), Nullability::NonNullable)
403 .erased(),

Callers 1

leaf_to_vortex_exprFunction · 0.85

Calls 4

DecimalStruct · 0.85
data_typeMethod · 0.80
precisionMethod · 0.80

Tested by

no test coverage detected