zhjwpku commented on code in PR #80: URL: https://github.com/apache/iceberg-cpp/pull/80#discussion_r2051472871
########## src/iceberg/catalog/memory_catalog.h: ########## @@ -0,0 +1,228 @@ +/* + * 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 + +#include <mutex> +#include <optional> +#include <unordered_map> + +#include "iceberg/catalog.h" + +namespace iceberg { + +class NamespaceContainer; + +class ICEBERG_EXPORT MemoryCatalog : public Catalog { + public: + MemoryCatalog(std::shared_ptr<FileIO> file_io, + std::optional<std::string> warehouse_location); + + void Initialize( + const std::string& name, + const std::unordered_map<std::string, std::string>& properties) override; + + std::string_view name() const override; + + Result<std::vector<TableIdentifier>> ListTables(const Namespace& ns) const override; + + Result<std::unique_ptr<Table>> CreateTable( + const TableIdentifier& identifier, const Schema& schema, const PartitionSpec& spec, + const std::string& location, + const std::unordered_map<std::string, std::string>& properties) override; + + Result<std::unique_ptr<Table>> UpdateTable( + const TableIdentifier& identifier, + const std::vector<std::unique_ptr<UpdateRequirement>>& requirements, + const std::vector<std::unique_ptr<MetadataUpdate>>& updates) override; + + Result<std::shared_ptr<Transaction>> StageCreateTable( + const TableIdentifier& identifier, const Schema& schema, const PartitionSpec& spec, + const std::string& location, + const std::unordered_map<std::string, std::string>& properties) override; + + bool TableExists(const TableIdentifier& identifier) const override; + + bool DropTable(const TableIdentifier& identifier, bool purge) override; + + Result<std::shared_ptr<Table>> LoadTable( + const TableIdentifier& identifier) const override; + + Result<std::shared_ptr<Table>> RegisterTable( + const TableIdentifier& identifier, + const std::string& metadata_file_location) override; + + std::unique_ptr<iceberg::TableBuilder> BuildTable(const TableIdentifier& identifier, + const Schema& schema) const override; + + private: + std::string catalog_name_; + std::unordered_map<std::string, std::string> properties_; + std::shared_ptr<FileIO> file_io_; + std::optional<std::string> warehouse_location_; + std::unique_ptr<NamespaceContainer> root_container_; + mutable std::recursive_mutex mutex_; +}; + +/** + * @brief A hierarchical container that manages namespaces and table metadata in-memory. + * + * Each NamespaceContainer represents a namespace level and can contain properties, + * tables, and child namespaces. This structure enables a tree-like representation + * of nested namespaces. + */ +class ICEBERG_EXPORT NamespaceContainer { + public: + /** + * @brief Checks whether the given namespace exists. + * @param namespace_ident The namespace to check. + * @return True if the namespace exists; false otherwise. + */ + bool NamespaceExists(const Namespace& namespace_ident) const; + + /** + * @brief Lists immediate child namespaces under the given parent namespace. + * @param parent_namespace_ident The optional parent namespace. If not provided, + * the children of the root are returned. + * @return A vector of child namespace names. + */ + std::vector<std::string> ListChildrenNamespaces( + const std::optional<Namespace>& parent_namespace_ident = std::nullopt) const; + + /** + * @brief Creates a new namespace with the specified properties. + * @param namespace_ident The namespace to create. + * @param properties A map of key-value pairs to associate with the namespace. + * @return True if the namespace was successfully created; false if it already exists. + */ + bool CreateNamespace(const Namespace& namespace_ident, + const std::unordered_map<std::string, std::string>& properties); + + /** + * @brief Deletes an existing namespace. + * @param namespace_ident The namespace to delete. + * @return True if the namespace was successfully deleted; false if it does not exist. + */ + bool DeleteNamespace(const Namespace& namespace_ident); + + /** + * @brief Retrieves the properties of the specified namespace. + * @param namespace_ident The namespace whose properties to retrieve. + * @return An optional containing the properties map if the namespace exists; + * std::nullopt otherwise. + */ + std::optional<std::unordered_map<std::string, std::string>> GetProperties( + const Namespace& namespace_ident) const; + + /** + * @brief Replaces all properties of the given namespace. + * @param namespace_ident The namespace whose properties will be replaced. + * @param properties The new properties map. + * @return True if the namespace exists and properties were replaced; false otherwise. + */ + bool ReplaceProperties(const Namespace& namespace_ident, + const std::unordered_map<std::string, std::string>& properties); + + /** + * @brief Lists all table names under the specified namespace. + * @param namespace_ident The namespace from which to list tables. + * @return A vector of table names. + */ + std::vector<std::string> ListTables(const Namespace& namespace_ident) const; + + /** + * @brief Registers a table in the given namespace with a metadata location. + * @param table_ident The fully qualified identifier of the table. + * @param metadata_location The path to the table's metadata. + * @return True if the table was registered successfully; false otherwise. + */ + bool RegisterTable(TableIdentifier const& table_ident, + const std::string& metadata_location); + + /** + * @brief Unregisters a table from the specified namespace. + * @param table_ident The identifier of the table to unregister. + * @return True if the table existed and was removed; false otherwise. + */ + bool UnregisterTable(TableIdentifier const& table_ident); + + /** + * @brief Checks if a table exists in the specified namespace. + * @param table_ident The identifier of the table to check. + * @return True if the table exists; false otherwise. + */ + bool TableExists(TableIdentifier const& table_ident) const; + + /** + * @brief Gets the metadata location for the specified table. + * @param table_ident The identifier of the table. + * @return An optional string containing the metadata location if the table exists; + * std::nullopt otherwise. + */ + std::optional<std::string> GetTableMetadataLocation( + TableIdentifier const& table_ident) const; + + private: + /** + * @brief Helper function to retrieve the container node for a given namespace. + * @param root The root of the tree to search. + * @param namespace_ident The namespace path to traverse. + * @return A pointer to the corresponding NamespaceContainer if it exists; nullptr + * otherwise. + */ + static NamespaceContainer* GetNamespaceContainer(NamespaceContainer* root, + const Namespace& namespace_ident); + + /** + * @brief Const version of GetNamespaceContainer. + */ + static const NamespaceContainer* GetNamespaceContainer( + const NamespaceContainer* root, const Namespace& namespace_ident); + + /** + * @brief Templated implementation for retrieving a NamespaceContainer node. + * @tparam ContainerPtr Pointer type to NamespaceContainer (const or non-const). + * @param root The root node. + * @param namespace_ident The namespace path. + * @return A pointer to the container node if found; nullptr otherwise. + */ + template <typename ContainerPtr> Review Comment: Good to know, thanks -- 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