blob: 8d8849f376f912ced7d82bed6b4a0fbd0367b703 [file] [log] [blame]
/*
* 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 <functional>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include "iceberg/iceberg_export.h"
#include "iceberg/snapshot.h"
#include "iceberg/table_identifier.h"
#include "iceberg/type_fwd.h"
#include "iceberg/update/update_location.h"
#include "iceberg/util/timepoint.h"
namespace iceberg {
/// \brief Represents an Iceberg table
class ICEBERG_EXPORT Table : public std::enable_shared_from_this<Table> {
public:
/// \brief Construct a table.
/// \param[in] identifier The identifier of the table.
/// \param[in] metadata The metadata for the table.
/// \param[in] metadata_location The location of the table metadata file.
/// \param[in] io The FileIO to read and write table data and metadata files.
/// \param[in] catalog The catalog that this table belongs to.
static Result<std::shared_ptr<Table>> Make(TableIdentifier identifier,
std::shared_ptr<TableMetadata> metadata,
std::string metadata_location,
std::shared_ptr<FileIO> io,
std::shared_ptr<Catalog> catalog);
virtual ~Table();
/// \brief Returns the identifier of this table
const TableIdentifier& name() const { return identifier_; }
/// \brief Returns the UUID of the table
const std::string& uuid() const;
/// \brief Returns the schema for this table, return NotFoundError if not found
Result<std::shared_ptr<Schema>> schema() const;
/// \brief Returns a map of schema for this table
Result<
std::reference_wrapper<const std::unordered_map<int32_t, std::shared_ptr<Schema>>>>
schemas() const;
/// \brief Returns the partition spec for this table, return NotFoundError if not found
Result<std::shared_ptr<PartitionSpec>> spec() const;
/// \brief Returns a map of partition specs for this table
Result<std::reference_wrapper<
const std::unordered_map<int32_t, std::shared_ptr<PartitionSpec>>>>
specs() const;
/// \brief Returns the sort order for this table, return NotFoundError if not found
Result<std::shared_ptr<SortOrder>> sort_order() const;
/// \brief Returns a map of sort order IDs to sort orders for this table
Result<std::reference_wrapper<
const std::unordered_map<int32_t, std::shared_ptr<SortOrder>>>>
sort_orders() const;
/// \brief Returns the properties of this table
const TableProperties& properties() const;
/// \brief Returns the table's metadata file location
std::string_view metadata_file_location() const;
/// \brief Returns the table's base location
std::string_view location() const;
/// \brief Returns the time when this table was last updated
TimePointMs last_updated_ms() const;
/// \brief Returns the table's current snapshot, return NotFoundError if not found
Result<std::shared_ptr<Snapshot>> current_snapshot() const;
/// \brief Get the snapshot of this table with the given id
///
/// \param snapshot_id the ID of the snapshot to get
/// \return the Snapshot with the given id, return NotFoundError if not found
Result<std::shared_ptr<Snapshot>> SnapshotById(int64_t snapshot_id) const;
/// \brief Get the snapshots of this table
const std::vector<std::shared_ptr<Snapshot>>& snapshots() const;
/// \brief Get the snapshot history of this table
const std::vector<SnapshotLogEntry>& history() const;
/// \brief Returns a FileIO to read and write table data and metadata files
const std::shared_ptr<FileIO>& io() const;
/// \brief Returns the current metadata for this table
const std::shared_ptr<TableMetadata>& metadata() const;
/// \brief Returns the catalog that this table belongs to
const std::shared_ptr<Catalog>& catalog() const;
/// \brief Returns a LocationProvider for this table
Result<std::unique_ptr<LocationProvider>> location_provider() const;
/// \brief Refresh the current table metadata
virtual Status Refresh();
/// \brief Create a new table scan builder for this table
///
/// Once a table scan builder is created, it can be refined to project columns and
/// filter data.
virtual Result<std::unique_ptr<DataTableScanBuilder>> NewScan() const;
/// \brief Create a new incremental append scan builder for this table
virtual Result<std::unique_ptr<IncrementalAppendScanBuilder>> NewIncrementalAppendScan()
const;
/// \brief Create a new incremental changelog scan builder for this table
virtual Result<std::unique_ptr<IncrementalChangelogScanBuilder>>
NewIncrementalChangelogScan() const;
/// \brief Create a new Transaction to commit multiple table operations at once.
virtual Result<std::shared_ptr<Transaction>> NewTransaction();
/// \brief Create a new UpdatePartitionSpec to update the partition spec of this table
/// and commit the changes.
virtual Result<std::shared_ptr<UpdatePartitionSpec>> NewUpdatePartitionSpec();
/// \brief Create a new UpdateProperties to update table properties and commit the
/// changes.
virtual Result<std::shared_ptr<UpdateProperties>> NewUpdateProperties();
/// \brief Create a new UpdateSortOrder to update the table sort order and commit the
/// changes.
virtual Result<std::shared_ptr<UpdateSortOrder>> NewUpdateSortOrder();
/// \brief Create a new UpdateSchema to alter the columns of this table and commit the
/// changes.
virtual Result<std::shared_ptr<UpdateSchema>> NewUpdateSchema();
/// \brief Create a new ExpireSnapshots to remove expired snapshots and commit the
/// changes.
virtual Result<std::shared_ptr<ExpireSnapshots>> NewExpireSnapshots();
/// \brief Create a new UpdateStatistics to update the table statistics and commit the
/// changes.
virtual Result<std::shared_ptr<UpdateStatistics>> NewUpdateStatistics();
/// \brief Create a new UpdatePartitionStatistics to update partition statistics and
/// commit the changes.
virtual Result<std::shared_ptr<UpdatePartitionStatistics>>
NewUpdatePartitionStatistics();
/// \brief Create a new UpdateLocation to update the table location and commit the
/// changes.
virtual Result<std::shared_ptr<UpdateLocation>> NewUpdateLocation();
/// \brief Create a new FastAppend to append data files and commit the changes.
virtual Result<std::shared_ptr<FastAppend>> NewFastAppend();
/// \brief Create a new SnapshotManager to manage snapshots and snapshot references.
virtual Result<std::shared_ptr<SnapshotManager>> NewSnapshotManager();
protected:
Table(TableIdentifier identifier, std::shared_ptr<TableMetadata> metadata,
std::string metadata_location, std::shared_ptr<FileIO> io,
std::shared_ptr<Catalog> catalog);
const TableIdentifier identifier_;
std::shared_ptr<TableMetadata> metadata_;
std::string metadata_location_;
std::shared_ptr<FileIO> io_;
std::shared_ptr<Catalog> catalog_;
std::unique_ptr<class TableMetadataCache> metadata_cache_;
};
/// \brief A table created by stage-create and not yet committed.
class ICEBERG_EXPORT StagedTable final : public Table {
public:
static Result<std::shared_ptr<StagedTable>> Make(
TableIdentifier identifier, std::shared_ptr<TableMetadata> metadata,
std::string metadata_location, std::shared_ptr<FileIO> io,
std::shared_ptr<Catalog> catalog);
~StagedTable() override;
Status Refresh() override { return {}; }
Result<std::unique_ptr<DataTableScanBuilder>> NewScan() const override;
private:
using Table::Table;
};
/// \brief A read-only table.
class ICEBERG_EXPORT StaticTable final : public Table {
public:
static Result<std::shared_ptr<StaticTable>> Make(
TableIdentifier identifier, std::shared_ptr<TableMetadata> metadata,
std::string metadata_location, std::shared_ptr<FileIO> io);
~StaticTable() override;
Status Refresh() override;
Result<std::shared_ptr<Transaction>> NewTransaction() override;
Result<std::shared_ptr<UpdateProperties>> NewUpdateProperties() override;
Result<std::shared_ptr<UpdateSchema>> NewUpdateSchema() override;
private:
using Table::Table;
};
} // namespace iceberg