Skip to content

Commit

Permalink
feat(Analytics) Allow dateRangeField to be configurable for timeSerie…
Browse files Browse the repository at this point in the history
  • Loading branch information
mkamalas authored Sep 20, 2024
1 parent f6dde2b commit c5e5925
Showing 1 changed file with 44 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ public List<NamedLine> getTimeseriesChart(
Optional<String> dimension, // Length 1 for now
Map<String, List<String>> filters,
Map<String, List<String>> mustNotFilters,
Optional<String> uniqueOn) {
Optional<String> uniqueOn,
String dateRangeField) {

log.debug(
String.format(
Expand All @@ -87,11 +88,11 @@ public List<NamedLine> getTimeseriesChart(
+ String.format("filters: %s, uniqueOn: %s", filters, uniqueOn));

AggregationBuilder filteredAgg =
getFilteredAggregation(filters, mustNotFilters, Optional.of(dateRange));
getFilteredAggregation(filters, mustNotFilters, Optional.of(dateRange), dateRangeField);

AggregationBuilder dateHistogram =
AggregationBuilders.dateHistogram(DATE_HISTOGRAM)
.field("timestamp")
.field(dateRangeField)
.calendarInterval(new DateHistogramInterval(granularity.name().toLowerCase()));
uniqueOn.ifPresent(s -> dateHistogram.subAggregation(getUniqueQuery(s)));

Expand Down Expand Up @@ -128,6 +129,25 @@ public List<NamedLine> getTimeseriesChart(
}
}

public List<NamedLine> getTimeseriesChart(
String indexName,
DateRange dateRange,
DateInterval granularity,
Optional<String> dimension, // Length 1 for now
Map<String, List<String>> filters,
Map<String, List<String>> mustNotFilters,
Optional<String> uniqueOn) {
return getTimeseriesChart(
indexName,
dateRange,
granularity,
dimension,
filters,
mustNotFilters,
uniqueOn,
"timestamp");
}

private int extractCount(MultiBucketsAggregation.Bucket bucket, boolean didUnique) {
return didUnique
? (int) bucket.getAggregations().<Cardinality>get(UNIQUE).getValue()
Expand Down Expand Up @@ -323,20 +343,38 @@ private Filter executeAndExtract(SearchRequest searchRequest) {
}
}

// Make dateRangeField as customizable
private AggregationBuilder getFilteredAggregation(
Map<String, List<String>> mustFilters,
Map<String, List<String>> mustNotFilters,
Optional<DateRange> dateRange) {
Optional<DateRange> dateRange,
String dateRangeField) {
BoolQueryBuilder filteredQuery = QueryBuilders.boolQuery();
mustFilters.forEach((key, values) -> filteredQuery.must(QueryBuilders.termsQuery(key, values)));
mustNotFilters.forEach(
(key, values) -> filteredQuery.mustNot(QueryBuilders.termsQuery(key, values)));
dateRange.ifPresent(range -> filteredQuery.must(dateRangeQuery(range)));
dateRange.ifPresent(range -> filteredQuery.must(dateRangeQuery(range, dateRangeField)));
return AggregationBuilders.filter(FILTERED, filteredQuery);
}

private AggregationBuilder getFilteredAggregation(
Map<String, List<String>> mustFilters,
Map<String, List<String>> mustNotFilters,
Optional<DateRange> dateRange) {
// Use timestamp as dateRangeField
return getFilteredAggregation(mustFilters, mustNotFilters, dateRange, "timestamp");
}

private QueryBuilder dateRangeQuery(DateRange dateRange) {
return QueryBuilders.rangeQuery("timestamp").gte(dateRange.getStart()).lt(dateRange.getEnd());
// Use timestamp as dateRangeField
return dateRangeQuery(dateRange, "timestamp");
}

// Make dateRangeField as customizable
private QueryBuilder dateRangeQuery(DateRange dateRange, String dateRangeField) {
return QueryBuilders.rangeQuery(dateRangeField)
.gte(dateRange.getStart())
.lt(dateRange.getEnd());
}

private AggregationBuilder getUniqueQuery(String uniqueOn) {
Expand Down

0 comments on commit c5e5925

Please sign in to comment.