ClickHouse/dbms/include/DB/DataStreams/TSKVRowInputStream.h

44 lines
1.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <DB/Core/Block.h>
#include <DB/DataStreams/IRowInputStream.h>
#include <DB/Common/HashTable/HashMap.h>
namespace DB
{
class ReadBuffer;
/** Поток для чтения данных в формате TSKV.
* TSKV - очень неэффективный формат данных.
* Похож на TSV, но каждое поле записано в виде key=value.
* Поля могут быть перечислены в произвольном порядке (в том числе, в разных строках может быть разный порядок),
* и часть полей может отсутствовать.
* В имени поля может быть заэскейплен знак равенства.
* Также, в качестве дополнительного элемента может присутствовать бесполезный фрагмент tskv - его нужно игнорировать.
*/
class TSKVRowInputStream : public IRowInputStream
{
public:
TSKVRowInputStream(ReadBuffer & istr_, const Block & sample_, bool skip_unknown_);
bool read(Block & block) override;
private:
ReadBuffer & istr;
const Block sample;
/// Пропускать неизвестные поля.
bool skip_unknown;
/// Буфер для прочитанного из потока имени поля. Используется, если его потребовалось скопировать.
String name_buf;
/// Хэш-таблица соответствия имя поля -> позиция в блоке. NOTE Можно использовать perfect hash map.
using NameMap = HashMap<StringRef, size_t, StringRefHash>;
NameMap name_map;
};
}