package com.linkedin.thirdeye.datalayer.bao;
import java.util.ArrayList;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.linkedin.thirdeye.anomaly.merge.AnomalyMergeConfig;
import com.linkedin.thirdeye.anomaly.merge.AnomalyTimeBasedSummarizer;
import com.linkedin.thirdeye.constant.AnomalyFeedbackType;
import com.linkedin.thirdeye.constant.FeedbackStatus;
import com.linkedin.thirdeye.datalayer.dto.AnomalyFeedbackDTO;
import com.linkedin.thirdeye.datalayer.dto.AnomalyFunctionDTO;
import com.linkedin.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
import com.linkedin.thirdeye.datalayer.dto.RawAnomalyResultDTO;
public class TestMergedAnomalyResultManager extends AbstractManagerTestBase {
MergedAnomalyResultDTO mergedResult = null;
Long anomalyResultId;
AnomalyFunctionDTO function = getTestFunctionSpec("metric", "dataset");
@BeforeClass
void beforeClass() {
super.init();
}
@AfterClass(alwaysRun = true)
void afterClass() {
super.cleanup();
}
@Test
public void testMergedResultCRUD() {
anomalyFunctionDAO.save(function);
Assert.assertNotNull(function.getId());
// create anomaly result
RawAnomalyResultDTO result = getAnomalyResult();
result.setFunction(function);
rawAnomalyResultDAO.save(result);
RawAnomalyResultDTO resultRet = rawAnomalyResultDAO.findById(result.getId());
Assert.assertEquals(resultRet.getFunction(), function);
anomalyResultId = result.getId();
// Let's create merged result
List<RawAnomalyResultDTO> rawResults = new ArrayList<>();
rawResults.add(result);
AnomalyMergeConfig mergeConfig = new AnomalyMergeConfig();
List<MergedAnomalyResultDTO> mergedResults = AnomalyTimeBasedSummarizer
.mergeAnomalies(rawResults, mergeConfig.getMaxMergeDurationLength(),
mergeConfig.getSequentialAllowedGap());
Assert.assertEquals(mergedResults.get(0).getStartTime(), (long) result.getStartTime());
Assert.assertEquals(mergedResults.get(0).getEndTime(), (long) result.getEndTime());
Assert.assertEquals(mergedResults.get(0).getAnomalyResults().get(0), result);
// Let's persist the merged result
mergedResults.get(0).setDimensions(result.getDimensions());
mergedAnomalyResultDAO.save(mergedResults.get(0));
mergedResult = mergedResults.get(0);
Assert.assertNotNull(mergedResult.getId());
// verify the merged result
MergedAnomalyResultDTO mergedResultById = mergedAnomalyResultDAO.findById(mergedResult.getId());
Assert.assertEquals(mergedResultById.getAnomalyResults(), rawResults);
Assert.assertEquals(mergedResultById.getAnomalyResults().get(0).getId(), anomalyResultId);
Assert.assertEquals(mergedResultById.getDimensions(), result.getDimensions());
List<MergedAnomalyResultDTO> mergedResultsByMetricDimensionsTime = mergedAnomalyResultDAO
.findByCollectionMetricDimensionsTime(mergedResult.getCollection(), mergedResult.getMetric(),
mergedResult.getDimensions().toString(), 0, System.currentTimeMillis(), true);
Assert.assertEquals(mergedResultsByMetricDimensionsTime.get(0), mergedResult);
}
@Test(dependsOnMethods = {"testMergedResultCRUD"})
public void testFeedback() {
MergedAnomalyResultDTO anomalyMergedResult = mergedAnomalyResultDAO.findById(mergedResult.getId());
AnomalyFeedbackDTO feedback = new AnomalyFeedbackDTO();
feedback.setComment("this is a good find");
feedback.setFeedbackType(AnomalyFeedbackType.ANOMALY);
feedback.setStatus(FeedbackStatus.NEW);
anomalyMergedResult.setFeedback(feedback);
// now we need to make explicit call to anomaly update in order to update the feedback
mergedAnomalyResultDAO.updateAnomalyFeedback(anomalyMergedResult);
//verify feedback
MergedAnomalyResultDTO mergedResult1 = mergedAnomalyResultDAO.findById(mergedResult.getId());
Assert.assertEquals(mergedResult1.getAnomalyResults().get(0).getId(), anomalyResultId);
Assert.assertEquals(mergedResult1.getFeedback().getFeedbackType(), AnomalyFeedbackType.ANOMALY);
}
}