dongxiao1198 commented on code in PR #150:
URL: https://github.com/apache/iceberg-cpp/pull/150#discussion_r2227554494
##########
src/iceberg/manifest_reader_internal.cc:
##########
@@ -38,6 +38,121 @@ namespace iceberg {
return InvalidArrowData("Nanoarrow error: {}", error.message); \
}
+#define PARSE_PRIMITIVE_FIELD(item, array_view, type)
\
+ for (size_t row_idx = 0; row_idx < array_view->length; row_idx++) {
\
+ if (!ArrowArrayViewIsNull(array_view, row_idx)) {
\
+ auto value = ArrowArrayViewGetIntUnsafe(array_view, row_idx);
\
+ item = static_cast<type>(value);
\
+ } else if (required) {
\
+ return InvalidManifestList("Field {} is required but null at row {}",
field_name, \
+ row_idx);
\
+ }
\
+ }
+
+#define PARSE_ENUM_FIELD(item, array_view, type)
\
+ for (size_t row_idx = 0; row_idx < array_view->length; row_idx++) {
\
+ if (!ArrowArrayViewIsNull(array_view, row_idx)) {
\
+ auto value = ArrowArrayViewGetIntUnsafe(array_view, row_idx);
\
+ item = static_cast<type>(value);
\
+ } else if (required) {
\
+ return InvalidManifestList("Field {} is required but null at row {}",
field_name, \
+ row_idx);
\
+ }
\
+ }
+
+#define PARSE_STRING_FIELD(item, array_view)
\
+ for (size_t row_idx = 0; row_idx < array_view->length; row_idx++) {
\
+ if (!ArrowArrayViewIsNull(array_view, row_idx)) {
\
+ auto value = ArrowArrayViewGetStringUnsafe(array_view, row_idx);
\
+ std::string path_str(value.data, value.size_bytes);
\
+ item = path_str;
\
+ } else if (required) {
\
+ return InvalidManifestList("Field {} is required but null at row {}",
field_name, \
+ row_idx);
\
+ }
\
+ }
+
+#define PARSE_BINARY_FIELD(item, array_view)
\
+ for (size_t row_idx = 0; row_idx < array_view->length; row_idx++) {
\
+ if (!ArrowArrayViewIsNull(view_of_column, row_idx)) {
\
+ auto buffer = ArrowArrayViewGetBytesUnsafe(array_view, row_idx);
\
+ item = std::vector<uint8_t>(buffer.data.as_char,
\
+ buffer.data.as_char + buffer.size_bytes);
\
+ } else if (required) {
\
+ return InvalidManifestList("Field {} is required but null at row {}",
field_name, \
+ row_idx);
\
+ }
\
+ }
+
+#define PARSE_PRIMITIVE_VECTOR_FIELD(item, count, array_view, type)
\
+ for (int64_t manifest_idx = 0; manifest_idx < count; manifest_idx++) {
\
+ auto offset = ArrowArrayViewListChildOffset(array_view, manifest_idx);
\
+ auto next_offset = ArrowArrayViewListChildOffset(array_view, manifest_idx
+ 1); \
+ for (int64_t offset_idx = offset; offset_idx < next_offset; offset_idx++)
{ \
+ item.emplace_back(static_cast<type>(
\
+ ArrowArrayViewGetIntUnsafe(array_view->children[0], offset_idx)));
\
+ }
\
+ }
+
+#define PARSE_PRIMITIVE_MAP_FIELD(item, count, array_view)
\
+ do {
\
+ if (array_view->storage_type != ArrowType::NANOARROW_TYPE_MAP) {
\
+ return InvalidManifest("Field:{} should be a map.", field_name);
\
+ }
\
+ auto view_of_map = array_view->children[0];
\
+ ASSERT_VIEW_TYPE_AND_CHILDREN(view_of_map,
ArrowType::NANOARROW_TYPE_STRUCT, 2); \
+ auto view_of_map_key = view_of_map->children[0];
\
+ ASSERT_VIEW_TYPE(view_of_map_key, ArrowType::NANOARROW_TYPE_INT32);
\
+ auto view_of_map_value = view_of_map->children[1];
\
+ ASSERT_VIEW_TYPE(view_of_map_value, ArrowType::NANOARROW_TYPE_INT64);
\
+ for (int64_t row_idx = 0; row_idx < count; row_idx++) {
\
+ auto offset = array_view->buffer_views[1].data.as_int32[row_idx];
\
+ auto next_offset = array_view->buffer_views[1].data.as_int32[row_idx +
1]; \
+ for (int32_t offset_idx = offset; offset_idx < next_offset;
offset_idx++) { \
+ auto key = ArrowArrayViewGetIntUnsafe(view_of_map_key, offset_idx);
\
+ auto value = ArrowArrayViewGetIntUnsafe(view_of_map_value,
offset_idx); \
+ item[key] = value;
\
+ }
\
+ }
\
+ } while (0)
+
+#define PARSE_BINARY_MAP_FIELD(item, count, array_view)
\
Review Comment:
merged into one macros
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]