in packages/@aws-c2a/engine/lib/aggregations/aggregations-extractor.ts [58:86]
private static findAggsIntersections<T>(groups: Aggregation<T>[]): Aggregation<T>[]{
const resultingIntersections: Record<string, Aggregation<T>> = {};
const indexGetter = (originalAggs: number[]) => originalAggs.join(',');
for(let agg = 0; agg< groups.length; agg++){ // for each original Agg
for(const operation of [...groups[agg].entities]){ // each operation in Agg
const aggsContainingOperation: number[] = [agg];
for(let agg2 = agg+1; agg2 < groups.length; agg2++){ // check all other original Aggs for same operation
if(groups[agg2].entities.has(operation)){
aggsContainingOperation.push(agg2); // add it to the intersection identifier
groups[agg2].entities.delete(operation);
}
}
if(aggsContainingOperation.length > 1){
const intersectionIndex = indexGetter(aggsContainingOperation);
if(!resultingIntersections[intersectionIndex]){
resultingIntersections[intersectionIndex] = {
entities: new Set([operation]),
characteristics: Object.assign({}, ...aggsContainingOperation.map(i => groups[i].characteristics)),
};
} else {
resultingIntersections[intersectionIndex].entities.add(operation);
}
groups[agg].entities.delete(operation);
}
}
}
return [...groups, ...Object.values(resultingIntersections)].filter(agg => agg.entities.size > 0);
}