|
@@ -0,0 +1,272 @@
|
|
|
+package cn.cslg.pas.factorys.EsCountAnalyseBuilderFactory;
|
|
|
+
|
|
|
+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.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class PrioritiesCountAnalysisBuilder implements IEsCountAnalysisBuilder{
|
|
|
+ public String field = "";
|
|
|
+ public String valueOne = "";
|
|
|
+ public String valueTwo = "";
|
|
|
+ public Integer topN = 10;
|
|
|
+ public String path = "";
|
|
|
+ public Boolean ifHaveChild = false;
|
|
|
+ public String fieldType = null;
|
|
|
+ public String fieldId = null;
|
|
|
+ private String format;
|
|
|
+ public List<String> values = new ArrayList<>();
|
|
|
+ public static final int YEAR = 4;
|
|
|
+ public static final int MONTH = 7;
|
|
|
+ public static final int DAY = 10;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Aggregation createCountAnalyseAgg() throws Exception {
|
|
|
+ Aggregation aggregation = null;
|
|
|
+ if (StringUtils.isNotEmpty(valueOne) && StringUtils.isNotEmpty(valueTwo)) {
|
|
|
+ String end = String.valueOf(Integer.parseInt(valueTwo) + 1);
|
|
|
+ Query query = QueryBuilders.range(j -> j.field(field).from(valueOne).to(end).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 (!CollectionUtils.isEmpty(values)) {
|
|
|
+ List<DateRangeExpression> rangeExpressions = new ArrayList<>();
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ for (String value : values) {
|
|
|
+ if (value.length() == YEAR) {
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
|
|
|
+ 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 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 {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ aggregation = AggregationBuilders.dateRange(i -> i.field(field).format("yyyy-MM").ranges(rangeExpressions));
|
|
|
+ } else if (StringUtils.isNotEmpty(format) && CollectionUtils.isEmpty(values)) {
|
|
|
+ if (format.equals("年")) {
|
|
|
+ aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy").calendarInterval(CalendarInterval.Year));
|
|
|
+ } else if (format.equals("半年")) {
|
|
|
+ Aggregation halfYearAgg = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy-MM").calendarInterval(CalendarInterval.Month));
|
|
|
+ aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
|
|
|
+ .field(field).format("yyyy")
|
|
|
+ .calendarInterval(CalendarInterval.Year).build())
|
|
|
+ .aggregations(new HashMap() {{
|
|
|
+ put("halfYearAgg", halfYearAgg);
|
|
|
+ }}).build();
|
|
|
+ } else if (format.equals("季")) {
|
|
|
+ aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy-MM").calendarInterval(CalendarInterval.Quarter));
|
|
|
+ } else if (format.equals("月")) {
|
|
|
+ aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy-MM").calendarInterval(CalendarInterval.Month));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy").calendarInterval(CalendarInterval.Year));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ Aggregation finalAggregation = aggregation;
|
|
|
+ Aggregation Agg = new Aggregation.Builder().nested(new NestedAggregation.Builder().
|
|
|
+ path(path).build())
|
|
|
+ .aggregations(new HashMap() {{
|
|
|
+ put("terms_agg", finalAggregation);
|
|
|
+ }}).build();
|
|
|
+ return Agg;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getField() {
|
|
|
+ return field;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setField(String field) {
|
|
|
+ this.field = field;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getValueOne() {
|
|
|
+ return valueOne;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setValueOne(String valueOne) {
|
|
|
+ this.valueOne = valueOne;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getValueTwo() {
|
|
|
+ return valueTwo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setValueTwo(String valueTwo) {
|
|
|
+ this.valueTwo = valueTwo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Integer getTopN() {
|
|
|
+ return topN;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setTopN(Integer topN) {
|
|
|
+ this.topN = topN;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getPath() {
|
|
|
+ return path;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setPath(String path) {
|
|
|
+ this.path = path;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Boolean getIfHaveChild() {
|
|
|
+ return ifHaveChild;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setIfHaveChild(Boolean ifHaveChild) {
|
|
|
+ this.ifHaveChild = ifHaveChild;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getFieldType() {
|
|
|
+ return fieldType;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setFieldType(String fieldType) {
|
|
|
+ this.fieldType = fieldType;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getFieldId() {
|
|
|
+ return fieldId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setFieldId(String fieldId) {
|
|
|
+ this.fieldId = fieldId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getFormat() {
|
|
|
+ return format;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setFormat(String format) {
|
|
|
+ this.format = format;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<String> getValues() {
|
|
|
+ return values;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setValues(List<String> values) {
|
|
|
+ this.values = values;
|
|
|
+ }
|
|
|
+}
|