#pragma once #include #include #include namespace DB { class ReadBuffer; /** Поток для чтения данных в формате JSON, где каждая строчка представлена отдельным JSON объектом. * Объекты могут быть разделены переводом строки, другими пробельными символами в любом количестве и, возможно, запятой. * Поля могут быть перечислены в произвольном порядке (в том числе, в разных строках может быть разный порядок), * и часть полей может отсутствовать. */ class JSONEachRowRowInputStream : public IRowInputStream { public: JSONEachRowRowInputStream(ReadBuffer & istr_, const Block & sample_, bool skip_unknown_); bool read(Block & block) override; bool allowSyncAfterError() const override { return true; }; void syncAfterError() override; private: ReadBuffer & istr; const Block sample; bool skip_unknown; /// Буфер для прочитанного из потока имени поля. Используется, если его потребовалось скопировать. String name_buf; /// Хэш-таблица соответствия имя поля -> позиция в блоке. NOTE Можно использовать perfect hash map. using NameMap = HashMap; NameMap name_map; }; }