@@ -51,7 +51,7 @@ class TInputTransformStreamLookupBase
5151 , LookupJoinColumns(std::move(lookupJoinColumns))
5252 , InputRowType(inputRowType)
5353 , LookupKeyType(lookupKeyType)
54- , KeyTypeHelper(lookupKeyType)
54+ , KeyTypeHelper(std::make_shared<IDqAsyncLookupSource::TKeyTypeHelper>( lookupKeyType) )
5555 , LookupPayloadType(lookupPayloadType)
5656 , OutputRowType(outputRowType)
5757 , OutputRowColumnOrder(outputRowColumnOrder)
@@ -67,6 +67,7 @@ class TInputTransformStreamLookupBase
6767 Become (&TInputTransformStreamLookupBase::StateFunc);
6868 NDq::IDqAsyncIoFactory::TLookupSourceArguments lookupSourceArgs {
6969 .Alloc = Alloc,
70+ .KeyTypeHelper = KeyTypeHelper,
7071 .ParentId = SelfId (),
7172 .LookupSource = Settings.GetRightSource ().GetLookupSource (),
7273 .KeyType = LookupKeyType,
@@ -90,30 +91,15 @@ class TInputTransformStreamLookupBase
9091
9192 void Handle (IDqAsyncLookupSource::TEvLookupResult::TPtr ev) {
9293 auto guard = BindAllocator ();
93- THashMap<
94- NUdf::TUnboxedValue,
95- NUdf::TUnboxedValue,
96- NKikimr::NMiniKQL::TValueHasher,
97- NKikimr::NMiniKQL::TValueEqual,
98- NKikimr::NMiniKQL::TMKQLAllocator<std::pair<const NUdf::TUnboxedValue, NUdf::TUnboxedValue>>
99- > map (
100- ev->Get ()->Data .size (),
101- KeyTypeHelper.GetValueHash (),
102- KeyTypeHelper.GetValueEqual ()
103- );
104- for (auto & r: ev->Get ()->Data ) {
105- Y_ABORT_UNLESS (r.first .IsBoxed ());
106- Y_ABORT_UNLESS (!r.second || r.second .IsBoxed ());
107- map.emplace (std::move (r));
108- }
94+ const auto lookupResult = std::move (ev->Get ()->Result );
10995 while (!AwaitingQueue.empty ()) {
11096 const auto wideInputRow = AwaitingQueue.Head ();
11197 NUdf::TUnboxedValue* keyItems;
11298 NUdf::TUnboxedValue lookupKey = HolderFactory.CreateDirectArrayHolder (InputJoinColumns.size (), keyItems);
11399 for (size_t i = 0 ; i != InputJoinColumns.size (); ++i) {
114100 keyItems[i] = wideInputRow[InputJoinColumns[i]];
115101 }
116- auto lookupPayload = map .FindPtr (lookupKey);
102+ auto lookupPayload = lookupResult .FindPtr (lookupKey);
117103
118104 NUdf::TUnboxedValue* outputRowItems;
119105 NUdf::TUnboxedValue outputRow = HolderFactory.CreateDirectArrayHolder (OutputRowColumnOrder.size (), outputRowItems);
@@ -163,7 +149,7 @@ class TInputTransformStreamLookupBase
163149 auto guard = BindAllocator ();
164150 // All resources, held by this class, that have been created with mkql allocator, must be deallocated here
165151 InputFlow.Clear ();
166- KeyTypeHelper = TKeyTypeHelper{} ;
152+ KeyTypeHelper. reset () ;
167153 NMiniKQL::TUnboxedValueBatch{}.swap (AwaitingQueue);
168154 NMiniKQL::TUnboxedValueBatch{}.swap (ReadyQueue);
169155 }
@@ -180,21 +166,21 @@ class TInputTransformStreamLookupBase
180166 NUdf::TUnboxedValue* inputRowItems;
181167 NUdf::TUnboxedValue inputRow = HolderFactory.CreateDirectArrayHolder (InputRowType->GetElementsCount (), inputRowItems);
182168 const auto maxKeysInRequest = LookupSource.first ->GetMaxSupportedKeysInRequest ();
183- NKikimr::NMiniKQL::TUnboxedValueVector keysForLookup;
169+ IDqAsyncLookupSource::TUnboxedValueMap keysForLookup{maxKeysInRequest, KeyTypeHelper-> GetValueHash (), KeyTypeHelper-> GetValueEqual ()} ;
184170 while (
185171 ((InputFlowFetchStatus = FetchWideInputValue (inputRowItems)) == NUdf::EFetchStatus::Ok) &&
186172 (keysForLookup.size () < maxKeysInRequest)
187173 ) {
188174 NUdf::TUnboxedValue* keyItems;
189- auto key = HolderFactory.CreateDirectArrayHolder (InputJoinColumns.size (), keyItems);
175+ NUdf::TUnboxedValue key = HolderFactory.CreateDirectArrayHolder (InputJoinColumns.size (), keyItems);
190176 for (size_t i = 0 ; i != InputJoinColumns.size (); ++i) {
191177 keyItems[i] = inputRowItems[InputJoinColumns[i]];
192178 }
193- keysForLookup.push_back ( key);
179+ keysForLookup.emplace ( std::move ( key), NUdf::TUnboxedValuePod{} );
194180 AwaitingQueue.PushRow (inputRowItems, InputRowType->GetElementsCount ());
195181 }
196182 if (!keysForLookup.empty ()) {
197- LookupSource.first ->AsyncLookup (keysForLookup);
183+ LookupSource.first ->AsyncLookup (std::move ( keysForLookup) );
198184 WaitingForLookupResults = true ;
199185 }
200186 }
@@ -241,8 +227,7 @@ class TInputTransformStreamLookupBase
241227 const TVector<size_t > LookupJoinColumns;
242228 const NMiniKQL::TMultiType* const InputRowType;
243229 const NMiniKQL::TStructType* const LookupKeyType; // key column types in LookupTable
244- using TKeyTypeHelper = NKikimr::NMiniKQL::TKeyTypeContanerHelper<true , true , false >;
245- TKeyTypeHelper KeyTypeHelper;
230+ std::shared_ptr<IDqAsyncLookupSource::TKeyTypeHelper> KeyTypeHelper;
246231 const NMiniKQL::TStructType* const LookupPayloadType; // other column types in LookupTable
247232 const NMiniKQL::TMultiType* const OutputRowType;
248233 const TOutputRowColumnOrder OutputRowColumnOrder;
0 commit comments