blob: 81c9ddd11286daafe5d4cc17dd4d672eb41a01b9 [file]
/*
* 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 <memory>
#include <string>
#include <string_view>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include "iceberg/result.h"
#include "iceberg/table_identifier.h"
#include "iceberg/type_fwd.h"
namespace iceberg {
/// \brief A Catalog API for table create, drop, and load operations.
///
/// Note that these functions are named after the corresponding operationId
/// specified by the Iceberg Rest Catalog API.
class ICEBERG_EXPORT Catalog {
public:
virtual ~Catalog() = default;
/// \brief Return the name for this catalog
virtual std::string_view name() const = 0;
/// \brief Create a namespace with associated properties.
///
/// \param ns the namespace to create
/// \param properties a key-value map of metadata for the namespace
/// \return Status indicating success if created successfully;
/// ErrorKind::kAlreadyExists if the namespace already exists;
/// ErrorKind::kNotSupported if the operation is not supported
virtual Status CreateNamespace(
const Namespace& ns,
const std::unordered_map<std::string, std::string>& properties) = 0;
/// \brief List child namespaces from the given namespace.
///
/// \param ns the parent namespace
/// \return a list of child namespaces;
/// ErrorKind::kNoSuchNamespace if the given namespace does not exist
virtual Result<std::vector<Namespace>> ListNamespaces(const Namespace& ns) const = 0;
/// \brief Get metadata properties for a namespace.
///
/// \param ns the namespace to look up
/// \return a key-value map of metadata properties;
/// ErrorKind::kNoSuchNamespace if the namespace does not exist
virtual Result<std::unordered_map<std::string, std::string>> GetNamespaceProperties(
const Namespace& ns) const = 0;
/// \brief Drop a namespace.
///
/// \param ns the namespace to drop
/// \return Status indicating success if dropped successfully;
/// ErrorKind::kNoSuchNamespace if the namespace does not exist;
/// ErrorKind::kNotAllowed if the namespace is not empty
virtual Status DropNamespace(const Namespace& ns) = 0;
/// \brief Check whether the namespace exists.
///
/// \param ns the namespace to check
/// \return true if the namespace exists, false otherwise
virtual Result<bool> NamespaceExists(const Namespace& ns) const = 0;
/// \brief Update a namespace's properties by applying additions and removals.
///
/// \param ns the namespace to update
/// \param updates a set of properties to add or overwrite
/// \param removals a set of property keys to remove
/// \return Status indicating success if the update is successful;
/// ErrorKind::kNoSuchNamespace if the namespace does not exist;
/// ErrorKind::kUnsupported if the operation is not supported
virtual Status UpdateNamespaceProperties(
const Namespace& ns, const std::unordered_map<std::string, std::string>& updates,
const std::unordered_set<std::string>& removals) = 0;
/// \brief Return all the identifiers under this namespace
///
/// \param ns a namespace
/// \return a list of identifiers for tables or ErrorKind::kNoSuchNamespace
/// if the namespace does not exist
virtual Result<std::vector<TableIdentifier>> ListTables(const Namespace& ns) const = 0;
/// \brief Create a table
///
/// \param identifier a table identifier
/// \param schema a schema
/// \param spec a partition spec
/// \param order a sort order
/// \param location a location for the table; leave empty if unspecified
/// \param properties a string map of table properties
/// \return a Table instance or ErrorKind::kAlreadyExists if the table already exists
virtual Result<std::shared_ptr<Table>> CreateTable(
const TableIdentifier& identifier, const std::shared_ptr<Schema>& schema,
const std::shared_ptr<PartitionSpec>& spec, const std::shared_ptr<SortOrder>& order,
const std::string& location,
const std::unordered_map<std::string, std::string>& properties) = 0;
/// \brief Update a table
///
/// \param identifier a table identifier
/// \param requirements a list of table requirements
/// \param updates a list of table updates
/// \return a Table instance or ErrorKind::kAlreadyExists if the table already exists
virtual Result<std::shared_ptr<Table>> UpdateTable(
const TableIdentifier& identifier,
const std::vector<std::unique_ptr<TableRequirement>>& requirements,
const std::vector<std::unique_ptr<TableUpdate>>& updates) = 0;
/// \brief Start a transaction to create a table
///
/// \param identifier a table identifier
/// \param schema a schema
/// \param spec a partition spec
/// \param order a sort order
/// \param location a location for the table; leave empty if unspecified
/// \param properties a string map of table properties
/// \return a Transaction to create the table or ErrorKind::kAlreadyExists if the
/// table already exists
virtual Result<std::shared_ptr<Transaction>> StageCreateTable(
const TableIdentifier& identifier, const std::shared_ptr<Schema>& schema,
const std::shared_ptr<PartitionSpec>& spec, const std::shared_ptr<SortOrder>& order,
const std::string& location,
const std::unordered_map<std::string, std::string>& properties) = 0;
/// \brief Check whether table exists
///
/// \param identifier a table identifier
/// \return Result<bool> indicating table exists or not.
/// - On success, the table existence was successfully checked (actual
/// existence may be inferred elsewhere).
/// - On failure, contains error information.
virtual Result<bool> TableExists(const TableIdentifier& identifier) const = 0;
/// \brief Drop a table; optionally delete data and metadata files
///
/// If purge is set to true the implementation should delete all data and metadata
/// files.
///
/// \param identifier a table identifier
/// \param purge if true, delete all data and metadata files in the table
/// \return Status indicating the outcome of the operation.
/// - On success, the table was dropped (or did not exist).
/// - On failure, contains error information.
virtual Status DropTable(const TableIdentifier& identifier, bool purge) = 0;
/// \brief Rename a table
///
/// \param from the current table identifier
/// \param to the new table identifier
/// \return Status indicating the outcome of the operation.
/// - On success, the table was renamed.
/// - On failure, contains error information.
virtual Status RenameTable(const TableIdentifier& from, const TableIdentifier& to) = 0;
/// \brief Load a table
///
/// \param identifier a table identifier
/// \return instance of Table implementation referred to by identifier or
/// ErrorKind::kNoSuchTable if the table does not exist
virtual Result<std::shared_ptr<Table>> LoadTable(const TableIdentifier& identifier) = 0;
/// \brief Register a table with the catalog if it does not exist
///
/// \param identifier a table identifier
/// \param metadata_file_location the location of a metadata file
/// \return a Table instance or ErrorKind::kAlreadyExists if the table already exists
virtual Result<std::shared_ptr<Table>> RegisterTable(
const TableIdentifier& identifier, const std::string& metadata_file_location) = 0;
};
} // namespace iceberg