liurenjie1024 commented on code in PR #731:
URL: https://github.com/apache/iceberg-rust/pull/731#discussion_r1968754297


##########
crates/iceberg/src/spec/schema/visitor.rs:
##########
@@ -121,3 +121,162 @@ pub fn visit_schema<V: SchemaVisitor>(schema: &Schema, 
visitor: &mut V) -> Resul
     let result = visit_struct(&schema.r#struct, visitor)?;
     visitor.schema(schema, result)
 }
+
+/// A post order schema visitor with partner.
+///
+/// For order of methods called, please refer to [`visit_schema_with_partner`].
+pub trait SchemaWithPartnerVisitor<P> {
+    /// Return type of this visitor.
+    type T;
+
+    /// Called before struct field.
+    fn before_struct_field(&mut self, _field: &NestedFieldRef, _partner: &P) 
-> Result<()> {
+        Ok(())
+    }
+    /// Called after struct field.
+    fn after_struct_field(&mut self, _field: &NestedFieldRef, _partner: &P) -> 
Result<()> {
+        Ok(())
+    }
+    /// Called before list field.
+    fn before_list_element(&mut self, _field: &NestedFieldRef, _partner: &P) 
-> Result<()> {
+        Ok(())
+    }
+    /// Called after list field.
+    fn after_list_element(&mut self, _field: &NestedFieldRef, _partner: &P) -> 
Result<()> {
+        Ok(())
+    }
+    /// Called before map key field.
+    fn before_map_key(&mut self, _field: &NestedFieldRef, _partner: &P) -> 
Result<()> {
+        Ok(())
+    }
+    /// Called after map key field.
+    fn after_map_key(&mut self, _field: &NestedFieldRef, _partner: &P) -> 
Result<()> {
+        Ok(())
+    }
+    /// Called before map value field.
+    fn before_map_value(&mut self, _field: &NestedFieldRef, _partner: &P) -> 
Result<()> {
+        Ok(())
+    }
+    /// Called after map value field.
+    fn after_map_value(&mut self, _field: &NestedFieldRef, _partner: &P) -> 
Result<()> {
+        Ok(())
+    }
+
+    /// Called after schema's type visited.
+    fn schema(&mut self, schema: &Schema, partner: &P, value: Self::T) -> 
Result<Self::T>;
+    /// Called after struct's field type visited.
+    fn field(&mut self, field: &NestedFieldRef, partner: &P, value: Self::T) 
-> Result<Self::T>;
+    /// Called after struct's fields visited.
+    fn r#struct(
+        &mut self,
+        r#struct: &StructType,
+        partner: &P,
+        results: Vec<Self::T>,
+    ) -> Result<Self::T>;
+    /// Called after list fields visited.
+    fn list(&mut self, list: &ListType, partner: &P, value: Self::T) -> 
Result<Self::T>;
+    /// Called after map's key and value fields visited.
+    fn map(
+        &mut self,
+        map: &MapType,
+        partner: &P,
+        key_value: Self::T,
+        value: Self::T,
+    ) -> Result<Self::T>;
+    /// Called when see a primitive type.
+    fn primitive(&mut self, p: &PrimitiveType, partner: &P) -> Result<Self::T>;
+}
+
+/// Accessor used to get child partner from parent partner.
+pub trait PartnerAccessor<P> {
+    /// Get the struct partner from schema partner.
+    fn struct_parner<'a>(&self, schema_partner: &'a P) -> Result<&'a P>;
+    /// Get the field partner from struct partner.
+    fn field_partner<'a>(&self, struct_partner: &'a P, field: &NestedField) -> 
Result<&'a P>;
+    /// Get the list element partner from list partner.
+    fn list_element_partner<'a>(&self, list_partner: &'a P) -> Result<&'a P>;
+    /// Get the map key partner from map partner.
+    fn map_key_partner<'a>(&self, map_partner: &'a P) -> Result<&'a P>;
+    /// Get the map value partner from map partner.
+    fn map_value_partner<'a>(&self, map_partner: &'a P) -> Result<&'a P>;
+}
+
+/// Visiting a type in post order.
+pub fn visit_type_with_partner<P, V: SchemaWithPartnerVisitor<P>, A: 
PartnerAccessor<P>>(

Review Comment:
   I think user only need pub access to `visit_schema_with_partner` and 
`visit_struct_with_partner`, there is no need to access this?



##########
crates/iceberg/src/spec/values.rs:
##########
@@ -1564,6 +1564,16 @@ impl Literal {
         Self::Primitive(PrimitiveLiteral::Long(value))
     }
 
+    /// Creates a timestamp from unix epoch in nanoseconds.
+    pub fn timestamp_nano(value: i64) -> Self {
+        Self::Primitive(PrimitiveLiteral::Long(value))
+    }
+
+    /// Creates a timestamp with timezone from unix epoch in nanoseconds.
+    pub fn timestamptz_nano(value: i64) -> Self {

Review Comment:
   LGTM, but please mark these new added methods as crate private.



-- 
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: issues-unsubscr...@iceberg.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to