@@ -48,7 +48,11 @@ TVector<TExprBase> CreateColumnsToSelectToUpdateIndex(
48
48
return columnsToSelect;
49
49
}
50
50
51
- TDqPhyPrecompute PrecomputeDict (const TCondenseInputResult& condenseResult, TPositionHandle pos, TExprContext& ctx) {
51
+ } // namespace
52
+
53
+ TDqPhyPrecompute PrecomputeCondenseInputResult (const TCondenseInputResult& condenseResult,
54
+ TPositionHandle pos, TExprContext& ctx)
55
+ {
52
56
auto computeDictStage = Build<TDqStage>(ctx, pos)
53
57
.Inputs ()
54
58
.Add (condenseResult.StageInputs )
@@ -70,8 +74,6 @@ TDqPhyPrecompute PrecomputeDict(const TCondenseInputResult& condenseResult, TPos
70
74
.Done ();
71
75
}
72
76
73
- } // namespace
74
-
75
77
TVector<std::pair<TExprNode::TPtr, const TIndexDescription*>> BuildSecondaryIndexVector (
76
78
const TKikimrTableDescription& table,
77
79
TPositionHandle pos,
@@ -127,26 +129,81 @@ TSecondaryIndexes BuildSecondaryIndexVector(const TKikimrTableDescription& table
127
129
}
128
130
129
131
TMaybeNode<TDqPhyPrecompute> PrecomputeTableLookupDict (const TDqPhyPrecompute& lookupKeys,
130
- const TKikimrTableDescription& table, const THashSet<TString >& dataColumns ,
131
- const THashSet<TString>& keyColumns, TPositionHandle pos, TExprContext& ctx)
132
+ const TKikimrTableDescription& table, const TVector<TExprBase >& columnsList ,
133
+ TPositionHandle pos, TExprContext& ctx, bool fixLookupKeys )
132
134
{
133
- auto lookupColumns = CreateColumnsToSelectToUpdateIndex (table.Metadata ->KeyColumnNames , dataColumns,
134
- keyColumns, pos, ctx);
135
-
136
135
auto lookupColumnsList = Build<TCoAtomList>(ctx, pos)
137
- .Add (lookupColumns )
136
+ .Add (columnsList )
138
137
.Done ();
139
138
139
+ TExprNode::TPtr keys;
140
+
141
+ // we need to left only table key columns to perform lookup
142
+ // unfortunately we can't do it inside lookup stage
143
+ if (fixLookupKeys) {
144
+ auto keyArg = TCoArgument (ctx.NewArgument (pos, " key" ));
145
+ auto keysList = TCoArgument (ctx.NewArgument (pos, " keys_list" ));
146
+ TVector<TExprBase> keyLookupTuples;
147
+ keyLookupTuples.reserve (table.Metadata ->KeyColumnNames .size ());
148
+
149
+ for (const auto & key : table.Metadata ->KeyColumnNames ) {
150
+ keyLookupTuples.emplace_back (
151
+ Build<TCoNameValueTuple>(ctx, pos)
152
+ .Name ().Build (key)
153
+ .Value <TCoMember>()
154
+ .Struct (keyArg)
155
+ .Name ().Build (key)
156
+ .Build ()
157
+ .Done ());
158
+ }
159
+
160
+ auto list = Build<TCoToStream>(ctx, pos)
161
+ .Input <TCoJust>()
162
+ .Input <TCoMap>()
163
+ .Input (keysList)
164
+ .Lambda ()
165
+ .Args ({keyArg})
166
+ .Body <TCoAsStruct>()
167
+ .Add (keyLookupTuples)
168
+ .Build ()
169
+ .Build ()
170
+ .Build ()
171
+ .Build ()
172
+ .Done ().Ptr ();
173
+
174
+ keys = Build<TDqStage>(ctx, pos)
175
+ .Inputs ()
176
+ .Add (lookupKeys)
177
+ .Build ()
178
+ .Program ()
179
+ .Args ({keysList})
180
+ .Body (list)
181
+ .Build ()
182
+ .Settings ().Build ()
183
+ .Done ().Ptr ();
184
+
185
+ keys = Build<TDqPhyPrecompute>(ctx, pos)
186
+ .Connection <TDqCnValue>()
187
+ .Output ()
188
+ .Stage (keys)
189
+ .Index ().Build (" 0" )
190
+ .Build ()
191
+ .Build ()
192
+ .Done ().Ptr ();
193
+ } else {
194
+ keys = lookupKeys.Ptr ();
195
+ }
196
+
140
197
auto lookupStage = Build<TDqStage>(ctx, pos)
141
198
.Inputs ()
142
- .Add (lookupKeys )
199
+ .Add (keys )
143
200
.Build ()
144
201
.Program ()
145
- .Args ({" keys_list " })
202
+ .Args ({" keys_stage_arg " })
146
203
.Body <TKqpLookupTable>()
147
204
.Table (BuildTableMeta (table, pos, ctx))
148
205
.LookupKeys <TCoIterator>()
149
- .List (" keys_list " )
206
+ .List (" keys_stage_arg " )
150
207
.Build ()
151
208
.Columns (lookupColumnsList)
152
209
.Build ()
@@ -167,7 +224,17 @@ TMaybeNode<TDqPhyPrecompute> PrecomputeTableLookupDict(const TDqPhyPrecompute& l
167
224
return {};
168
225
}
169
226
170
- return PrecomputeDict (*condenseLookupResult, lookupKeys.Pos (), ctx);
227
+ return PrecomputeCondenseInputResult (*condenseLookupResult, lookupKeys.Pos (), ctx);
228
+ }
229
+
230
+ TMaybeNode<TDqPhyPrecompute> PrecomputeTableLookupDict (const TDqPhyPrecompute& lookupKeys,
231
+ const TKikimrTableDescription& table, const THashSet<TString>& dataColumns,
232
+ const THashSet<TString>& keyColumns, TPositionHandle pos, TExprContext& ctx)
233
+ {
234
+ auto lookupColumns = CreateColumnsToSelectToUpdateIndex (table.Metadata ->KeyColumnNames , dataColumns,
235
+ keyColumns, pos, ctx);
236
+
237
+ return PrecomputeTableLookupDict (lookupKeys, table, lookupColumns, pos, ctx, false );
171
238
}
172
239
173
240
TExprBase MakeRowsFromDict (const TDqPhyPrecompute& dict, const TVector<TString>& dictKeys,
0 commit comments