| 222 | */ |
| 223 | template <class TTObjectsDataProvider> |
| 224 | TIntrusivePtr<TDataProviderTemplate<TTObjectsDataProvider>> MakeDataProvider( |
| 225 | TMaybe<TObjectsGroupingPtr> objectsGrouping, // if undefined ObjectsGrouping created from data |
| 226 | TBuilderData<typename TTObjectsDataProvider::TData>&& builderData, |
| 227 | bool skipCheck, |
| 228 | bool forceUnitAutoPairWeights, |
| 229 | NPar::ILocalExecutor* localExecutor |
| 230 | ) { |
| 231 | if (!skipCheck) { |
| 232 | /* most likely have been already checked, but call it here for consistency with |
| 233 | * overall checking logic |
| 234 | */ |
| 235 | builderData.MetaInfo.Validate(); |
| 236 | } |
| 237 | |
| 238 | TIntrusivePtr<TTObjectsDataProvider> objectsData; |
| 239 | |
| 240 | auto makeObjectsDataProvider = [&] () { |
| 241 | objectsData = MakeIntrusive<TTObjectsDataProvider>( |
| 242 | objectsGrouping, |
| 243 | std::move(builderData.CommonObjectsData), |
| 244 | std::move(builderData.ObjectsData), |
| 245 | skipCheck, |
| 246 | localExecutor |
| 247 | ); |
| 248 | }; |
| 249 | |
| 250 | TVector<std::function<void()>> tasks; |
| 251 | |
| 252 | /* if objectsGrouping is defined we can run objectsData and target data creation in parallel |
| 253 | * otherwise create grouping in objectsDataProvider first and then pass it to target constructor |
| 254 | */ |
| 255 | if (objectsGrouping) { |
| 256 | tasks.emplace_back(makeObjectsDataProvider); |
| 257 | } else { |
| 258 | makeObjectsDataProvider(); |
| 259 | objectsGrouping = objectsData->GetObjectsGrouping(); |
| 260 | } |
| 261 | |
| 262 | // TMaybe - to defer initialization to async task |
| 263 | TMaybe<TRawTargetDataProvider> rawTargetData; |
| 264 | |
| 265 | tasks.emplace_back( |
| 266 | [&] () { |
| 267 | rawTargetData = MakeMaybe<TRawTargetDataProvider>( |
| 268 | *objectsGrouping, |
| 269 | std::move(builderData.TargetData), |
| 270 | skipCheck, |
| 271 | forceUnitAutoPairWeights, |
| 272 | localExecutor |
| 273 | ); |
| 274 | } |
| 275 | ); |
| 276 | |
| 277 | ExecuteTasksInParallel(&tasks, localExecutor); |
| 278 | |
| 279 | |
| 280 | return MakeIntrusive<TDataProviderTemplate<TTObjectsDataProvider>>( |
| 281 | std::move(builderData.MetaInfo), // assuming copying it is not very expensive |
nothing calls this directly
no test coverage detected