You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by bl...@apache.org on 2022/01/31 16:22:02 UTC

[iceberg] branch master updated: Python: Support visiting MapType (#3989)

This is an automated email from the ASF dual-hosted git repository.

blue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/master by this push:
     new 8748ddd  Python: Support visiting MapType (#3989)
8748ddd is described below

commit 8748ddddd37da1b26d72073858d90cf2965f174c
Author: cccs-eric <er...@cyber.gc.ca>
AuthorDate: Mon Jan 31 11:21:44 2022 -0500

    Python: Support visiting MapType (#3989)
---
 python_legacy/iceberg/api/types/type.py      |  2 +-
 python_legacy/iceberg/api/types/type_util.py | 26 ++++++++++++++++++++++++--
 python_legacy/iceberg/api/types/types.py     |  8 +++++++-
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/python_legacy/iceberg/api/types/type.py b/python_legacy/iceberg/api/types/type.py
index 437b95b..28f000e 100644
--- a/python_legacy/iceberg/api/types/type.py
+++ b/python_legacy/iceberg/api/types/type.py
@@ -63,7 +63,7 @@ class Type(object):
     def as_list_type(self):
         raise ValueError("Not a list type: " + self)
 
-    def asMapType(self):
+    def as_map_type(self):
         raise ValueError("Not a map type: " + self)
 
     def is_nested_type(self):
diff --git a/python_legacy/iceberg/api/types/type_util.py b/python_legacy/iceberg/api/types/type_util.py
index 5a465e5..e0c4428 100644
--- a/python_legacy/iceberg/api/types/type_util.py
+++ b/python_legacy/iceberg/api/types/type_util.py
@@ -143,7 +143,29 @@ def visit(arg, visitor): # noqa: ignore=C901
 
             return visitor.list(list_var, element_result)
         elif type_var.type_id == TypeID.MAP:
-            raise NotImplementedError()
+            map_var = type_var.as_nested_type().as_map_type()
+            visitor.field_ids.append(map_var.key_field.field_id)
+            visitor.field_names.append(map_var.key_field.name)
+            try:
+                key_result = visit(map_var.key_type(), visitor)
+            except NotImplementedError:
+                # will remove it after missing functions are implemented.
+                pass
+            finally:
+                visitor.field_ids.pop()
+                visitor.field_names.pop()
+
+            visitor.field_ids.append(map_var.value_field.field_id)
+            visitor.field_names.append(map_var.value_field.name)
+            try:
+                value_result = visit(map_var.value_type(), visitor)
+            except NotImplementedError:
+                # will remove it after missing functions are implemented.
+                pass
+            finally:
+                visitor.field_ids.pop()
+                visitor.field_names.pop()
+            return visitor.map(map_var, key_result, value_result)
         else:
             return visitor.primitive(arg.as_primitive_type())
     else:
@@ -385,7 +407,7 @@ class IndexById(SchemaVisitor):
             self.index[field.field_id] = field
 
     def map(self, map_var, key_result, value_result):
-        for field in map_var.fields:
+        for field in map_var.fields():
             self.index[field.field_id] = field
 
 
diff --git a/python_legacy/iceberg/api/types/types.py b/python_legacy/iceberg/api/types/types.py
index b5957c2..2bc8d5b 100644
--- a/python_legacy/iceberg/api/types/types.py
+++ b/python_legacy/iceberg/api/types/types.py
@@ -696,6 +696,12 @@ class MapType(NestedType):
     def value_id(self):
         return self.value_field.field_id
 
+    def as_map_type(self):
+        return self
+
+    def is_map_type(self):
+        return True
+
     def is_value_optional(self):
         return self.value_field.is_optional
 
@@ -723,4 +729,4 @@ class MapType(NestedType):
         return MapType.__class__, self.key_field, self.value_field
 
     def _lazy_field_list(self):
-        return tuple(self.key_field, self.value_field)
+        return (self.key_field, self.value_field)