#pragma once #include #include #include #include #include #include namespace DB { class IDictionarySource; struct IDictionaryBase; using DictionaryPtr = std::unique_ptr; struct DictionaryLifetime; struct DictionaryStructure; class ColumnString; struct IDictionaryBase { using Key = UInt64; virtual std::exception_ptr getCreationException() const = 0; virtual std::string getName() const = 0; virtual std::string getTypeName() const = 0; virtual std::size_t getBytesAllocated() const = 0; virtual std::size_t getQueryCount() const = 0; virtual double getHitRate() const = 0; virtual std::size_t getElementCount() const = 0; virtual double getLoadFactor() const = 0; virtual bool isCached() const = 0; virtual DictionaryPtr clone() const = 0; virtual const IDictionarySource * getSource() const = 0; virtual const DictionaryLifetime & getLifetime() const = 0; virtual const DictionaryStructure & getStructure() const = 0; virtual std::chrono::time_point getCreationTime() const = 0; virtual bool isInjective(const std::string & attribute_name) const = 0; virtual ~IDictionaryBase() = default; }; struct IDictionary : IDictionaryBase { virtual bool hasHierarchy() const = 0; virtual void toParent(const PaddedPODArray & ids, PaddedPODArray & out) const = 0; virtual void has(const PaddedPODArray & ids, PaddedPODArray & out) const = 0; /// Methods for hierarchy. virtual void isIn(const PaddedPODArray & child_ids, const PaddedPODArray & ancestor_ids, PaddedPODArray & out) const { throw Exception("Hierarchy is not supported for " + getName() + " dictionary.", ErrorCodes::NOT_IMPLEMENTED); } virtual void isIn(const PaddedPODArray & child_ids, const Key ancestor_id, PaddedPODArray & out) const { throw Exception("Hierarchy is not supported for " + getName() + " dictionary.", ErrorCodes::NOT_IMPLEMENTED); } virtual void isIn(const Key child_id, const PaddedPODArray & ancestor_ids, PaddedPODArray & out) const { throw Exception("Hierarchy is not supported for " + getName() + " dictionary.", ErrorCodes::NOT_IMPLEMENTED); } virtual void isIn(const Key child_id, const Key ancestor_id, UInt8 & out) const { PaddedPODArray out_arr(1); isIn(PaddedPODArray(1, child_id), PaddedPODArray(1, ancestor_id), out_arr); out = out_arr[0]; } }; }