diff --git a/yt/yt/client/formats/versioned_writer.cpp b/yt/yt/client/formats/versioned_writer.cpp index 056c86d5e..545112d82 100644 --- a/yt/yt/client/formats/versioned_writer.cpp +++ b/yt/yt/client/formats/versioned_writer.cpp @@ -1,10 +1,14 @@ #include "versioned_writer.h" #include "config.h" +#include +#include + #include namespace NYT::NFormats { +using namespace NComplexTypes; using namespace NConcurrency; using namespace NYson; using namespace NTableClient; @@ -18,7 +22,20 @@ TVersionedWriter::TVersionedWriter( : Stream_(std::move(stream)) , Schema_(std::move(schema)) , Consumer_(consumerBuilder(&Buffer_)) -{ } +{ + auto nameTable = TNameTable::FromSchema(*Schema_); + + for (const auto& column : Schema_->Columns()) { + if (IsV3Composite(column.LogicalType())) { + auto id = nameTable->GetIdOrThrow(column.Name()); + TComplexTypeFieldDescriptor descriptor(column.Name(), column.LogicalType()); + auto converter = CreateYsonServerToClientConverter(descriptor, /*config*/ {}); + if (converter) { + ColumnConverters_.emplace(id, std::move(converter)); + } + } + } +} TFuture TVersionedWriter::Close() { @@ -52,7 +69,14 @@ bool TVersionedWriter::Write(TRange rows) case EValueType::Any: Consumer_->OnRaw(value.AsStringBuf(), EYsonType::Node); return; - case EValueType::Composite: + case EValueType::Composite: { + if (auto it = ColumnConverters_.find(value.Id); it != ColumnConverters_.end()) { + it->second(value, Consumer_.get()); + } else { + Consumer_->OnRaw(value.AsStringBuf(), EYsonType::Node); + } + return; + } case EValueType::Min: case EValueType::Max: case EValueType::TheBottom: diff --git a/yt/yt/client/formats/versioned_writer.h b/yt/yt/client/formats/versioned_writer.h index 1427d5bf7..4432ddfe5 100644 --- a/yt/yt/client/formats/versioned_writer.h +++ b/yt/yt/client/formats/versioned_writer.h @@ -2,6 +2,8 @@ #include +#include + #include #include @@ -40,6 +42,8 @@ class TVersionedWriter TFuture Result_; const std::unique_ptr Consumer_; + + THashMap ColumnConverters_; }; ////////////////////////////////////////////////////////////////////////////////