diff options
| author | ermolovd <[email protected]> | 2025-10-21 15:26:11 +0300 |
|---|---|---|
| committer | ermolovd <[email protected]> | 2025-10-21 16:00:22 +0300 |
| commit | 65b8155bcc5ec62f732e1adb11af8f6a34c5bb50 (patch) | |
| tree | 6db0287ba483131ca102992c3088bbecef6150f4 /yt/cpp/mapreduce/interface/protobuf_format.cpp | |
| parent | 1577dd56ef2543ebadd158d172af102a4f121481 (diff) | |
fix proto column filter for proto with EMBEDDED messages
* Changelog entry
Type: fix
Component: cpp-sdk
fix inferring column filter when running operations in protobuf format
commit_hash:9263474e2121155b4678af32e0d20b5a685fac0c
Diffstat (limited to 'yt/cpp/mapreduce/interface/protobuf_format.cpp')
| -rw-r--r-- | yt/cpp/mapreduce/interface/protobuf_format.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/yt/cpp/mapreduce/interface/protobuf_format.cpp b/yt/cpp/mapreduce/interface/protobuf_format.cpp index 4962e85fc81..65090aa4d5b 100644 --- a/yt/cpp/mapreduce/interface/protobuf_format.cpp +++ b/yt/cpp/mapreduce/interface/protobuf_format.cpp @@ -1102,18 +1102,29 @@ NTi::TTypePtr CreateStruct(TStringBuf fieldName, TVector<TMember> members) TMaybe<TVector<TString>> InferColumnFilter(const ::google::protobuf::Descriptor& descriptor) { - auto isOtherColumns = [] (const ::google::protobuf::FieldDescriptor& field) { - return GetFieldOptions(&field).Type == EProtobufType::OtherColumns; + auto isOtherColumns = [] (const ::google::protobuf::FieldDescriptor* field) { + return GetFieldOptions(field).Type == EProtobufType::OtherColumns; + }; + auto isEmbeddedColumn = [] (const ::google::protobuf::FieldDescriptor* field) { + return GetFieldOptions(field).SerializationMode == EProtobufSerializationMode::Embedded; }; TVector<TString> result; result.reserve(descriptor.field_count()); for (int i = 0; i < descriptor.field_count(); ++i) { - const auto& field = *descriptor.field(i); + auto field = descriptor.field(i); if (isOtherColumns(field)) { return {}; } - result.push_back(GetColumnName(field)); + if (isEmbeddedColumn(field) && field->message_type() != nullptr) { + auto embeddedFilter = InferColumnFilter(*field->message_type()); + if (!embeddedFilter) { + return {}; + } + result.insert(result.end(), embeddedFilter->begin(), embeddedFilter->end()); + } else { + result.push_back(GetColumnName(*field)); + } } return result; } |
