package com.linkedin.thirdeye.anomaly.alert.grouping;
import com.linkedin.thirdeye.api.DimensionMap;
import com.linkedin.thirdeye.datalayer.dto.GroupedAnomalyResultsDTO;
import com.linkedin.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* This class simply merges the new GroupedAnomaly with recent GroupedAnomaly regardless the gap of time between them.
*/
public class SimpleGroupedAnomalyMerger {
public static Map<DimensionMap, GroupedAnomalyResultsDTO> timeBasedMergeGroupedAnomalyResults(
Map<DimensionMap, GroupedAnomalyResultsDTO> recentGroupedAnomaly,
Map<DimensionMap, GroupedAnomalyResultsDTO> newGroupedAnomalies) {
Map<DimensionMap, GroupedAnomalyResultsDTO> updatedGroupedAnomalies = new HashMap<>();
for (Map.Entry<DimensionMap, GroupedAnomalyResultsDTO> groupedAnomalyEntry : newGroupedAnomalies.entrySet()) {
// Retrieve the most recent anomaly for the same dimension
GroupedAnomalyResultsDTO mostRecentGroupedAnomaly = recentGroupedAnomaly.get(groupedAnomalyEntry.getKey());
// Merge grouped anomalies
GroupedAnomalyResultsDTO updatedGroupedAnomaly;
if (mostRecentGroupedAnomaly != null) {
List<MergedAnomalyResultDTO> mergedAnomalyResults = mostRecentGroupedAnomaly.getAnomalyResults();
Set<Long> existingMergedAnomalyId = new HashSet<>();
for (MergedAnomalyResultDTO mergedAnomalyResult : mergedAnomalyResults) {
existingMergedAnomalyId.add(mergedAnomalyResult.getId());
}
for (MergedAnomalyResultDTO newMergedAnomaly : groupedAnomalyEntry.getValue().getAnomalyResults()) {
if (!existingMergedAnomalyId.contains(newMergedAnomaly.getId())) {
mergedAnomalyResults.add(newMergedAnomaly);
existingMergedAnomalyId.add(newMergedAnomaly.getId());
}
}
updatedGroupedAnomaly = mostRecentGroupedAnomaly;
} else {
updatedGroupedAnomaly = groupedAnomalyEntry.getValue();
}
updatedGroupedAnomalies.put(groupedAnomalyEntry.getKey(), updatedGroupedAnomaly);
}
return updatedGroupedAnomalies;
}
}