@@ -103,26 +103,24 @@ class TKqpIndexLookupJoinWrapper : public TMutableComputationNode<TKqpIndexLooku
103
103
};
104
104
105
105
NUdf::TUnboxedValue FillResultItems (NUdf::TUnboxedValue leftRow, NUdf::TUnboxedValue rightRow, EOutputMode mode) {
106
- auto resultRowSize = (mode == EOutputMode::OnlyLeftRow) ? Self->LeftColumnsCount
107
- : Self->LeftColumnsCount + Self->RightColumnsCount ;
106
+ auto resultRowSize = (mode == EOutputMode::OnlyLeftRow) ? Self->LeftColumnsIndices . size ()
107
+ : Self->LeftColumnsIndices . size () + Self->RightColumnsIndices . size () ;
108
108
auto resultRow = Self->ResultRowCache .NewArray (Ctx, resultRowSize, ResultItems);
109
109
110
- size_t resIdx = 0 ;
111
-
112
110
if (mode == EOutputMode::OnlyLeftRow || mode == EOutputMode::Both) {
113
- for (size_t i = 0 ; i < Self->LeftColumnsCount ; ++i) {
114
- ResultItems[resIdx++ ] = std::move (leftRow.GetElement (i));
111
+ for (size_t i = 0 ; i < Self->LeftColumnsIndices . size () ; ++i) {
112
+ ResultItems[Self-> LeftColumnsIndices [i] ] = std::move (leftRow.GetElement (i));
115
113
}
116
114
}
117
115
118
116
if (mode == EOutputMode::Both) {
119
117
if (rightRow.HasValue ()) {
120
- for (size_t i = 0 ; i < Self->RightColumnsCount ; ++i) {
121
- ResultItems[resIdx++ ] = std::move (rightRow.GetElement (i));
118
+ for (size_t i = 0 ; i < Self->RightColumnsIndices . size () ; ++i) {
119
+ ResultItems[Self-> RightColumnsIndices [i] ] = std::move (rightRow.GetElement (i));
122
120
}
123
121
} else {
124
- for (size_t i = 0 ; i < Self->RightColumnsCount ; ++i) {
125
- ResultItems[resIdx++ ] = NUdf::TUnboxedValuePod ();
122
+ for (size_t i = 0 ; i < Self->RightColumnsIndices . size () ; ++i) {
123
+ ResultItems[Self-> RightColumnsIndices [i] ] = NUdf::TUnboxedValuePod ();
126
124
}
127
125
}
128
126
}
@@ -189,12 +187,12 @@ class TKqpIndexLookupJoinWrapper : public TMutableComputationNode<TKqpIndexLooku
189
187
190
188
public:
191
189
TKqpIndexLookupJoinWrapper (TComputationMutables& mutables, IComputationNode* inputNode,
192
- EJoinKind joinType, ui64 leftColumnsCount, ui64 rightColumnsCount )
190
+ EJoinKind joinType, TVector<ui32>&& leftColumnsIndices, TVector<ui32>&& rightColumnsIndices )
193
191
: TMutableComputationNode<TKqpIndexLookupJoinWrapper>(mutables)
194
192
, InputNode(inputNode)
195
193
, JoinType(joinType)
196
- , LeftColumnsCount(leftColumnsCount )
197
- , RightColumnsCount(rightColumnsCount )
194
+ , LeftColumnsIndices(std::move(leftColumnsIndices) )
195
+ , RightColumnsIndices(std::move(rightColumnsIndices) )
198
196
, ResultRowCache(mutables) {
199
197
}
200
198
@@ -210,8 +208,8 @@ class TKqpIndexLookupJoinWrapper : public TMutableComputationNode<TKqpIndexLooku
210
208
private:
211
209
IComputationNode* InputNode;
212
210
const EJoinKind JoinType;
213
- const ui64 LeftColumnsCount ;
214
- const ui64 RightColumnsCount ;
211
+ const TVector<ui32> LeftColumnsIndices ;
212
+ const TVector<ui32> RightColumnsIndices ;
215
213
const TContainerCacheOnContext ResultRowCache;
216
214
};
217
215
@@ -236,10 +234,26 @@ IComputationNode* WrapKqpIndexLookupJoin(TCallable& callable, const TComputation
236
234
237
235
auto inputNode = LocateNode (ctx.NodeLocator , callable, 0 );
238
236
ui32 joinKind = AS_VALUE (TDataLiteral, callable.GetInput (1 ))->AsValue ().Get <ui32>();
239
- ui64 leftColumnsCount = AS_VALUE (TDataLiteral, callable.GetInput (2 ))->AsValue ().Get <ui64>();
240
- ui64 rightColumnsCount = AS_VALUE (TDataLiteral, callable.GetInput (3 ))->AsValue ().Get <ui64>();
237
+ auto leftColumnsIndicesMap = AS_VALUE (TDictLiteral, callable.GetInput (2 ));
238
+ auto rightColumnsIndicesMap = AS_VALUE (TDictLiteral, callable.GetInput (3 ));
239
+
240
+ TVector<ui32> leftColumnsIndices (leftColumnsIndicesMap->GetItemsCount ());
241
+ for (ui32 i = 0 ; i < leftColumnsIndicesMap->GetItemsCount (); ++i) {
242
+ auto item = leftColumnsIndicesMap->GetItem (i);
243
+ ui32 leftIndex = AS_VALUE (TDataLiteral, item.first )->AsValue ().Get <ui32>();
244
+ ui32 resultIndex = AS_VALUE (TDataLiteral, item.second )->AsValue ().Get <ui32>();
245
+ leftColumnsIndices[leftIndex] = resultIndex;
246
+ }
247
+
248
+ TVector<ui32> rightColumnsIndices (rightColumnsIndicesMap->GetItemsCount ());
249
+ for (ui32 i = 0 ; i < rightColumnsIndicesMap->GetItemsCount (); ++i) {
250
+ auto item = rightColumnsIndicesMap->GetItem (i);
251
+ ui32 rightIndex = AS_VALUE (TDataLiteral, item.first )->AsValue ().Get <ui32>();
252
+ ui32 resultIndex = AS_VALUE (TDataLiteral, item.second )->AsValue ().Get <ui32>();
253
+ rightColumnsIndices[rightIndex] = resultIndex;
254
+ }
241
255
242
- return new TKqpIndexLookupJoinWrapper (ctx.Mutables , inputNode, GetJoinKind (joinKind), leftColumnsCount, rightColumnsCount );
256
+ return new TKqpIndexLookupJoinWrapper (ctx.Mutables , inputNode, GetJoinKind (joinKind), std::move (leftColumnsIndices), std::move (rightColumnsIndices) );
243
257
}
244
258
245
259
} // namespace NMiniKQL
0 commit comments