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