mirror of
https://github.com/datahub-project/datahub.git
synced 2025-07-23 01:22:00 +00:00

Co-authored-by: Harshal Sheth <harshal@acryl.io> Co-authored-by: Dexter Lee <dexter@acryl.io> Co-authored-by: Gabe Lyons <itsgabelyons@gmail.com>
94 lines
3.7 KiB
Java
94 lines
3.7 KiB
Java
package react.resolver;
|
|
|
|
import com.google.common.collect.ImmutableList;
|
|
import com.google.common.collect.ImmutableMap;
|
|
import graphql.DateRange;
|
|
import graphql.Highlight;
|
|
import graphql.schema.DataFetcher;
|
|
import graphql.schema.DataFetchingEnvironment;
|
|
import org.joda.time.DateTime;
|
|
import react.analytics.AnalyticsService;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
|
|
/**
|
|
* Retrieves the Highlights to be rendered of the Analytics screen of the DataHub application.
|
|
*/
|
|
public final class GetHighlightsResolver implements DataFetcher<List<Highlight>> {
|
|
|
|
private final AnalyticsService _analyticsService;
|
|
|
|
public GetHighlightsResolver(final AnalyticsService analyticsService) {
|
|
_analyticsService = analyticsService;
|
|
}
|
|
|
|
@Override
|
|
public final List<Highlight> get(DataFetchingEnvironment environment) throws Exception {
|
|
return getHighlights();
|
|
}
|
|
|
|
/**
|
|
* TODO: Config Driven Charts Instead of Hardcoded.
|
|
*/
|
|
private List<Highlight> getHighlights() {
|
|
final List<Highlight> highlights = new ArrayList<>();
|
|
|
|
DateTime endDate = DateTime.now();
|
|
DateTime startDate = endDate.minusWeeks(1);
|
|
DateTime lastWeekStartDate = startDate.minusWeeks(1);
|
|
DateRange dateRange = new DateRange(String.valueOf(startDate.getMillis()), String.valueOf(endDate.getMillis()));
|
|
DateRange dateRangeLastWeek =
|
|
new DateRange(String.valueOf(lastWeekStartDate.getMillis()), String.valueOf(startDate.getMillis()));
|
|
|
|
// Highlight 1: The Highlights!
|
|
String title = "Weekly Active Users";
|
|
String eventType = "SearchEvent";
|
|
|
|
int weeklyActiveUsers =
|
|
_analyticsService.getHighlights(AnalyticsService.DATAHUB_USAGE_EVENT_INDEX, Optional.of(dateRange),
|
|
ImmutableMap.of(), Optional.of("browserId"));
|
|
|
|
int weeklyActiveUsersLastWeek =
|
|
_analyticsService.getHighlights(AnalyticsService.DATAHUB_USAGE_EVENT_INDEX, Optional.of(dateRangeLastWeek),
|
|
ImmutableMap.of(), Optional.of("browserId"));
|
|
|
|
String bodyText = "";
|
|
if (weeklyActiveUsersLastWeek > 0) {
|
|
Double percentChange =
|
|
(Double.valueOf(weeklyActiveUsers) - Double.valueOf(weeklyActiveUsersLastWeek)) / Double.valueOf(
|
|
weeklyActiveUsersLastWeek) * 100;
|
|
|
|
String directionChange = percentChange > 0 ? "increase" : "decrease";
|
|
|
|
bodyText = Double.isInfinite(percentChange) ? ""
|
|
: String.format("%%%.2f %s from last week", percentChange, directionChange);
|
|
}
|
|
|
|
highlights.add(Highlight.builder().setTitle(title).setValue(weeklyActiveUsers).setBody(bodyText).build());
|
|
|
|
// Entity metdata statistics
|
|
highlights.add(getEntityMetadataStats("Datasets", AnalyticsService.DATASET_INDEX));
|
|
highlights.add(getEntityMetadataStats("Dashboards", AnalyticsService.DASHBOARD_INDEX));
|
|
highlights.add(getEntityMetadataStats("Charts", AnalyticsService.CHART_INDEX));
|
|
highlights.add(getEntityMetadataStats("Pipelines", AnalyticsService.DATA_FLOW_INDEX));
|
|
highlights.add(getEntityMetadataStats("Tasks", AnalyticsService.DATA_JOB_INDEX));
|
|
return highlights;
|
|
}
|
|
|
|
private Highlight getEntityMetadataStats(String title, String index) {
|
|
int numEntities = _analyticsService.getHighlights(index, Optional.empty(), ImmutableMap.of(), Optional.empty());
|
|
int numEntitiesWithOwners =
|
|
_analyticsService.getHighlights(index, Optional.empty(), ImmutableMap.of("hasOwners", ImmutableList.of("true")),
|
|
Optional.empty());
|
|
String bodyText = "";
|
|
if (numEntities > 0) {
|
|
double percentChange = 100.0 * numEntitiesWithOwners / numEntities;
|
|
bodyText = String.format("%.2f%% have owners assigned!", percentChange);
|
|
}
|
|
return Highlight.builder().setTitle(title).setValue(numEntities).setBody(bodyText).build();
|
|
}
|
|
}
|