summaryrefslogtreecommitdiffstats
path: root/yt/cpp/mapreduce/interface/protobuf_format.cpp
diff options
context:
space:
mode:
authorermolovd <[email protected]>2025-10-21 15:26:11 +0300
committerermolovd <[email protected]>2025-10-21 16:00:22 +0300
commit65b8155bcc5ec62f732e1adb11af8f6a34c5bb50 (patch)
tree6db0287ba483131ca102992c3088bbecef6150f4 /yt/cpp/mapreduce/interface/protobuf_format.cpp
parent1577dd56ef2543ebadd158d172af102a4f121481 (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.cpp19
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;
}