#pragma once #include #include #include namespace DB { class IDisk; using DiskPtr = std::shared_ptr; class Set; using SetPtr = std::shared_ptr; /** Common part of StorageSet and StorageJoin. */ class StorageSetOrJoinBase : public IStorage { friend class SetOrJoinSink; public: void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context, bool async_insert) override; bool storesDataOnDisk() const override { return true; } Strings getDataPaths() const override { return {path}; } protected: StorageSetOrJoinBase( DiskPtr disk_, const String & relative_path_, const StorageID & table_id_, const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment, bool persistent_); DiskPtr disk; String path; bool persistent; std::atomic increment = 0; /// For the backup file names. /// Restore from backup. void restore(); private: void restoreFromFile(const String & file_path); /// Insert the block into the state. virtual void insertBlock(const Block & block, ContextPtr context) = 0; /// Call after all blocks were inserted. virtual void finishInsert() = 0; virtual size_t getSize(ContextPtr context) const = 0; }; /** Lets you save the set for later use on the right side of the IN statement. * When inserted into a table, the data will be inserted into the set, * and also written to a file-backup, for recovery after a restart. * Reading from the table is not possible directly - it is possible to specify only the right part of the IN statement. */ class StorageSet final : public StorageSetOrJoinBase { public: StorageSet( DiskPtr disk_, const String & relative_path_, const StorageID & table_id_, const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment, bool persistent_); String getName() const override { return "Set"; } /// Access the insides. SetPtr & getSet() { return set; } void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr, TableExclusiveLockHolder &) override; std::optional totalRows(const Settings & settings) const override; std::optional totalBytes(const Settings & settings) const override; private: SetPtr set; void insertBlock(const Block & block, ContextPtr) override; void finishInsert() override; size_t getSize(ContextPtr) const override; }; }