HuaHuaY commented on code in PR #49125:
URL: https://github.com/apache/arrow/pull/49125#discussion_r2786337447


##########
cpp/src/parquet/arrow/schema.cc:
##########
@@ -697,41 +703,53 @@ Status MapToSchemaField(const GroupNode& group, LevelInfo 
current_levels,
   return Status::OK();
 }
 
-Status ListToSchemaField(const GroupNode& group, LevelInfo current_levels,
-                         SchemaTreeContext* ctx, const SchemaField* parent,
-                         SchemaField* out) {
-  if (group.field_count() != 1) {
-    return Status::Invalid("LIST-annotated groups must have a single child.");
-  }
-  if (group.is_repeated()) {
-    return Status::Invalid("LIST-annotated groups must not be repeated.");
-  }
-
-  current_levels.Increment(group);
+Status ResolveList(const GroupNode& group, const Node& list_node,
+                   LevelInfo current_levels, SchemaTreeContext* ctx, 
SchemaField* out) {
+  auto check_two_level_list_repeated = [](const GroupNode& group) -> Status {
+    // When it is repeated, the LIST-annotated 2-level structure can only 
serve as an
+    // element within another LIST-annotated 2-level structure.
+    if (group.is_repeated() &&
+        (group.parent() == nullptr || 
!group.parent()->logical_type()->is_list())) {
+      return Status::Invalid("LIST-annotated groups must not be repeated.");
+    }
+    return {};
+  };
 
-  out->children.resize(group.field_count());
   SchemaField* child_field = &out->children[0];
 
-  ctx->LinkParent(out, parent);
-  ctx->LinkParent(child_field, out);
-
-  const Node& list_node = *group.field(0);
-
-  if (!list_node.is_repeated()) {
-    return Status::Invalid(
-        "Non-repeated nodes in a LIST-annotated group are not supported.");
-  }
-
-  int16_t repeated_ancestor_def_level = current_levels.IncrementRepeated();
   if (list_node.is_group()) {
     const auto& list_group = static_cast<const GroupNode&>(list_node);
     if (list_group.field_count() > 1) {
       // The inner type of the list should be a struct when there are multiple 
fields
       // in the repeated group
-      RETURN_NOT_OK(GroupToStruct(list_group, current_levels, ctx, out, 
child_field));
-    } else if (list_group.field_count() == 1) {
-      const auto& repeated_field = list_group.field(0);
-      if (repeated_field->is_repeated()) {
+      RETURN_NOT_OK(check_two_level_list_repeated(group));

Review Comment:
   I think this is not in backward-compatibility rules.



-- 
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]

Reply via email to