| 1084 | |
| 1085 | |
| 1086 | void NCB::GetGroupInfosSubset( |
| 1087 | TConstArrayRef<TQueryInfo> src, |
| 1088 | const TObjectsGroupingSubset& objectsGroupingSubset, |
| 1089 | NPar::ILocalExecutor* localExecutor, |
| 1090 | TVector<TQueryInfo>* dstSubset |
| 1091 | ) { |
| 1092 | const TObjectsGrouping& dstSubsetGrouping = *(objectsGroupingSubset.GetSubsetGrouping()); |
| 1093 | |
| 1094 | // resize, not yresize because TQueryInfo is not POD type |
| 1095 | dstSubset->resize(dstSubsetGrouping.GetGroupCount()); |
| 1096 | |
| 1097 | if (dstSubsetGrouping.GetGroupCount() != 0) { |
| 1098 | const auto& subsetObjectsIndexing = objectsGroupingSubset.GetObjectsIndexing(); |
| 1099 | |
| 1100 | TConstArrayRef<ui32> indexedSubset; |
| 1101 | TVector<ui32> indexedSubsetStorage; |
| 1102 | if (std::holds_alternative<TIndexedSubset<ui32>>(subsetObjectsIndexing)) { |
| 1103 | indexedSubset = subsetObjectsIndexing.Get<TIndexedSubset<ui32>>(); |
| 1104 | } else { |
| 1105 | indexedSubsetStorage.yresize(subsetObjectsIndexing.Size()); |
| 1106 | subsetObjectsIndexing.ParallelForEach( |
| 1107 | [&](ui32 idx, ui32 srcIdx) { indexedSubsetStorage[idx] = srcIdx; }, |
| 1108 | localExecutor |
| 1109 | ); |
| 1110 | indexedSubset = indexedSubsetStorage; |
| 1111 | } |
| 1112 | |
| 1113 | |
| 1114 | // CB_ENSURE inside is ok, groups must be nontrivial if there is groupInfo data in some targets |
| 1115 | TConstArrayRef<TGroupBounds> dstSubsetGroupBounds = dstSubsetGrouping.GetNonTrivialGroups(); |
| 1116 | |
| 1117 | objectsGroupingSubset.GetGroupsIndexing().ParallelForEach( |
| 1118 | [&] (ui32 dstGroupIdx, ui32 srcGroupIdx) { |
| 1119 | const auto& srcGroupData = src[srcGroupIdx]; |
| 1120 | auto& dstGroupData = (*dstSubset)[dstGroupIdx]; |
| 1121 | ((TGroupBounds&)dstGroupData) = dstSubsetGroupBounds[dstGroupIdx]; |
| 1122 | |
| 1123 | dstGroupData.Weight = srcGroupData.Weight; |
| 1124 | |
| 1125 | auto getSrcIdxInGroup = [&](ui32 dstIdxInGroup) { |
| 1126 | return indexedSubset[dstGroupData.Begin + dstIdxInGroup] - srcGroupData.Begin; |
| 1127 | }; |
| 1128 | |
| 1129 | if (!srcGroupData.SubgroupId.empty()) { |
| 1130 | dstGroupData.SubgroupId.yresize(dstGroupData.GetSize()); |
| 1131 | for (auto dstIdxInGroup : xrange(dstGroupData.GetSize())) { |
| 1132 | dstGroupData.SubgroupId[dstIdxInGroup] = |
| 1133 | srcGroupData.SubgroupId[getSrcIdxInGroup(dstIdxInGroup)]; |
| 1134 | } |
| 1135 | } |
| 1136 | if (!srcGroupData.Competitors.empty()) { |
| 1137 | // srcIdxInGroup -> dstIdxInGroup |
| 1138 | TVector<ui32> invertedGroupPermutation; |
| 1139 | invertedGroupPermutation.yresize(dstGroupData.GetSize()); |
| 1140 | for (auto dstIdxInGroup : xrange(dstGroupData.GetSize())) { |
| 1141 | invertedGroupPermutation[getSrcIdxInGroup(dstIdxInGroup)] = dstIdxInGroup; |
| 1142 | } |
| 1143 |
nothing calls this directly
no test coverage detected