|
45 | 45 | IntegerType, |
46 | 46 | LongType, |
47 | 47 | StringType, |
| 48 | + TimestampNanoType, |
48 | 49 | TimestampType, |
| 50 | + TimestamptzNanoType, |
49 | 51 | TimestamptzType, |
50 | 52 | TimeType, |
51 | 53 | UUIDType, |
|
57 | 59 | days_to_date, |
58 | 60 | micros_to_days, |
59 | 61 | micros_to_timestamp, |
| 62 | + nanos_to_days, |
| 63 | + nanos_to_micros, |
60 | 64 | time_str_to_micros, |
61 | 65 | time_to_micros, |
62 | 66 | timestamp_to_micros, |
| 67 | + timestamp_to_nanos, |
63 | 68 | timestamptz_to_micros, |
| 69 | + timestamptz_to_nanos, |
| 70 | + to_human_timestamp_ns, |
64 | 71 | ) |
65 | 72 | from pyiceberg.utils.decimal import decimal_to_unscaled, unscaled_to_decimal |
66 | 73 | from pyiceberg.utils.singleton import Singleton |
@@ -332,6 +339,14 @@ def _(self, _: TimestampType) -> Literal[int]: |
332 | 339 | def _(self, _: TimestamptzType) -> Literal[int]: |
333 | 340 | return TimestampLiteral(self.value) |
334 | 341 |
|
| 342 | + @to.register(TimestampNanoType) |
| 343 | + def _(self, _: TimestampNanoType) -> Literal[int]: |
| 344 | + return TimestampNanoLiteral(self.value) |
| 345 | + |
| 346 | + @to.register(TimestamptzNanoType) |
| 347 | + def _(self, _: TimestamptzNanoType) -> Literal[int]: |
| 348 | + return TimestampNanoLiteral(self.value) |
| 349 | + |
335 | 350 | @to.register(DecimalType) |
336 | 351 | def _(self, type_var: DecimalType) -> Literal[Decimal]: |
337 | 352 | unscaled = Decimal(self.value) |
@@ -476,11 +491,58 @@ def _(self, _: TimestampType) -> Literal[int]: |
476 | 491 | def _(self, _: TimestamptzType) -> Literal[int]: |
477 | 492 | return self |
478 | 493 |
|
| 494 | + @to.register(TimestampNanoType) |
| 495 | + def _(self, _: TimestampNanoType) -> Literal[int]: |
| 496 | + return TimestampNanoLiteral(self.value * 1000) |
| 497 | + |
| 498 | + @to.register(TimestamptzNanoType) |
| 499 | + def _(self, _: TimestamptzNanoType) -> Literal[int]: |
| 500 | + return TimestampNanoLiteral(self.value * 1000) |
| 501 | + |
479 | 502 | @to.register(DateType) |
480 | 503 | def _(self, _: DateType) -> Literal[int]: |
481 | 504 | return DateLiteral(micros_to_days(self.value)) |
482 | 505 |
|
483 | 506 |
|
| 507 | +class TimestampNanoLiteral(Literal[int]): |
| 508 | + def __init__(self, value: int) -> None: |
| 509 | + super().__init__(value, int) |
| 510 | + |
| 511 | + @model_serializer |
| 512 | + def ser_model(self) -> str: |
| 513 | + return to_human_timestamp_ns(self.root) |
| 514 | + |
| 515 | + def increment(self) -> Literal[int]: |
| 516 | + return TimestampNanoLiteral(self.value + 1) |
| 517 | + |
| 518 | + def decrement(self) -> Literal[int]: |
| 519 | + return TimestampNanoLiteral(self.value - 1) |
| 520 | + |
| 521 | + @singledispatchmethod |
| 522 | + def to(self, type_var: IcebergType) -> Literal: # type: ignore |
| 523 | + raise TypeError(f"Cannot convert TimestampNanoLiteral into {type_var}") |
| 524 | + |
| 525 | + @to.register(TimestampNanoType) |
| 526 | + def _(self, _: TimestampNanoType) -> Literal[int]: |
| 527 | + return self |
| 528 | + |
| 529 | + @to.register(TimestamptzNanoType) |
| 530 | + def _(self, _: TimestamptzNanoType) -> Literal[int]: |
| 531 | + return self |
| 532 | + |
| 533 | + @to.register(TimestampType) |
| 534 | + def _(self, _: TimestampType) -> Literal[int]: |
| 535 | + return TimestampLiteral(nanos_to_micros(self.value)) |
| 536 | + |
| 537 | + @to.register(TimestamptzType) |
| 538 | + def _(self, _: TimestamptzType) -> Literal[int]: |
| 539 | + return TimestampLiteral(nanos_to_micros(self.value)) |
| 540 | + |
| 541 | + @to.register(DateType) |
| 542 | + def _(self, _: DateType) -> Literal[int]: |
| 543 | + return DateLiteral(nanos_to_days(self.value)) |
| 544 | + |
| 545 | + |
484 | 546 | class DecimalLiteral(Literal[Decimal]): |
485 | 547 | def __init__(self, value: Decimal) -> None: |
486 | 548 | super().__init__(value, Decimal) |
@@ -600,6 +662,14 @@ def _(self, _: TimestampType) -> Literal[int]: |
600 | 662 | def _(self, _: TimestamptzType) -> Literal[int]: |
601 | 663 | return TimestampLiteral(timestamptz_to_micros(self.value)) |
602 | 664 |
|
| 665 | + @to.register(TimestampNanoType) |
| 666 | + def _(self, _: TimestampNanoType) -> Literal[int]: |
| 667 | + return TimestampNanoLiteral(timestamp_to_nanos(self.value)) |
| 668 | + |
| 669 | + @to.register(TimestamptzNanoType) |
| 670 | + def _(self, _: TimestamptzNanoType) -> Literal[int]: |
| 671 | + return TimestampNanoLiteral(timestamptz_to_nanos(self.value)) |
| 672 | + |
603 | 673 | @to.register(UUIDType) |
604 | 674 | def _(self, _: UUIDType) -> Literal[bytes]: |
605 | 675 | return UUIDLiteral(UUID(self.value).bytes) |
|
0 commit comments