|
@@ -1,13 +1,11 @@
|
|
|
package cn.cslg.pas.factorys.EsAnalysisBuilderFactory;
|
|
|
|
|
|
-import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
|
|
|
-import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
|
|
|
-import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
|
|
|
-import co.elastic.clients.elasticsearch._types.aggregations.DateHistogramAggregation;
|
|
|
+import co.elastic.clients.elasticsearch._types.aggregations.*;
|
|
|
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
|
|
|
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
@@ -30,160 +28,132 @@ public class DateAnalysisBuilder implements IEsAnalysisBuilder {
|
|
|
@Override
|
|
|
public Aggregation createAnalyseAgg() throws ParseException {
|
|
|
Aggregation aggregation = null;
|
|
|
- if (StringUtils.isNotEmpty(fieldValue)) {
|
|
|
+ List<DateRangeExpression> rangeExpressions = new ArrayList<>();
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(values)) {
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
- if (fieldValue.length() == YEAR) {
|
|
|
- SimpleDateFormat format = new SimpleDateFormat("yyyy");
|
|
|
- Date year = format.parse(fieldValue);
|
|
|
- calendar.setTime(year);
|
|
|
- calendar.add(Calendar.YEAR, 1);
|
|
|
- Date yearDate = calendar.getTime();
|
|
|
- String nextYear = format.format(yearDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(fieldValue).to(nextYear).format("yyyy"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy")
|
|
|
- .calendarInterval(CalendarInterval.Year).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
- } else if (fieldValue.length() == MONTH && !fieldValue.contains("Q")
|
|
|
- && !fieldValue.contains("H")) {
|
|
|
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date month = format.parse(fieldValue);
|
|
|
- calendar.setTime(month);
|
|
|
- calendar.add(Calendar.MONTH, 1);
|
|
|
- Date monthDate = calendar.getTime();
|
|
|
- String nextMonth = format.format(monthDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(fieldValue).to(nextMonth).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Month).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
-
|
|
|
- } else if (fieldValue.length() == MONTH && fieldValue.contains("Q")) {
|
|
|
- if (fieldValue.contains("Q1")) {
|
|
|
- String firstQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String firstQuarterDate = firstQuarter + "-01";
|
|
|
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date quarter = format.parse(firstQuarterDate);
|
|
|
- calendar.setTime(quarter);
|
|
|
- calendar.add(Calendar.MONTH, 3);
|
|
|
- Date quarterDate = calendar.getTime();
|
|
|
- String nextQuarterDate = format.format(quarterDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(firstQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Quarter).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
- } else if (fieldValue.contains("Q2")) {
|
|
|
- String secondQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String secondQuarterDate = secondQuarter + "-04";
|
|
|
+ for (String value : values) {
|
|
|
+ if (value.length() == YEAR) {
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date quarter = format.parse(secondQuarterDate);
|
|
|
- calendar.setTime(quarter);
|
|
|
- calendar.add(Calendar.MONTH, 3);
|
|
|
- Date quarterDate = calendar.getTime();
|
|
|
- String nextQuarterDate = format.format(quarterDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(secondQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Quarter).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
- } else if (fieldValue.contains("Q3")) {
|
|
|
- String thirdQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String thirdQuarterDate = thirdQuarter + "-07";
|
|
|
+ String startYear = value + "-01";
|
|
|
+ Date year = format.parse(startYear);
|
|
|
+ calendar.setTime(year);
|
|
|
+ calendar.add(Calendar.YEAR, 1);
|
|
|
+ Date yearDate = calendar.getTime();
|
|
|
+ String nextYear = format.format(yearDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(startYear));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextYear));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ } else if (value.length() == MONTH && !value.contains("Q")
|
|
|
+ && !value.contains("H")) {
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date quarter = format.parse(thirdQuarterDate);
|
|
|
- calendar.setTime(quarter);
|
|
|
- calendar.add(Calendar.MONTH, 3);
|
|
|
- Date quarterDate = calendar.getTime();
|
|
|
- String nextQuarterDate = format.format(quarterDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(thirdQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Quarter).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
- } else if (fieldValue.contains("Q4")) {
|
|
|
- String fourthQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String fourthQuarterDate = fourthQuarter + "-10";
|
|
|
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date quarter = format.parse(fourthQuarterDate);
|
|
|
- calendar.setTime(quarter);
|
|
|
- calendar.add(Calendar.MONTH, 3);
|
|
|
- Date quarterDate = calendar.getTime();
|
|
|
- String nextQuarterDate = format.format(quarterDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(fourthQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Quarter).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
- }
|
|
|
- } else if (fieldValue.length() == MONTH && fieldValue.contains("H")) {
|
|
|
- if (fieldValue.contains("H1")) {
|
|
|
- String firstHalfYear = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String firstHalfYearDate = firstHalfYear + "-01";
|
|
|
+ Date month = format.parse(value);
|
|
|
+ calendar.setTime(month);
|
|
|
+ calendar.add(Calendar.MONTH, 1);
|
|
|
+ Date monthDate = calendar.getTime();
|
|
|
+ String nextMonth = format.format(monthDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(value));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextMonth));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ } else if (value.length() == MONTH && value.contains("Q")) {
|
|
|
+ if (value.contains("Q1")) {
|
|
|
+ String firstQuarter = value.substring(0, value.indexOf("-"));
|
|
|
+ String firstQuarterDate = firstQuarter + "-01";
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ Date quarter = format.parse(firstQuarterDate);
|
|
|
+ calendar.setTime(quarter);
|
|
|
+ calendar.add(Calendar.MONTH, 3);
|
|
|
+ Date quarterDate = calendar.getTime();
|
|
|
+ String nextQuarterDate = format.format(quarterDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(firstQuarterDate));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextQuarterDate));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ } else if (value.contains("Q2")) {
|
|
|
+ String secondQuarter = value.substring(0, value.indexOf("-"));
|
|
|
+ String secondQuarterDate = secondQuarter + "-04";
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ Date quarter = format.parse(secondQuarterDate);
|
|
|
+ calendar.setTime(quarter);
|
|
|
+ calendar.add(Calendar.MONTH, 3);
|
|
|
+ Date quarterDate = calendar.getTime();
|
|
|
+ String nextQuarterDate = format.format(quarterDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(secondQuarterDate));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextQuarterDate));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ } else if (value.contains("Q3")) {
|
|
|
+ String thirdQuarter = value.substring(0, value.indexOf("-"));
|
|
|
+ String thirdQuarterDate = thirdQuarter + "-07";
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ Date quarter = format.parse(thirdQuarterDate);
|
|
|
+ calendar.setTime(quarter);
|
|
|
+ calendar.add(Calendar.MONTH, 3);
|
|
|
+ Date quarterDate = calendar.getTime();
|
|
|
+ String nextQuarterDate = format.format(quarterDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(thirdQuarterDate));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextQuarterDate));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ } else if (value.contains("Q4")) {
|
|
|
+ String fourthQuarter = value.substring(0, value.indexOf("-"));
|
|
|
+ String fourthQuarterDate = fourthQuarter + "-10";
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ Date quarter = format.parse(fourthQuarterDate);
|
|
|
+ calendar.setTime(quarter);
|
|
|
+ calendar.add(Calendar.MONTH, 3);
|
|
|
+ Date quarterDate = calendar.getTime();
|
|
|
+ String nextQuarterDate = format.format(quarterDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(fourthQuarterDate));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextQuarterDate));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ }
|
|
|
+ } else if (value.length() == MONTH && value.contains("H")) {
|
|
|
+ if (value.contains("H1")) {
|
|
|
+ String firstHalfYear = value.substring(0, value.indexOf("-"));
|
|
|
+ String firstHalfYearDate = firstHalfYear + "-01";
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ Date halfYear = format.parse(firstHalfYearDate);
|
|
|
+ calendar.setTime(halfYear);
|
|
|
+ calendar.add(Calendar.MONTH, 6);
|
|
|
+ Date halfYearDate = calendar.getTime();
|
|
|
+ String nextHalfYearDate = format.format(halfYearDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(firstHalfYearDate));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextHalfYearDate));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ } else if (value.contains("H2")) {
|
|
|
+ String secondHalfYear = value.substring(0, value.indexOf("-"));
|
|
|
+ String secondHalfYearDate = secondHalfYear + "-07";
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ Date halfYear = format.parse(secondHalfYearDate);
|
|
|
+ calendar.setTime(halfYear);
|
|
|
+ calendar.add(Calendar.MONTH, 6);
|
|
|
+ Date halfYearDate = calendar.getTime();
|
|
|
+ String nextHalfYearDate = format.format(halfYearDate);
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(secondHalfYearDate));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextHalfYearDate));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date halfYear = format.parse(firstHalfYearDate);
|
|
|
- calendar.setTime(halfYear);
|
|
|
- calendar.add(Calendar.MONTH, 6);
|
|
|
- Date halfYearDate = calendar.getTime();
|
|
|
- String nextHalfYearDate = format.format(halfYearDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(firstHalfYearDate).to(nextHalfYearDate).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Month).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
- } else if (fieldValue.contains("H2")) {
|
|
|
- String secondHalfYear = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String secondHalfYearDate = secondHalfYear + "-07";
|
|
|
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
- Date halfYear = format.parse(secondHalfYearDate);
|
|
|
- calendar.setTime(halfYear);
|
|
|
- calendar.add(Calendar.MONTH, 6);
|
|
|
- Date halfYearDate = calendar.getTime();
|
|
|
- String nextHalfYearDate = format.format(halfYearDate);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(secondHalfYearDate).to(nextHalfYearDate).format("yyyy-MM"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy-MM")
|
|
|
- .calendarInterval(CalendarInterval.Month).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
+ String start = value.substring(0, value.indexOf("-")) + "-01";
|
|
|
+ String end = value.substring(value.indexOf("-") + 1);
|
|
|
+ String nextYear = String.valueOf(Integer.parseInt(end) + 1) + "-01";
|
|
|
+ FieldDateMath st = FieldDateMath.of(i -> i.expr(start));
|
|
|
+ FieldDateMath ed = FieldDateMath.of(i -> i.expr(nextYear));
|
|
|
+ DateRangeExpression expression = DateRangeExpression.of(i -> i.from(st).to(ed).key(value));
|
|
|
+ rangeExpressions.add(expression);
|
|
|
+
|
|
|
}
|
|
|
- } else {
|
|
|
- String start = fieldValue.substring(0, fieldValue.indexOf("-"));
|
|
|
- String end = fieldValue.substring(fieldValue.indexOf("-") + 1);
|
|
|
- String nextYear = String.valueOf(Integer.parseInt(end) + 1);
|
|
|
- Query query = QueryBuilders.range(j -> j.field(field).from(start).to(nextYear).format("yyyy"));
|
|
|
- Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
|
|
|
- aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
- .field(field).format("yyyy")
|
|
|
- .calendarInterval(CalendarInterval.Year).build())
|
|
|
- .aggregations(new HashMap() {{
|
|
|
- put("filter_agg", filter);
|
|
|
- }}).build();
|
|
|
}
|
|
|
}
|
|
|
+ aggregation = AggregationBuilders.dateRange(i -> i.field(field).format("yyyy-MM").ranges(rangeExpressions));
|
|
|
+
|
|
|
return aggregation;
|
|
|
}
|
|
|
|