You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ji...@apache.org on 2020/07/29 23:12:37 UTC

[incubator-pinot] 02/03: anomaly searcher

This is an automated email from the ASF dual-hosted git repository.

jihao pushed a commit to branch anomalies-pagination
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git

commit d37df19fe9baa1633499a5db30c88a75e851c212
Author: Jihao Zhang <ji...@linkedin.com>
AuthorDate: Wed Jul 29 16:06:53 2020 -0700

    anomaly searcher
---
 .../thirdeye/constant/AnomalyFeedbackType.java     |  2 +-
 .../v2/anomalies/AnomalySearchFilter.java          | 18 ++++++++++-----
 .../v2/anomalies/AnomalySearchResource.java        |  8 +++----
 .../resources/v2/anomalies/AnomalySearcher.java    | 26 +++++++++++++++++-----
 .../datalayer/entity/MergedAnomalyResultIndex.java |  6 ++---
 .../src/main/resources/schema/create-schema.sql    |  2 +-
 6 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/constant/AnomalyFeedbackType.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/constant/AnomalyFeedbackType.java
index c6c7bfa..93675dd 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/constant/AnomalyFeedbackType.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/constant/AnomalyFeedbackType.java
@@ -47,4 +47,4 @@ public enum AnomalyFeedbackType {
   public boolean isUnresolved() {
     return this.equals(NO_FEEDBACK);
   }
-}
+}
\ No newline at end of file
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchFilter.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchFilter.java
index 1ff7de8..fbc17e8 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchFilter.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchFilter.java
@@ -9,11 +9,12 @@ public class AnomalySearchFilter {
   private final List<String> detectionNames;
   private final List<String> metrics;
   private final List<String> datasets;
-  private final long startTime;
-  private final long endTime;
+  private final List<Long> anomalyIds;
+  private final Long startTime;
+  private final Long endTime;
 
-  public AnomalySearchFilter(long startTime, long endTime, List<String> feedbacks, List<String> subscriptionGroups, List<String> detectionNames,
-      List<String> metrics, List<String> datasets) {
+  public AnomalySearchFilter(Long startTime, Long endTime, List<String> feedbacks, List<String> subscriptionGroups, List<String> detectionNames,
+      List<String> metrics, List<String> datasets, List<Long> anomalyIds) {
     this.feedbacks = feedbacks;
     this.subscriptionGroups = subscriptionGroups;
     this.detectionNames = detectionNames;
@@ -21,13 +22,14 @@ public class AnomalySearchFilter {
     this.datasets = datasets;
     this.startTime = startTime;
     this.endTime = endTime;
+    this.anomalyIds = anomalyIds;
   }
 
-  public long getStartTime() {
+  public Long getStartTime() {
     return startTime;
   }
 
-  public long getEndTime() {
+  public Long getEndTime() {
     return endTime;
   }
 
@@ -50,4 +52,8 @@ public class AnomalySearchFilter {
   public List<String> getDatasets() {
     return datasets;
   }
+
+  public List<Long> getAnomalyIds() {
+    return anomalyIds;
+  }
 }
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchResource.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchResource.java
index adfa5f9..74772a6 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchResource.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearchResource.java
@@ -28,13 +28,13 @@ public class AnomalySearchResource {
   @Produces(MediaType.APPLICATION_JSON)
   @ApiOperation("Search and paginate anomalies according to the parameters")
   public Response findAlerts(@QueryParam("limit") @DefaultValue("10") int limit,
-      @QueryParam("offset") @DefaultValue("0") int offset, @QueryParam("startTime") long startTime,
-      @QueryParam("endTime") long endTime, @QueryParam("feedbackStatus") List<String> feedbacks,
+      @QueryParam("offset") @DefaultValue("0") int offset, @QueryParam("startTime") Long startTime,
+      @QueryParam("endTime") Long endTime, @QueryParam("feedbackStatus") List<String> feedbacks,
       @QueryParam("subscriptionGroup") List<String> subscriptionGroups,
       @QueryParam("detectionName") List<String> detectionNames, @QueryParam("metric") List<String> metrics,
-      @QueryParam("dataset") List<String> datasets) {
+      @QueryParam("dataset") List<String> datasets, @QueryParam("anomalyId") List<Long> anomalyIds) {
     AnomalySearchFilter searchFilter =
-        new AnomalySearchFilter(startTime, endTime, feedbacks, subscriptionGroups, detectionNames, metrics, datasets);
+        new AnomalySearchFilter(startTime, endTime, feedbacks, subscriptionGroups, detectionNames, metrics, datasets, anomalyIds);
     return Response.ok().entity(this.anomalySearcher.search(searchFilter, limit, offset)).build();
   }
 }
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearcher.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearcher.java
index 6efad8f..bc29228 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearcher.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/anomalies/AnomalySearcher.java
@@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -13,6 +14,7 @@ import org.apache.pinot.thirdeye.constant.AnomalyFeedbackType;
 import org.apache.pinot.thirdeye.datalayer.bao.DetectionAlertConfigManager;
 import org.apache.pinot.thirdeye.datalayer.bao.DetectionConfigManager;
 import org.apache.pinot.thirdeye.datalayer.bao.MergedAnomalyResultManager;
+import org.apache.pinot.thirdeye.datalayer.dto.AbstractDTO;
 import org.apache.pinot.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
 import org.apache.pinot.thirdeye.datalayer.pojo.DetectionConfigBean;
 import org.apache.pinot.thirdeye.datalayer.util.Predicate;
@@ -41,9 +43,13 @@ public class AnomalySearcher {
    * @return the result
    */
   public Map<String, Object> search(AnomalySearchFilter searchFilter, int limit, int offset) {
-    Predicate predicate = Predicate.AND(Predicate.LT("startTime", searchFilter.getEndTime()),
-        Predicate.GT("endTime", searchFilter.getStartTime()));
-//, Predicate.NEQ("isChild", false)
+    Predicate predicate = Predicate.EQ("child", false);
+    if (searchFilter.getStartTime() != null) {
+      predicate = Predicate.AND(predicate, Predicate.LT("startTime", searchFilter.getEndTime()));
+    }
+    if (searchFilter.getEndTime() != null) {
+      predicate = Predicate.AND(predicate, Predicate.GT("endTime", searchFilter.getStartTime()));
+    }
     // search by detections or subscription groups
     Set<Long> detectionConfigIds = new HashSet<>();
     Set<Long> subscribedDetectionConfigIds = new HashSet<>();
@@ -89,13 +95,20 @@ public class AnomalySearcher {
     if (!searchFilter.getMetrics().isEmpty()) {
       predicate = Predicate.AND(predicate, Predicate.IN("metric", searchFilter.getMetrics().toArray()));
     }
+    // search by ids
+    if (!searchFilter.getAnomalyIds().isEmpty()) {
+      predicate = Predicate.AND(predicate, Predicate.IN("baseId", searchFilter.getAnomalyIds().toArray()));
+    }
 
     long count;
     List<MergedAnomalyResultDTO> results;
     if (searchFilter.getFeedbacks().isEmpty()) {
-      List<Long> anomalyIds = this.anomalyDAO.findIdsByPredicate(predicate);
+      List<Long> anomalyIds = this.anomalyDAO.findIdsByPredicate(predicate)
+          .stream()
+          .sorted(Comparator.reverseOrder())
+          .collect(Collectors.toList());
       count = anomalyIds.size();
-      results = this.anomalyDAO.findByIds(paginateResults(anomalyIds, offset, limit));
+      results = anomalyIds.isEmpty() ? Collections.emptyList() : this.anomalyDAO.findByIds(paginateResults(anomalyIds, offset, limit));
     } else {
       // filter by feedback types
       List<MergedAnomalyResultDTO> anomalies = this.anomalyDAO.findByPredicate(predicate);
@@ -104,6 +117,7 @@ public class AnomalySearcher {
       results = anomalies.stream()
           .filter(anomaly -> (anomaly.getFeedback() == null && feedbackFilters.contains(NO_FEEDBACK)) || (
               anomaly.getFeedback() != null && feedbackFilters.contains(anomaly.getFeedback().getFeedbackType())))
+          .sorted(Comparator.comparingLong(AbstractDTO::getId).reversed())
           .collect(Collectors.toList());
       count = results.size();
       results = paginateResults(results, offset, limit);
@@ -111,7 +125,7 @@ public class AnomalySearcher {
     return ImmutableMap.of("count", count, "limit", limit, "offset", offset, "elements", results);
   }
 
-  private  <T> List<T> paginateResults(List<T> list, int offset, int limit) {
+  private <T> List<T> paginateResults(List<T> list, int offset, int limit) {
     if (offset > list.size()) {
       // requested page is out of bound
       return Collections.emptyList();
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/datalayer/entity/MergedAnomalyResultIndex.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/datalayer/entity/MergedAnomalyResultIndex.java
index d5941d9..cfa5c68 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/datalayer/entity/MergedAnomalyResultIndex.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/datalayer/entity/MergedAnomalyResultIndex.java
@@ -35,7 +35,7 @@ public class MergedAnomalyResultIndex extends AbstractIndexEntity {
   String metric;
   DimensionMap dimensions;
   boolean notified;
-  boolean isChild;
+  boolean child;
 
   public long getDetectionConfigId() {
     return detectionConfigId;
@@ -118,10 +118,10 @@ public class MergedAnomalyResultIndex extends AbstractIndexEntity {
   }
 
   public boolean isChild() {
-    return isChild;
+    return child;
   }
 
   public void setChild(boolean child) {
-    isChild = child;
+    this.child = child;
   }
 }
diff --git a/thirdeye/thirdeye-pinot/src/main/resources/schema/create-schema.sql b/thirdeye/thirdeye-pinot/src/main/resources/schema/create-schema.sql
index 88c74a1..8454348 100644
--- a/thirdeye/thirdeye-pinot/src/main/resources/schema/create-schema.sql
+++ b/thirdeye/thirdeye-pinot/src/main/resources/schema/create-schema.sql
@@ -110,7 +110,7 @@ create table if not exists merged_anomaly_result_index (
     base_id bigint(20) not null,
     create_time timestamp,
     update_time timestamp default current_timestamp,
-    is_child boolean,
+    child boolean,
     version int(10)
 ) ENGINE=InnoDB;
 create index merged_anomaly_result_function_idx on merged_anomaly_result_index(function_id);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org