#pragma once
#include <atomic>
#include "catalog/catalog_entry/function_catalog_entry.h"
#include "catalog/catalog_entry/graph_catalog_entry.h"
#include "catalog/catalog_entry/scalar_macro_catalog_entry.h"
#include "catalog/catalog_set.h"
#include "common/cast.h"
#include "function/function.h"
#include "storage/storage_manager.h"
namespace lbug::main {
struct DBConfig;
}
namespace lbug {
namespace main {
class AttachedLbugDatabase;
}
namespace binder {
struct BoundAlterInfo;
struct BoundCreateTableInfo;
struct BoundCreateSequenceInfo;
}
namespace common {
class VirtualFileSystem;
}
namespace function {
struct ScalarMacroFunction;
}
namespace storage {
class WAL;
}
namespace transaction {
class Transaction;
}
namespace catalog {
class TableCatalogEntry;
class NodeTableCatalogEntry;
class RelGroupCatalogEntry;
class FunctionCatalogEntry;
class SequenceCatalogEntry;
class IndexCatalogEntry;
template<typename T>
concept TableCatalogEntryType =
std::is_same_v<T, NodeTableCatalogEntry> || std::is_same_v<T, RelGroupCatalogEntry>;
class LBUG_API Catalog {
friend class main::AttachedLbugDatabase;
public:
Catalog();
virtual ~Catalog() = default;
static Catalog* Get(const main::ClientContext& context);
bool containsTable(const transaction::Transaction* transaction, const std::string& tableName,
bool useInternal = true) const;
bool containsTable(const transaction::Transaction* transaction, common::table_id_t tableID,
bool useInternal = true) const;
TableCatalogEntry* getTableCatalogEntry(const transaction::Transaction* transaction,
const std::string& tableName, bool useInternal = true) const;
TableCatalogEntry* getTableCatalogEntry(const transaction::Transaction* transaction,
common::table_id_t tableID) const;
std::vector<NodeTableCatalogEntry*> getNodeTableEntries(
const transaction::Transaction* transaction, bool useInternal = true) const;
std::vector<RelGroupCatalogEntry*> getRelGroupEntries(
const transaction::Transaction* transaction, bool useInternal = true) const;
std::vector<TableCatalogEntry*> getTableEntries(const transaction::Transaction* transaction,
bool useInternal = true) const;
CatalogEntry* createTableEntry(transaction::Transaction* transaction,
const binder::BoundCreateTableInfo& info);
void dropTableEntryAndIndex(transaction::Transaction* transaction, const std::string& name);
void dropTableEntry(transaction::Transaction* transaction, common::table_id_t tableID);
void dropTableEntry(transaction::Transaction* transaction, const TableCatalogEntry* entry);
void alterTableEntry(transaction::Transaction* transaction, const binder::BoundAlterInfo& info);
void addTableEntry(std::unique_ptr<TableCatalogEntry> entry);
bool containsSequence(const transaction::Transaction* transaction,
const std::string& name) const;
SequenceCatalogEntry* getSequenceEntry(const transaction::Transaction* transaction,
const std::string& sequenceName, bool useInternalSeq = true) const;
SequenceCatalogEntry* getSequenceEntry(const transaction::Transaction* transaction,
common::sequence_id_t sequenceID) const;
std::vector<SequenceCatalogEntry*> getSequenceEntries(
const transaction::Transaction* transaction) const;
common::sequence_id_t createSequence(transaction::Transaction* transaction,
const binder::BoundCreateSequenceInfo& info);
void dropSequence(transaction::Transaction* transaction, const std::string& name);
void dropSequence(transaction::Transaction* transaction, common::sequence_id_t sequenceID);
bool containsType(const transaction::Transaction* transaction, const std::string& name) const;
common::LogicalType getType(const transaction::Transaction*, const std::string& name) const;
void createType(transaction::Transaction* transaction, std::string name,
common::LogicalType type);
bool containsIndex(const transaction::Transaction* transaction, common::table_id_t tableID,
const std::string& indexName) const;
bool containsIndex(const transaction::Transaction* transaction, common::table_id_t tableID,
common::property_id_t propertyID) const;
bool containsUnloadedIndex(const transaction::Transaction* transaction,
common::table_id_t tableID, common::property_id_t propertyID) const;
IndexCatalogEntry* getIndex(const transaction::Transaction* transaction,
common::table_id_t tableID, const std::string& indexName) const;
std::vector<IndexCatalogEntry*> getIndexEntries(
const transaction::Transaction* transaction) const;
std::vector<IndexCatalogEntry*> getIndexEntries(const transaction::Transaction* transaction,
common::table_id_t tableID) const;
void createIndex(transaction::Transaction* transaction,
std::unique_ptr<CatalogEntry> indexCatalogEntry);
void dropAllIndexes(transaction::Transaction* transaction, common::table_id_t tableID);
void dropIndex(transaction::Transaction* transaction, common::table_id_t tableID,
const std::string& indexName) const;
void dropIndex(transaction::Transaction* transaction, common::oid_t indexOID);
bool containsFunction(const transaction::Transaction* transaction, const std::string& name,
bool useInternal = false) const;
CatalogEntry* getFunctionEntry(const transaction::Transaction* transaction,
const std::string& name, bool useInternal = false) const;
std::vector<FunctionCatalogEntry*> getFunctionEntries(
const transaction::Transaction* transaction) const;
std::vector<ScalarMacroCatalogEntry*> getMacroEntries(
const transaction::Transaction* transaction) const;
void addFunction(transaction::Transaction* transaction, CatalogEntryType entryType,
std::string name, function::function_set functionSet, bool isInternal = false);
void dropFunction(transaction::Transaction* transaction, const std::string& name);
bool containsMacro(const transaction::Transaction* transaction,
const std::string& macroName) const;
void addScalarMacroFunction(transaction::Transaction* transaction, std::string name,
std::unique_ptr<function::ScalarMacroFunction> macro);
ScalarMacroCatalogEntry* getScalarMacroCatalogEntry(const transaction::Transaction* transaction,
lbug::common::oid_t MacroID) const;
void dropMacroEntry(transaction::Transaction* transaction, const lbug::common::oid_t macroID);
void dropMacroEntry(transaction::Transaction* transaction,
const ScalarMacroCatalogEntry* entry);
function::ScalarMacroFunction* getScalarMacroFunction(
const transaction::Transaction* transaction, const std::string& name) const;
std::vector<std::string> getMacroNames(const transaction::Transaction* transaction) const;
void dropMacro(transaction::Transaction* transaction, std::string& name);
bool containsGraph(const transaction::Transaction* transaction,
const std::string& graphName) const;
GraphCatalogEntry* getGraphEntry(const transaction::Transaction* transaction,
const std::string& graphName) const;
std::vector<GraphCatalogEntry*> getGraphEntries(
const transaction::Transaction* transaction) const;
void createGraph(transaction::Transaction* transaction, std::string name, bool isAnyGraph);
void dropGraph(transaction::Transaction* transaction, const std::string& name);
void incrementVersion() { version.fetch_add(1, std::memory_order_relaxed); }
uint64_t getVersion() const { return version.load(std::memory_order_relaxed); }
uint64_t getVersionSinceCheckpoint() const {
return version.load(std::memory_order_relaxed) - lastCheckpointVersion;
}
bool changedSinceLastCheckpoint() const {
return version.load(std::memory_order_relaxed) != lastCheckpointVersion;
}
void resetVersion() { lastCheckpointVersion = version.load(std::memory_order_relaxed); }
void resetVersion(uint64_t checkpointedVersion) { lastCheckpointVersion = checkpointedVersion; }
void setCatalogName(const std::string& name) { catalogName = name; }
std::string getCatalogName() const { return catalogName; }
storage::StorageManager* getStorageManager() const { return storageManager.get(); }
void setStorageManager(std::unique_ptr<storage::StorageManager> sm) {
storageManager = std::move(sm);
}
void serialize(common::Serializer& ser) const;
void serializeSnapshot(common::Serializer& ser, common::transaction_t snapshotTS) const;
void deserialize(common::Deserializer& deSer);
template<class TARGET>
TARGET* ptrCast() {
return common::dynamic_cast_checked<TARGET*>(this);
}
private:
void initCatalogSets();
void registerBuiltInFunctions();
void registerBuiltInTypes();
CatalogEntry* createNodeTableEntry(transaction::Transaction* transaction,
const binder::BoundCreateTableInfo& info);
CatalogEntry* createRelGroupEntry(transaction::Transaction* transaction,
const binder::BoundCreateTableInfo& info);
void createSerialSequence(transaction::Transaction* transaction, const TableCatalogEntry* entry,
bool isInternal);
void dropSerialSequence(transaction::Transaction* transaction, const TableCatalogEntry* entry);
template<TableCatalogEntryType T>
std::vector<T*> getTableEntries(const transaction::Transaction* transaction, bool useInternal,
CatalogEntryType entryType) const;
protected:
std::unique_ptr<CatalogSet> tables;
private:
std::unique_ptr<CatalogSet> sequences;
std::unique_ptr<CatalogSet> functions;
std::unique_ptr<CatalogSet> types;
std::unique_ptr<CatalogSet> indexes;
std::unique_ptr<CatalogSet> macros;
std::unique_ptr<CatalogSet> internalTables;
std::unique_ptr<CatalogSet> internalSequences;
std::unique_ptr<CatalogSet> internalFunctions;
std::unique_ptr<CatalogSet> graphs;
std::atomic<uint64_t> version;
uint64_t lastCheckpointVersion = 0;
std::string catalogName;
std::unique_ptr<storage::StorageManager> storageManager;
};
} }