From 012be07251668981a3a827722b008d7ed04cd56d Mon Sep 17 00:00:00 2001 From: Will Ayd Date: Mon, 31 Jul 2023 08:41:12 -0400 Subject: [PATCH] feedback --- src/nanoarrow/array_inline.h | 18 +++++++++--------- src/nanoarrow/array_test.cc | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/nanoarrow/array_inline.h b/src/nanoarrow/array_inline.h index 24c2647bb..cfc0374ea 100644 --- a/src/nanoarrow/array_inline.h +++ b/src/nanoarrow/array_inline.h @@ -933,21 +933,21 @@ static inline void ArrowArrayViewGetIntervalUnsafe(struct ArrowArrayView* array_ const uint8_t* data_view = array_view->buffer_views[1].data.as_uint8; switch (array_view->storage_type) { case NANOARROW_TYPE_INTERVAL_MONTHS: { - const size_t size = 4; - memcpy(&out->months, data_view + i * size, 4); + const size_t size = sizeof(int32_t); + memcpy(&out->months, data_view + i * size, sizeof(int32_t)); break; } case NANOARROW_TYPE_INTERVAL_DAY_TIME: { - const size_t size = 8; - memcpy(&out->days, data_view + i * size, 4); - memcpy(&out->ms, data_view + i * size + 4, 4); + const size_t size = sizeof(int32_t) + sizeof(int32_t); + memcpy(&out->days, data_view + i * size, sizeof(int32_t)); + memcpy(&out->ms, data_view + i * size + 4, sizeof(int32_t)); break; } case NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO: { - const size_t size = 16; - memcpy(&out->months, data_view + i * size, 4); - memcpy(&out->days, data_view + i * size + 4, 4); - memcpy(&out->ns, data_view + i * size + 8, 8); + const size_t size = sizeof(int32_t) + sizeof(int32_t) + sizeof(int64_t); + memcpy(&out->months, data_view + i * size, sizeof(int32_t)); + memcpy(&out->days, data_view + i * size + 4, sizeof(int32_t)); + memcpy(&out->ns, data_view + i * size + 8, sizeof(int64_t)); break; } default: diff --git a/src/nanoarrow/array_test.cc b/src/nanoarrow/array_test.cc index 08b59378e..04542990d 100644 --- a/src/nanoarrow/array_test.cc +++ b/src/nanoarrow/array_test.cc @@ -2454,7 +2454,40 @@ TEST(ArrayViewTest, ArrayViewTestGetString) { } TEST(ArrayViewTest, ArrayViewTestGetIntervalYearMonth) { - GTEST_SKIP() << "MonthIntervalBuilder not implemented in Arrow"; + struct ArrowArray array; + struct ArrowSchema schema; + struct ArrowArrayView array_view; + struct ArrowError error; + struct ArrowInterval interval; + + ArrowIntervalInit(&interval, ArrowType::NANOARROW_TYPE_INTERVAL_MONTHS); + interval.months = 42; + + ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_INTERVAL_MONTHS), NANOARROW_OK); + EXPECT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK); + EXPECT_EQ(ArrowArrayAppendInterval(&array, &interval), NANOARROW_OK); + EXPECT_EQ(ArrowArrayAppendNull(&array, 2), NANOARROW_OK); + + interval.months = -42; + EXPECT_EQ(ArrowArrayAppendInterval(&array, &interval), NANOARROW_OK); + EXPECT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK); + + ASSERT_EQ(ArrowSchemaInitFromType(&schema, NANOARROW_TYPE_INTERVAL_MONTHS), + NANOARROW_OK); + ASSERT_EQ(ArrowArrayViewInitFromSchema(&array_view, &schema, &error), NANOARROW_OK); + ASSERT_EQ(ArrowArrayViewSetArray(&array_view, &array, &error), NANOARROW_OK); + EXPECT_EQ(ArrowArrayViewValidate(&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error), + NANOARROW_OK); + + ArrowArrayViewGetIntervalUnsafe(&array_view, 0, &interval); + EXPECT_EQ(interval.months, 42); + + ArrowArrayViewGetIntervalUnsafe(&array_view, 3, &interval); + EXPECT_EQ(interval.months, -42); + + ArrowArrayViewReset(&array_view); + schema.release(&schema); + array.release(&array); } TEST(ArrayViewTest, ArrayViewTestGetIntervalDayTime) {