2016-02-18 11:45:32 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/Core/Block.h>
|
|
|
|
|
#include <DB/DataStreams/IRowInputStream.h>
|
|
|
|
|
#include <DB/Common/HashTable/HashMap.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
class ReadBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Поток для чтения данных в формате JSON, где каждая строчка представлена отдельным JSON объектом.
|
|
|
|
|
* Объекты могут быть разделены переводом строки, другими пробельными символами в любом количестве и, возможно, запятой.
|
|
|
|
|
* Поля могут быть перечислены в произвольном порядке (в том числе, в разных строках может быть разный порядок),
|
|
|
|
|
* и часть полей может отсутствовать.
|
|
|
|
|
*/
|
|
|
|
|
class JSONEachRowRowInputStream : public IRowInputStream
|
|
|
|
|
{
|
|
|
|
|
public:
|
2016-09-27 22:46:52 +00:00
|
|
|
|
JSONEachRowRowInputStream(ReadBuffer & istr_, const Block & sample_, bool skip_unknown_);
|
2016-02-18 11:45:32 +00:00
|
|
|
|
|
|
|
|
|
bool read(Block & block) override;
|
2017-01-27 04:29:47 +00:00
|
|
|
|
bool allowSyncAfterError() const override { return true; };
|
|
|
|
|
void syncAfterError() override;
|
2016-02-18 11:45:32 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
ReadBuffer & istr;
|
|
|
|
|
const Block sample;
|
2016-09-20 19:11:25 +00:00
|
|
|
|
bool skip_unknown;
|
2016-02-18 11:45:32 +00:00
|
|
|
|
|
|
|
|
|
/// Буфер для прочитанного из потока имени поля. Используется, если его потребовалось скопировать.
|
|
|
|
|
String name_buf;
|
|
|
|
|
|
|
|
|
|
/// Хэш-таблица соответствия имя поля -> позиция в блоке. NOTE Можно использовать perfect hash map.
|
|
|
|
|
using NameMap = HashMap<StringRef, size_t, StringRefHash>;
|
|
|
|
|
NameMap name_map;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|