wgtmac commented on code in PR #54: URL: https://github.com/apache/iceberg-cpp/pull/54#discussion_r2022059225
########## src/iceberg/CMakeLists.txt: ########## @@ -23,7 +23,11 @@ set(ICEBERG_SOURCES schema.cc schema_field.cc schema_internal.cc - type.cc) + type.cc Review Comment: ```suggestion ``` ########## src/iceberg/transform.h: ########## @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/transform.h + +#include <cstdint> +#include <memory> + +#include "iceberg/arrow_c_data.h" +#include "iceberg/error.h" +#include "iceberg/expected.h" +#include "iceberg/iceberg_export.h" +#include "iceberg/type_fwd.h" +#include "iceberg/util/formattable.h" + +namespace iceberg { + +/// \brief Transform types used for partitioning +enum class TransformType : uint8_t { + /// Used to represent some customized transform that can't be recognized or supported + /// now. + kUnknown, + /// Equal to source value, unmodified + kIdentity, + /// Hash of value, mod `N` + kBucket, + /// Value truncated to width `W` + kTruncate, + /// Extract a date or timestamp year, as years from 1970 + kYear, + /// Extract a date or timestamp month, as months from 1970-01-01 + kMonth, + /// Extract a date or timestamp day, as days from 1970-01-01 + kDay, + /// Extract a timestamp hour, as hours from 1970-01-01 00:00:00 + kHour, + /// Always produces `null` + kVoid, +}; + +/// \brief Get the relative transform name +constexpr std::string_view ToString(TransformType type) { + /// Transform names used for formatting + constexpr std::string_view TransformTypeNames[] = {"Unknown", "Identity", "Bucket", + "Truncate", "Year", "Month", + "Day", "Hour", "Void"}; + return TransformTypeNames[static_cast<size_t>(type)]; +} + +/// \brief A transform function used for partitioning. +class ICEBERG_EXPORT TransformFunction : public util::Formattable { + public: + explicit TransformFunction(TransformType type); + /// \brief Transform an input array to a new array + virtual expected<ArrowArray, Error> Transform(const ArrowArray& inputArrowArray) = 0; Review Comment: We use snake case for parameter name. So either `input_arrow_array` or simply `data`? ########## src/iceberg/partition_spec.h: ########## @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_spec.h +/// Partition specs for Iceberg tables. + +#include <cstdint> +#include <span> +#include <string> +#include <vector> + +#include "iceberg/iceberg_export.h" +#include "iceberg/partition_field.h" + +namespace iceberg { + +/// \brief A partition spec for a Table. +/// +/// A partition spec is a list of partition fields, along with a unique integer ID. A +/// Table may have different partition specs over its lifetime due to partition spec +/// evolution. +class ICEBERG_EXPORT PartitionSpec { + public: + virtual ~PartitionSpec() = default; + PartitionSpec(std::shared_ptr<Schema> schema, int32_t spec_id, + std::vector<PartitionField> fields); + /// \brief Get the partition schema + [[nodiscard]] const std::shared_ptr<Schema>& schema() const; + /// \brief Get the spec ID. + [[nodiscard]] int32_t spec_id() const; + /// \brief Get a view of the partition fields. + [[nodiscard]] virtual std::span<const PartitionField> fields() const; + + [[nodiscard]] std::string ToString() const; Review Comment: ```suggestion std::string ToString() const; ``` ########## src/iceberg/transform.h: ########## @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/transform.h + +#include <cstdint> +#include <memory> + +#include "iceberg/arrow_c_data.h" +#include "iceberg/error.h" +#include "iceberg/expected.h" +#include "iceberg/iceberg_export.h" +#include "iceberg/type_fwd.h" +#include "iceberg/util/formattable.h" + +namespace iceberg { + +/// \brief Transform types used for partitioning +enum class TransformType : uint8_t { + /// Used to represent some customized transform that can't be recognized or supported + /// now. + kUnknown, + /// Equal to source value, unmodified + kIdentity, + /// Hash of value, mod `N` + kBucket, + /// Value truncated to width `W` + kTruncate, + /// Extract a date or timestamp year, as years from 1970 + kYear, + /// Extract a date or timestamp month, as months from 1970-01-01 + kMonth, + /// Extract a date or timestamp day, as days from 1970-01-01 + kDay, + /// Extract a timestamp hour, as hours from 1970-01-01 00:00:00 + kHour, + /// Always produces `null` + kVoid, +}; + +/// \brief Get the relative transform name +constexpr std::string_view ToString(TransformType type) { + /// Transform names used for formatting + constexpr std::string_view TransformTypeNames[] = {"Unknown", "Identity", "Bucket", + "Truncate", "Year", "Month", + "Day", "Hour", "Void"}; + return TransformTypeNames[static_cast<size_t>(type)]; +} + +/// \brief A transform function used for partitioning. +class ICEBERG_EXPORT TransformFunction : public util::Formattable { Review Comment: Why `TransformFunction` but not `Transform`? ########## test/partition_field_test.cc: ########## @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "iceberg/partition_field.h" + +#include <format> + +#include <gtest/gtest.h> + +#include "iceberg/transform.h" +#include "iceberg/util/formatter.h" + +namespace iceberg { + +namespace { +class TestTransformFunction : public TransformFunction { + public: + TestTransformFunction() : TransformFunction(TransformType::kUnknown) {} + expected<ArrowArray, Error> Transform(const ArrowArray& input) override { + return unexpected( + Error{.kind = ErrorKind::kNotSupported, .message = "test transform function"}); + } +}; + +class IdentityTransformFunction : public TransformFunction { Review Comment: Why not implementing this in the source code? ########## src/iceberg/partition_spec.cc: ########## @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "iceberg/partition_spec.h" + +#include <format> + +#include "iceberg/exception.h" Review Comment: ```suggestion ``` ########## src/iceberg/CMakeLists.txt: ########## @@ -23,7 +23,11 @@ set(ICEBERG_SOURCES schema.cc schema_field.cc schema_internal.cc - type.cc) + type.cc + type.cc + transform.cc + partition_field.cc Review Comment: Sort them alphabetically ########## src/iceberg/partition_spec.h: ########## @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_spec.h +/// Partition specs for Iceberg tables. + +#include <cstdint> +#include <span> +#include <string> +#include <vector> + +#include "iceberg/iceberg_export.h" +#include "iceberg/partition_field.h" + +namespace iceberg { + +/// \brief A partition spec for a Table. +/// +/// A partition spec is a list of partition fields, along with a unique integer ID. A +/// Table may have different partition specs over its lifetime due to partition spec +/// evolution. +class ICEBERG_EXPORT PartitionSpec { + public: + virtual ~PartitionSpec() = default; + PartitionSpec(std::shared_ptr<Schema> schema, int32_t spec_id, + std::vector<PartitionField> fields); + /// \brief Get the partition schema + [[nodiscard]] const std::shared_ptr<Schema>& schema() const; + /// \brief Get the spec ID. + [[nodiscard]] int32_t spec_id() const; + /// \brief Get a view of the partition fields. + [[nodiscard]] virtual std::span<const PartitionField> fields() const; Review Comment: ```suggestion virtual std::span<const PartitionField> fields() const; ``` ########## src/iceberg/partition_spec.h: ########## @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_spec.h +/// Partition specs for Iceberg tables. + +#include <cstdint> +#include <span> +#include <string> +#include <vector> + +#include "iceberg/iceberg_export.h" +#include "iceberg/partition_field.h" + +namespace iceberg { + +/// \brief A partition spec for a Table. +/// +/// A partition spec is a list of partition fields, along with a unique integer ID. A +/// Table may have different partition specs over its lifetime due to partition spec +/// evolution. +class ICEBERG_EXPORT PartitionSpec { + public: + virtual ~PartitionSpec() = default; + PartitionSpec(std::shared_ptr<Schema> schema, int32_t spec_id, + std::vector<PartitionField> fields); + /// \brief Get the partition schema + [[nodiscard]] const std::shared_ptr<Schema>& schema() const; Review Comment: ```suggestion const std::shared_ptr<Schema>& schema() const; ``` ########## src/iceberg/partition_field.h: ########## @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_field.h +/// A partition field in a partition spec + +#include <cstdint> +#include <memory> +#include <string> +#include <string_view> + +#include "iceberg/iceberg_export.h" +#include "iceberg/type_fwd.h" +#include "iceberg/util/formattable.h" + +namespace iceberg { + +/// \brief a field with its transform. +class ICEBERG_EXPORT PartitionField : public util::Formattable { + public: + /// \brief Construct a field. + /// \param[in] source_id The source field ID. + /// \param[in] field_id The partition field ID. + /// \param[in] name The partition field name. + /// \param[in] transform The transform function. + PartitionField(int32_t source_id, int32_t field_id, std::string name, + std::shared_ptr<TransformFunction> transform); + + /// \brief Get the source field ID. + [[nodiscard]] int32_t source_field_id() const; Review Comment: I think `source_id` is better and it aligns with the naming in the spec. ########## src/iceberg/partition_spec.h: ########## @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_spec.h +/// Partition specs for Iceberg tables. + +#include <cstdint> +#include <span> +#include <string> +#include <vector> + +#include "iceberg/iceberg_export.h" +#include "iceberg/partition_field.h" + +namespace iceberg { + +/// \brief A partition spec for a Table. +/// +/// A partition spec is a list of partition fields, along with a unique integer ID. A +/// Table may have different partition specs over its lifetime due to partition spec +/// evolution. +class ICEBERG_EXPORT PartitionSpec { + public: + virtual ~PartitionSpec() = default; + PartitionSpec(std::shared_ptr<Schema> schema, int32_t spec_id, + std::vector<PartitionField> fields); + /// \brief Get the partition schema + [[nodiscard]] const std::shared_ptr<Schema>& schema() const; Review Comment: I think these trivial getters do not need to add `nodiscard`. Callers should know what they are doing. ########## src/iceberg/transform.h: ########## @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/transform.h + +#include <cstdint> +#include <memory> + +#include "iceberg/arrow_c_data.h" +#include "iceberg/error.h" +#include "iceberg/expected.h" +#include "iceberg/iceberg_export.h" +#include "iceberg/type_fwd.h" +#include "iceberg/util/formattable.h" + +namespace iceberg { + +/// \brief Transform types used for partitioning +enum class TransformType : uint8_t { + /// Used to represent some customized transform that can't be recognized or supported + /// now. + kUnknown, + /// Equal to source value, unmodified + kIdentity, + /// Hash of value, mod `N` + kBucket, + /// Value truncated to width `W` + kTruncate, + /// Extract a date or timestamp year, as years from 1970 + kYear, + /// Extract a date or timestamp month, as months from 1970-01-01 + kMonth, + /// Extract a date or timestamp day, as days from 1970-01-01 + kDay, + /// Extract a timestamp hour, as hours from 1970-01-01 00:00:00 + kHour, + /// Always produces `null` + kVoid, +}; + +/// \brief Get the relative transform name +constexpr std::string_view ToString(TransformType type) { + /// Transform names used for formatting + constexpr std::string_view TransformTypeNames[] = {"Unknown", "Identity", "Bucket", + "Truncate", "Year", "Month", + "Day", "Hour", "Void"}; + return TransformTypeNames[static_cast<size_t>(type)]; Review Comment: ```suggestion constexpr std::string_view kTransformTypeNames[] = {"Unknown", "Identity", "Bucket", "Truncate", "Year", "Month", "Day", "Hour", "Void"}; return kTransformTypeNames[static_cast<size_t>(type)]; ``` ########## src/iceberg/partition_field.h: ########## @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_field.h +/// A partition field in a partition spec + +#include <cstdint> +#include <memory> +#include <string> +#include <string_view> + +#include "iceberg/iceberg_export.h" +#include "iceberg/type_fwd.h" +#include "iceberg/util/formattable.h" + +namespace iceberg { + +/// \brief a field with its transform. +class ICEBERG_EXPORT PartitionField : public util::Formattable { + public: + /// \brief Construct a field. + /// \param[in] source_id The source field ID. + /// \param[in] field_id The partition field ID. + /// \param[in] name The partition field name. + /// \param[in] transform The transform function. + PartitionField(int32_t source_id, int32_t field_id, std::string name, + std::shared_ptr<TransformFunction> transform); + + /// \brief Get the source field ID. + [[nodiscard]] int32_t source_field_id() const; + + /// \brief Get the partition field ID. + [[nodiscard]] int32_t field_id() const; + + /// \brief Get the partition field name. + [[nodiscard]] std::string_view name() const; + + /// \brief Get the transform type. + [[nodiscard]] std::shared_ptr<TransformFunction> const& transform() const; + + [[nodiscard]] std::string ToString() const override; Review Comment: ```suggestion int32_t source_field_id() const; /// \brief Get the partition field ID. int32_t field_id() const; /// \brief Get the partition field name. std::string_view name() const; /// \brief Get the transform type. std::shared_ptr<TransformFunction> const& transform() const; std::string ToString() const override; ``` ########## src/iceberg/partition_spec.cc: ########## @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "iceberg/partition_spec.h" + +#include <format> + +#include "iceberg/exception.h" +#include "iceberg/schema.h" +#include "iceberg/type.h" +#include "iceberg/util/formatter.h" + +namespace iceberg { + +PartitionSpec::PartitionSpec(std::shared_ptr<Schema> schema, int32_t spec_id, + std::vector<PartitionField> fields) + : schema_(std::move(schema)), spec_id_(spec_id), fields_(std::move(fields)) {} + +const std::shared_ptr<Schema>& PartitionSpec::schema() const { return schema_; } + +int32_t PartitionSpec::spec_id() const { return spec_id_; } + +std::span<const PartitionField> PartitionSpec::fields() const { return fields_; } + +std::string PartitionSpec::ToString() const { + std::string repr = "partition_spec(<"; + for (const auto& field : fields_) { + std::format_to(std::back_inserter(repr), " {}\n", field); Review Comment: We'd better eliminate the whitespace before the 1st partition field. BTW, should we include spec_id in it? ########## src/iceberg/partition_spec.h: ########## @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +/// \file iceberg/partition_spec.h +/// Partition specs for Iceberg tables. + +#include <cstdint> +#include <span> +#include <string> +#include <vector> + +#include "iceberg/iceberg_export.h" +#include "iceberg/partition_field.h" + +namespace iceberg { + +/// \brief A partition spec for a Table. +/// +/// A partition spec is a list of partition fields, along with a unique integer ID. A +/// Table may have different partition specs over its lifetime due to partition spec +/// evolution. +class ICEBERG_EXPORT PartitionSpec { + public: + virtual ~PartitionSpec() = default; + PartitionSpec(std::shared_ptr<Schema> schema, int32_t spec_id, + std::vector<PartitionField> fields); + /// \brief Get the partition schema + [[nodiscard]] const std::shared_ptr<Schema>& schema() const; + /// \brief Get the spec ID. + [[nodiscard]] int32_t spec_id() const; Review Comment: ```suggestion int32_t spec_id() const; ``` -- 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