From bce790ff2a3390376c84f11b456c867331c62ecf Mon Sep 17 00:00:00 2001 From: yumkam Date: Fri, 16 Aug 2024 14:13:05 +0300 Subject: [PATCH] dq_input_transform_lookup: fix indexes for left-side lookup key (#7727) --- .../dq_input_transform_lookup.cpp | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ydb/library/yql/dq/actors/input_transforms/dq_input_transform_lookup.cpp b/ydb/library/yql/dq/actors/input_transforms/dq_input_transform_lookup.cpp index 4633cbdd44ec..646f49130507 100644 --- a/ydb/library/yql/dq/actors/input_transforms/dq_input_transform_lookup.cpp +++ b/ydb/library/yql/dq/actors/input_transforms/dq_input_transform_lookup.cpp @@ -383,6 +383,25 @@ THashMap GetNameToIndex(const ::google::protobuf::RepeatedPt return result; } +THashMap GetNameToIndex(const NMiniKQL::TStructType* type) { + THashMap result; + for (ui32 i = 0; i != type->GetMembersCount(); ++i) { + result[type->GetMemberName(i)] = i; + } + return result; +} + +TVector GetJoinColumnIndexes(const ::google::protobuf::RepeatedPtrField& names, const THashMap& joinColumns) { + TVector result; + result.reserve(joinColumns.size()); + for (int i = 0; i != names.size(); ++i) { + if (auto p = joinColumns.FindPtr(names[i])) { + result.push_back(*p); + } + } + return result; +} + TVector GetJoinColumnIndexes(const NMiniKQL::TStructType* type, const THashMap& joinColumns) { TVector result; result.reserve(joinColumns.size()); @@ -410,14 +429,15 @@ std::pair CreateInputTransformStre const auto rightRowType = DeserializeStructType(settings.GetRightSource().GetSerializedRowType(), args.TypeEnv); - auto leftJoinColumns = GetNameToIndex(settings.GetLeftJoinKeyNames()); + auto inputColumns = GetNameToIndex(narrowInputRowType); auto rightJoinColumns = GetNameToIndex(settings.GetRightJoinKeyNames()); - Y_ABORT_UNLESS(leftJoinColumns.size() == rightJoinColumns.size()); - auto leftJoinColumnIndexes = GetJoinColumnIndexes(narrowInputRowType, leftJoinColumns); - Y_ABORT_UNLESS(leftJoinColumnIndexes.size() == leftJoinColumns.size()); + auto leftJoinColumnIndexes = GetJoinColumnIndexes( + settings.GetLeftJoinKeyNames(), + inputColumns); auto rightJoinColumnIndexes = GetJoinColumnIndexes(rightRowType, rightJoinColumns); Y_ABORT_UNLESS(rightJoinColumnIndexes.size() == rightJoinColumns.size()); + Y_ABORT_UNLESS(leftJoinColumnIndexes.size() == rightJoinColumnIndexes.size()); const auto& [lookupKeyType, lookupPayloadType] = SplitLookupTableColumns(rightRowType, rightJoinColumns, args.TypeEnv); const auto& outputColumnsOrder = CategorizeOutputRowItems(