From 216f307170f69438417d9753e29dca8ecba06420 Mon Sep 17 00:00:00 2001 From: Rok Date: Thu, 13 Jan 2022 01:29:18 +0100 Subject: [PATCH 1/3] SubtractTimestampAndDuration --- .../compute/kernels/scalar_temporal_test.cc | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc b/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc index 410ea6132fe..93ae57fa9ad 100644 --- a/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc +++ b/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc @@ -1030,6 +1030,38 @@ TEST_F(ScalarTemporalTest, TestTemporalSubtractDateAndDurationChecked) { CheckScalarBinary(op, dates64, durations_us, timestamps_us); } +TEST_F(ScalarTemporalTest, TestTemporalSubtractTimestampAndDuration) { + std::string op = "subtract"; + for (auto tz : {"", "UTC", "Pacific/Marquesas"}) { + auto timestamp_unit_s = timestamp(TimeUnit::SECOND, tz); + auto duration_unit_s = duration(TimeUnit::SECOND); + auto timestamp_unit_ms = timestamp(TimeUnit::MILLI, tz); + auto duration_unit_ms = duration(TimeUnit::MILLI); + auto timestamp_unit_us = timestamp(TimeUnit::MICRO, tz); + auto duration_unit_us = duration(TimeUnit::MICRO); + auto timestamp_unit_ns = timestamp(TimeUnit::NANO, tz); + auto duration_unit_ns = duration(TimeUnit::NANO); + + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_s, times_seconds_precision2), + ArrayFromJSON(duration_unit_s, seconds_between), + ArrayFromJSON(timestamp_unit_s, times_seconds_precision)); + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_ms, times_seconds_precision2), + ArrayFromJSON(duration_unit_ms, milliseconds_between), + ArrayFromJSON(timestamp_unit_ms, times_seconds_precision)); + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_us, times_seconds_precision2), + ArrayFromJSON(duration_unit_us, microseconds_between), + ArrayFromJSON(timestamp_unit_us, times_seconds_precision)); + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_ns, times_seconds_precision2), + ArrayFromJSON(duration_unit_ns, nanoseconds_between), + ArrayFromJSON(timestamp_unit_ns, times_seconds_precision)); + + EXPECT_RAISES_WITH_MESSAGE_THAT( + NotImplemented, testing::HasSubstr("no kernel matching input types"), + Subtract(ArrayFromJSON(timestamp_unit_s, times_seconds_precision2), + ArrayFromJSON(duration_unit_ms, milliseconds_between))); + } +} + TEST_F(ScalarTemporalTest, TestTemporalDifferenceWeeks) { auto raw_days = ArrayFromJSON(timestamp(TimeUnit::SECOND), R"([ "2021-08-09", "2021-08-10", "2021-08-11", "2021-08-12", "2021-08-13", "2021-08-14", "2021-08-15", From 7d5d86543dba7ebf0b33c6ae2ae46a5f7de4967e Mon Sep 17 00:00:00 2001 From: Rok Date: Wed, 19 Jan 2022 16:29:49 +0100 Subject: [PATCH 2/3] Add ReplaceTemporalTypes --- .../compute/kernels/scalar_temporal_test.cc | 50 +++++++++++++++++-- docs/source/cpp/compute.rst | 4 +- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc b/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc index 93ae57fa9ad..08fac56e440 100644 --- a/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc +++ b/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc @@ -1054,12 +1054,54 @@ TEST_F(ScalarTemporalTest, TestTemporalSubtractTimestampAndDuration) { CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_ns, times_seconds_precision2), ArrayFromJSON(duration_unit_ns, nanoseconds_between), ArrayFromJSON(timestamp_unit_ns, times_seconds_precision)); + } - EXPECT_RAISES_WITH_MESSAGE_THAT( - NotImplemented, testing::HasSubstr("no kernel matching input types"), - Subtract(ArrayFromJSON(timestamp_unit_s, times_seconds_precision2), - ArrayFromJSON(duration_unit_ms, milliseconds_between))); + auto seconds_3 = ArrayFromJSON(timestamp(TimeUnit::SECOND), R"([3, null])"); + auto milliseconds_2k = ArrayFromJSON(duration(TimeUnit::MILLI), R"([2000, null])"); + auto milliseconds_1k = ArrayFromJSON(timestamp(TimeUnit::MILLI), R"([1000, null])"); + CheckScalarBinary(op, seconds_3, milliseconds_2k, milliseconds_1k); + + auto seconds_3_tz = ArrayFromJSON(timestamp(TimeUnit::SECOND, "UTC"), R"([3, null])"); + auto milliseconds_1k_tz = + ArrayFromJSON(timestamp(TimeUnit::MILLI, "UTC"), R"([1000, null])"); + CheckScalarBinary(op, seconds_3, milliseconds_2k, milliseconds_1k); +} + +TEST_F(ScalarTemporalTest, TestTemporalSubtractCheckedTimestampAndDuration) { + std::string op = "subtract_checked"; + for (auto tz : {"", "UTC", "Pacific/Marquesas"}) { + auto timestamp_unit_s = timestamp(TimeUnit::SECOND, tz); + auto duration_unit_s = duration(TimeUnit::SECOND); + auto timestamp_unit_ms = timestamp(TimeUnit::MILLI, tz); + auto duration_unit_ms = duration(TimeUnit::MILLI); + auto timestamp_unit_us = timestamp(TimeUnit::MICRO, tz); + auto duration_unit_us = duration(TimeUnit::MICRO); + auto timestamp_unit_ns = timestamp(TimeUnit::NANO, tz); + auto duration_unit_ns = duration(TimeUnit::NANO); + + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_s, times_seconds_precision2), + ArrayFromJSON(duration_unit_s, seconds_between), + ArrayFromJSON(timestamp_unit_s, times_seconds_precision)); + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_ms, times_seconds_precision2), + ArrayFromJSON(duration_unit_ms, milliseconds_between), + ArrayFromJSON(timestamp_unit_ms, times_seconds_precision)); + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_us, times_seconds_precision2), + ArrayFromJSON(duration_unit_us, microseconds_between), + ArrayFromJSON(timestamp_unit_us, times_seconds_precision)); + CheckScalarBinary(op, ArrayFromJSON(timestamp_unit_ns, times_seconds_precision2), + ArrayFromJSON(duration_unit_ns, nanoseconds_between), + ArrayFromJSON(timestamp_unit_ns, times_seconds_precision)); } + + auto seconds_3 = ArrayFromJSON(timestamp(TimeUnit::SECOND), R"([3, null])"); + auto milliseconds_2k = ArrayFromJSON(duration(TimeUnit::MILLI), R"([2000, null])"); + auto milliseconds_1k = ArrayFromJSON(timestamp(TimeUnit::MILLI), R"([1000, null])"); + CheckScalarBinary(op, seconds_3, milliseconds_2k, milliseconds_1k); + + auto seconds_3_tz = ArrayFromJSON(timestamp(TimeUnit::SECOND, "UTC"), R"([3, null])"); + auto milliseconds_1k_tz = + ArrayFromJSON(timestamp(TimeUnit::MILLI, "UTC"), R"([1000, null])"); + CheckScalarBinary(op, seconds_3, milliseconds_2k, milliseconds_1k); } TEST_F(ScalarTemporalTest, TestTemporalDifferenceWeeks) { diff --git a/docs/source/cpp/compute.rst b/docs/source/cpp/compute.rst index 4173fbbfdee..a888cdf8d58 100644 --- a/docs/source/cpp/compute.rst +++ b/docs/source/cpp/compute.rst @@ -450,9 +450,9 @@ Mixed time resolution temporal inputs will be cast to finest input resolution. +------------------+--------+----------------------------+----------------------------+-------+ | sign | Unary | Numeric | Int8/Float32/Float64 | \(2) | +------------------+--------+----------------------------+----------------------------+-------+ -| subtract | Binary | Numeric/Date/Duration | Numeric/Date/Duration | \(1) | +| subtract | Binary | Numeric/Timestamp/Duration | Numeric/Timestamp/Duration | \(1) | +------------------+--------+----------------------------+----------------------------+-------+ -| subtract_checked | Binary | Numeric/Date/Duration | Numeric/Date/Duration | \(1) | +| subtract_checked | Binary | Numeric/Timestamp/Duration | Numeric/Timestamp/Duration | \(1) | +------------------+--------+----------------------------+----------------------------+-------+ * \(1) Precision and scale of computed DECIMAL results From 2c3614e0d5693b38bfefa7873d7bef245c859e49 Mon Sep 17 00:00:00 2001 From: Rok Date: Fri, 28 Jan 2022 15:52:23 +0100 Subject: [PATCH 3/3] Review feedback --- cpp/src/arrow/compute/kernels/scalar_temporal_test.cc | 4 ++-- docs/source/cpp/compute.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc b/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc index 08fac56e440..271254dbcc7 100644 --- a/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc +++ b/cpp/src/arrow/compute/kernels/scalar_temporal_test.cc @@ -1064,7 +1064,7 @@ TEST_F(ScalarTemporalTest, TestTemporalSubtractTimestampAndDuration) { auto seconds_3_tz = ArrayFromJSON(timestamp(TimeUnit::SECOND, "UTC"), R"([3, null])"); auto milliseconds_1k_tz = ArrayFromJSON(timestamp(TimeUnit::MILLI, "UTC"), R"([1000, null])"); - CheckScalarBinary(op, seconds_3, milliseconds_2k, milliseconds_1k); + CheckScalarBinary(op, seconds_3_tz, milliseconds_2k, milliseconds_1k_tz); } TEST_F(ScalarTemporalTest, TestTemporalSubtractCheckedTimestampAndDuration) { @@ -1101,7 +1101,7 @@ TEST_F(ScalarTemporalTest, TestTemporalSubtractCheckedTimestampAndDuration) { auto seconds_3_tz = ArrayFromJSON(timestamp(TimeUnit::SECOND, "UTC"), R"([3, null])"); auto milliseconds_1k_tz = ArrayFromJSON(timestamp(TimeUnit::MILLI, "UTC"), R"([1000, null])"); - CheckScalarBinary(op, seconds_3, milliseconds_2k, milliseconds_1k); + CheckScalarBinary(op, seconds_3_tz, milliseconds_2k, milliseconds_1k_tz); } TEST_F(ScalarTemporalTest, TestTemporalDifferenceWeeks) { diff --git a/docs/source/cpp/compute.rst b/docs/source/cpp/compute.rst index a888cdf8d58..6930c01da02 100644 --- a/docs/source/cpp/compute.rst +++ b/docs/source/cpp/compute.rst @@ -450,9 +450,9 @@ Mixed time resolution temporal inputs will be cast to finest input resolution. +------------------+--------+----------------------------+----------------------------+-------+ | sign | Unary | Numeric | Int8/Float32/Float64 | \(2) | +------------------+--------+----------------------------+----------------------------+-------+ -| subtract | Binary | Numeric/Timestamp/Duration | Numeric/Timestamp/Duration | \(1) | +| subtract | Binary | Numeric/Temporal | Numeric/Temporal | \(1) | +------------------+--------+----------------------------+----------------------------+-------+ -| subtract_checked | Binary | Numeric/Timestamp/Duration | Numeric/Timestamp/Duration | \(1) | +| subtract_checked | Binary | Numeric/Temporal | Numeric/Temporal | \(1) | +------------------+--------+----------------------------+----------------------------+-------+ * \(1) Precision and scale of computed DECIMAL results