ClickHouse-Encoder
view release on metacpan or search on metacpan
t/coerce-datetimes.t view on Meta::CPAN
#!/usr/bin/env perl
# coerce_datetimes: post-process a decoded block to rewrite Date /
# Date32 / DateTime / DateTime64 columns from raw epoch integers into
# ISO 8601 strings or Time::Moment instances.
use strict;
use warnings;
use Test::More;
use lib 'blib/lib', 'blib/arch';
use ClickHouse::Encoder;
# Encode a block with one of every time-column type, decode it, and
# coerce. 1700000000 = 2023-11-14 22:13:20 UTC; 19675 days since
# epoch = 2023-11-14 (Date column equivalent).
my @rows = (
['2023-11-14', '2023-11-14',
1700000000,
'1700000000.123456',
],
['1970-01-01', '1969-12-31',
0,
'0',
],
);
my $enc = ClickHouse::Encoder->new(columns => [
['d', 'Date'],
['d32', 'Date32'],
['dt', 'DateTime'],
['dt64','DateTime64(6)'],
]);
my $bytes = $enc->encode(\@rows);
# Without coercion: integer epochs
{
my $blk = ClickHouse::Encoder->decode_block($bytes);
is($blk->{columns}[0]{values}[0], 19675, 'Date raw value (days)');
is($blk->{columns}[2]{values}[0], 1700000000, 'DateTime raw value (epoch s)');
cmp_ok($blk->{columns}[3]{values}[0], '==', 1700000000123456,
'DateTime64(6) raw value (ticks)');
}
# Coerce to ISO 8601 strings (default)
{
my $blk = ClickHouse::Encoder->decode_block($bytes);
ClickHouse::Encoder->coerce_datetimes($blk);
is($blk->{columns}[0]{values}[0], '2023-11-14',
'Date -> "YYYY-MM-DD"');
is($blk->{columns}[0]{values}[1], '1970-01-01',
'Date epoch=0 -> "1970-01-01"');
is($blk->{columns}[1]{values}[0], '2023-11-14',
'Date32 -> "YYYY-MM-DD"');
is($blk->{columns}[1]{values}[1], '1969-12-31',
'Date32 pre-epoch -> "1969-12-31"');
is($blk->{columns}[2]{values}[0], '2023-11-14T22:13:20Z',
'DateTime -> ISO UTC with Z suffix');
is($blk->{columns}[2]{values}[1], '1970-01-01T00:00:00Z',
'DateTime epoch=0 -> "1970-01-01T00:00:00Z"');
is($blk->{columns}[3]{values}[0], '2023-11-14T22:13:20.123456Z',
'DateTime64(6) -> 6 fractional digits');
}
# Coerce to Time::Moment (optional)
( run in 0.885 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )