#pragma once #include #include #include #include #include #include #include #include #include #include #include "DictionaryBlockInputStreamBase.h" #include "DictionaryStructure.h" #include "IDictionary.h" namespace DB { namespace ErrorCodes { extern const int LOGICAL_ERROR; } /* BlockInputStream implementation for external dictionaries * read() returns blocks consisting of the in-memory contents of the dictionaries */ template class DictionaryBlockInputStream : public DictionaryBlockInputStreamBase { public: using DictionaryPtr = std::shared_ptr; DictionaryBlockInputStream( std::shared_ptr dictionary, UInt64 max_block_size, PaddedPODArray && ids, const Names & column_names); DictionaryBlockInputStream( std::shared_ptr dictionary, UInt64 max_block_size, const std::vector & keys, const Names & column_names); using GetColumnsFunction = std::function & attributes)>; // Used to separate key columns format for storage and view. // Calls get_key_columns_function to get key column for dictionary get function call // and get_view_columns_function to get key representation. // Now used in trie dictionary, where columns are stored as ip and mask, and are showed as string DictionaryBlockInputStream( std::shared_ptr dictionary, UInt64 max_block_size, const Columns & data_columns, const Names & column_names, GetColumnsFunction && get_key_columns_function, GetColumnsFunction && get_view_columns_function); String getName() const override { return "Dictionary"; } protected: Block getBlock(size_t start, size_t size) const override; private: // pointer types to getXXX functions // for single key dictionaries template using DictionaryGetter = void (DictionaryType::*)(const std::string &, const PaddedPODArray &, PaddedPODArray &) const; template using DictionaryDecimalGetter = void (DictionaryType::*)(const std::string &, const PaddedPODArray &, DecimalPaddedPODArray &) const; using DictionaryStringGetter = void (DictionaryType::*)(const std::string &, const PaddedPODArray &, ColumnString *) const; // for complex complex key dictionaries template using GetterByKey = void (DictionaryType::*)(const std::string &, const Columns &, const DataTypes &, PaddedPODArray & out) const; template using DecimalGetterByKey = void (DictionaryType::*)(const std::string &, const Columns &, const DataTypes &, DecimalPaddedPODArray & out) const; using StringGetterByKey = void (DictionaryType::*)(const std::string &, const Columns &, const DataTypes &, ColumnString * out) const; // call getXXX // for single key dictionaries template void callGetter( DictionaryGetter getter, const PaddedPODArray & ids_to_fill, const Columns & keys, const DataTypes & data_types, Container & container, const DictionaryAttribute & attribute, const DictionaryType & dictionary) const; template void callGetter( DictionaryDecimalGetter getter, const PaddedPODArray & ids_to_fill, const Columns & keys, const DataTypes & data_types, Container & container, const DictionaryAttribute & attribute, const DictionaryType & dictionary) const; template void callGetter( DictionaryStringGetter getter, const PaddedPODArray & ids_to_fill, const Columns & keys, const DataTypes & data_types, Container & container, const DictionaryAttribute & attribute, const DictionaryType & dictionary) const; // for complex complex key dictionaries template void callGetter( GetterByKey getter, const PaddedPODArray & ids_to_fill, const Columns & keys, const DataTypes & data_types, Container & container, const DictionaryAttribute & attribute, const DictionaryType & dictionary) const; template void callGetter( DecimalGetterByKey getter, const PaddedPODArray & ids_to_fill, const Columns & keys, const DataTypes & data_types, Container & container, const DictionaryAttribute & attribute, const DictionaryType & dictionary) const; template void callGetter( StringGetterByKey getter, const PaddedPODArray & ids_to_fill, const Columns & keys, const DataTypes & data_types, Container & container, const DictionaryAttribute & attribute, const DictionaryType & dictionary) const; template