#pragma once #include #include #include #include #include #include #include "DictionaryStructure.h" #include "IDictionary.h" #include "IDictionarySource.h" namespace DB { namespace bg = boost::geometry; class IPolygonDictionary : public IDictionaryBase { public: IPolygonDictionary( const std::string & name_, const DictionaryStructure & dict_struct_, DictionarySourcePtr source_ptr_, DictionaryLifetime dict_lifetime_); std::string getName() const override; std::string getTypeName() const override; size_t getBytesAllocated() const override; size_t getQueryCount() const override; double getHitRate() const override; size_t getElementCount() const override; double getLoadFactor() const override; const IDictionarySource * getSource() const override; const DictionaryStructure & getStructure() const override; const DictionaryLifetime & getLifetime() const override; bool isInjective(const std::string & attribute_name) const override; BlockInputStreamPtr getBlockInputStream(const Names & column_names, size_t max_block_size) const override; // TODO: Refactor design to perform stronger checks, i.e. make this an override. void has(const Columns & key_columns, const DataTypes & key_types, PaddedPODArray & out) const; protected: using Point = bg::model::point; using Polygon = bg::model::polygon; using MultiPolygon = bg::model::multi_polygon; std::vector polygons; virtual bool find(const Point & point, size_t & id) const = 0; const std::string name; const DictionaryStructure dict_struct; const DictionarySourcePtr source_ptr; const DictionaryLifetime dict_lifetime; private: void createAttributes(); void blockToAttributes(const Block & block); void loadData(); void calculateBytesAllocated(); std::map attribute_index_by_name; std::vector blocks; size_t bytes_allocated = 0; size_t element_count = 0; mutable std::atomic query_count{0}; static Point fieldToPoint(const Field & field); static Polygon fieldToPolygon(const Field & field); static MultiPolygon fieldToMultiPolygon(const Field & field); static constexpr size_t DIM = 2; }; class SimplePolygonDictionary : public IPolygonDictionary { public: SimplePolygonDictionary( const std::string & name_, const DictionaryStructure & dict_struct_, DictionarySourcePtr source_ptr_, DictionaryLifetime dict_lifetime_); std::shared_ptr clone() const override; private: bool find(const Point & point, size_t & id) const override; }; }