!34 #I5MOKM 添加聚合功能(terms,avg,min,max,sum)支持多参数传参,删除returnName参数

Merge pull request !34 from zhengjianjian/feature
This commit is contained in:
elasticsearch 2022-10-20 09:13:09 +00:00 committed by Gitee
commit db23fad6a2
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 170 additions and 125 deletions

View File

@ -16,7 +16,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.BiPredicate; import java.util.function.BiPredicate;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
/** /**
* 链式 * 链式
@ -220,32 +219,32 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
} }
@Override @Override
public Children termsAggregation(boolean condition, boolean pipeline, String returnName, R column) { public Children termsAggregation(boolean condition, boolean pipeline, R... column) {
getWrapper().termsAggregation(condition, pipeline, returnName, column); getWrapper().termsAggregation(condition, pipeline, column);
return typedThis; return typedThis;
} }
@Override @Override
public Children avg(boolean condition, boolean pipeline, String returnName, R column) { public Children avg(boolean condition, boolean pipeline, R... columns) {
getWrapper().avg(condition, pipeline, returnName, column); getWrapper().avg(condition, pipeline, columns);
return typedThis; return typedThis;
} }
@Override @Override
public Children min(boolean condition, boolean pipeline, String returnName, R column) { public Children min(boolean condition, boolean pipeline, R... columns) {
getWrapper().min(condition, pipeline, returnName, column); getWrapper().min(condition, pipeline, columns);
return typedThis; return typedThis;
} }
@Override @Override
public Children max(boolean condition, boolean pipeline, String returnName, R column) { public Children max(boolean condition, boolean pipeline, R... columns) {
getWrapper().max(condition, pipeline, returnName, column); getWrapper().max(condition, pipeline, columns);
return typedThis; return typedThis;
} }
@Override @Override
public Children sum(boolean condition, boolean pipeline, String returnName, R column) { public Children sum(boolean condition, boolean pipeline, R... columns) {
getWrapper().sum(condition, pipeline, returnName, column); getWrapper().sum(condition, pipeline, columns);
return typedThis; return typedThis;
} }
@ -589,32 +588,32 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
} }
@Override @Override
public Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, String column) { public Children termsAggregation(boolean condition, boolean enablePipeline, String... column) {
getWrapper().termsAggregation(condition, enablePipeline, returnName, column); getWrapper().termsAggregation(condition, enablePipeline, column);
return typedThis; return typedThis;
} }
@Override @Override
public Children avg(boolean condition, boolean enablePipeline, String returnName, String column) { public Children avg(boolean condition, boolean enablePipeline, String... columns) {
getWrapper().avg(condition, enablePipeline, returnName, column); getWrapper().avg(condition, enablePipeline, columns);
return typedThis; return typedThis;
} }
@Override @Override
public Children min(boolean condition, boolean enablePipeline, String returnName, String column) { public Children min(boolean condition, boolean enablePipeline, String... columns) {
getWrapper().min(condition, enablePipeline, returnName, column); getWrapper().min(condition, enablePipeline, columns);
return typedThis; return typedThis;
} }
@Override @Override
public Children max(boolean condition, boolean enablePipeline, String returnName, String column) { public Children max(boolean condition, boolean enablePipeline, String... columns) {
getWrapper().max(condition, enablePipeline, returnName, column); getWrapper().max(condition, enablePipeline, columns);
return typedThis; return typedThis;
} }
@Override @Override
public Children sum(boolean condition, boolean enablePipeline, String returnName, String column) { public Children sum(boolean condition, boolean enablePipeline, String... columns) {
getWrapper().sum(condition, enablePipeline, returnName, column); getWrapper().sum(condition, enablePipeline, columns);
return typedThis; return typedThis;
} }

View File

@ -420,33 +420,53 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
if (ArrayUtils.isEmpty(columns)) { if (ArrayUtils.isEmpty(columns)) {
return typedThis; return typedThis;
} }
Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, column, column)); Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, column));
return typedThis; return typedThis;
} }
@Override @Override
public Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, String column) { public Children termsAggregation(boolean condition, boolean enablePipeline, String... columns) {
return doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, returnName, column); if (ArrayUtils.isEmpty(columns)) {
return typedThis;
}
Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, column));
return typedThis;
} }
@Override @Override
public Children avg(boolean condition, boolean enablePipeline, String returnName, String column) { public Children avg(boolean condition, boolean enablePipeline, String... columns) {
return doIt(condition, enablePipeline, AggregationTypeEnum.AVG, returnName, column); if (ArrayUtils.isEmpty(columns)) {
return typedThis;
}
Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.AVG, column));
return typedThis;
} }
@Override @Override
public Children min(boolean condition, boolean enablePipeline, String returnName, String column) { public Children min(boolean condition, boolean enablePipeline, String... columns) {
return doIt(condition, enablePipeline, AggregationTypeEnum.MIN, returnName, column); if (ArrayUtils.isEmpty(columns)) {
return typedThis;
}
Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.MIN, column));
return typedThis;
} }
@Override @Override
public Children max(boolean condition, boolean enablePipeline, String returnName, String column) { public Children max(boolean condition, boolean enablePipeline, String... columns) {
return doIt(condition, enablePipeline, AggregationTypeEnum.MAX, returnName, column); if (ArrayUtils.isEmpty(columns)) {
return typedThis;
}
Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.MAX, column));
return typedThis;
} }
@Override @Override
public Children sum(boolean condition, boolean enablePipeline, String returnName, String column) { public Children sum(boolean condition, boolean enablePipeline, String... columns) {
return doIt(condition, enablePipeline, AggregationTypeEnum.SUM, returnName, column); if (ArrayUtils.isEmpty(columns)) {
return typedThis;
}
Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.SUM, column));
return typedThis;
} }
@Override @Override
@ -531,15 +551,14 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
* @param condition 条件 * @param condition 条件
* @param enablePipeline 是否管道聚合 * @param enablePipeline 是否管道聚合
* @param aggregationTypeEnum 聚合类型 * @param aggregationTypeEnum 聚合类型
* @param returnName 返回的聚合字段名称
* @param column * @param column
* @return 泛型 * @return 泛型
*/ */
private Children doIt(boolean condition, boolean enablePipeline, AggregationTypeEnum aggregationTypeEnum, String returnName, String column) { private Children doIt(boolean condition, boolean enablePipeline, AggregationTypeEnum aggregationTypeEnum, String column) {
if (condition) { if (condition) {
AggregationParam aggregationParam = new AggregationParam(); AggregationParam aggregationParam = new AggregationParam();
aggregationParam.setEnablePipeline(enablePipeline); aggregationParam.setEnablePipeline(enablePipeline);
aggregationParam.setName(returnName); aggregationParam.setName(column);
aggregationParam.setField(column); aggregationParam.setField(column);
aggregationParam.setAggregationType(aggregationTypeEnum); aggregationParam.setAggregationType(aggregationTypeEnum);
aggregationParamList.add(aggregationParam); aggregationParamList.add(aggregationParam);

View File

@ -218,7 +218,7 @@ public interface Func<Children, R> extends Serializable {
} }
default Children orderByDistanceDesc(String column, double lat, double lon) { default Children orderByDistanceDesc(String column, double lat, double lon) {
return orderByDistanceDesc(true,column, DistanceUnit.KILOMETERS, GeoDistance.PLANE, new GeoPoint(lat, lon)); return orderByDistanceDesc(true, column, DistanceUnit.KILOMETERS, GeoDistance.PLANE, new GeoPoint(lat, lon));
} }
default Children orderByDistanceDesc(String column, DistanceUnit unit, double lat, double lon) { default Children orderByDistanceDesc(String column, DistanceUnit unit, double lat, double lon) {
@ -469,39 +469,40 @@ public interface Func<Children, R> extends Serializable {
Children groupBy(boolean condition, boolean enablePipeline, String... columns); Children groupBy(boolean condition, boolean enablePipeline, String... columns);
default Children termsAggregation(R column) { default Children termsAggregation(R column) {
return termsAggregation(true, true, FieldUtils.getFieldName(column), column); return termsAggregation(true, true, column);
} }
default Children termsAggregation(boolean enablePipeline, R column) { default Children termsAggregation(boolean enablePipeline, R column) {
return termsAggregation(true, enablePipeline, FieldUtils.getFieldName(column), column); return termsAggregation(true, enablePipeline, column);
} }
default Children termsAggregation(String returnName, R column) { default Children termsAggregation(R... columns) {
return termsAggregation(true, true, returnName, column); return termsAggregation(true, true, columns);
} }
default Children termsAggregation(boolean enablePipeline, String returnName, R column) { default Children termsAggregation(boolean enablePipeline, R... columns) {
return termsAggregation(true, enablePipeline, returnName, column); return termsAggregation(true, enablePipeline, columns);
} }
default Children termsAggregation(String column) { default Children termsAggregation(String column) {
return termsAggregation(true, true, column, column); return termsAggregation(true, true, column);
} }
default Children termsAggregation(boolean enablePipeline, String column) { default Children termsAggregation(boolean enablePipeline, String column) {
return termsAggregation(true, enablePipeline, column, column); return termsAggregation(true, enablePipeline, column);
} }
default Children termsAggregation(String returnName, String column) { default Children termsAggregation(String... columns) {
return termsAggregation(true, true, returnName, column); return termsAggregation(true, true, columns);
} }
default Children termsAggregation(boolean enablePipeline, String returnName, String column) { default Children termsAggregation(boolean enablePipeline, String... columns) {
return termsAggregation(true, enablePipeline, returnName, column); return termsAggregation(true, enablePipeline, columns);
} }
default Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, R column) { default Children termsAggregation(boolean condition, boolean enablePipeline, R... columns) {
return termsAggregation(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new);
return termsAggregation(condition, enablePipeline, fields);
} }
/** /**
@ -509,48 +510,46 @@ public interface Func<Children, R> extends Serializable {
* *
* @param condition 条件 * @param condition 条件
* @param enablePipeline 是否管道聚合 * @param enablePipeline 是否管道聚合
* @param returnName 返回的聚合字段名称 * @param columns 支持多列
* @param column
* @return 泛型 * @return 泛型
*/ */
Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, String column); Children termsAggregation(boolean condition, boolean enablePipeline, String... columns);
default Children avg(R column) { default Children avg(R column) {
return avg(true, true, FieldUtils.getFieldName(column), column); return avg(true, true, column);
} }
default Children avg(boolean enablePipeline, R column) { default Children avg(boolean enablePipeline, R column) {
return avg(true, enablePipeline, FieldUtils.getFieldName(column), column); return avg(true, enablePipeline, column);
} }
default Children avg(boolean enablePipeline, String returnName, R column) { default Children avg(R... columns) {
return avg(true, enablePipeline, returnName, column); return avg(true, true, columns);
} }
default Children avg(String returnName, R column) { default Children avg(boolean enablePipeline, R... columns) {
return avg(true, true, returnName, column); return avg(true, enablePipeline, columns);
} }
default Children avg(String column) { default Children avg(String column) {
return avg(true, true, FieldUtils.getFieldName(column), column); return avg(true, true, column);
} }
default Children avg(boolean enablePipeline, String column) { default Children avg(boolean enablePipeline, String column) {
return avg(true, enablePipeline, column, column); return avg(true, enablePipeline, column, column);
} }
default Children avg(boolean enablePipeline, String returnName, String column) { default Children avg(String... columns) {
return avg(true, enablePipeline, returnName, column); return avg(true, true, columns);
} }
default Children avg(String returnName, String column) { default Children avg(boolean enablePipeline, String... columns) {
return avg(true, true, returnName, column); return avg(true, enablePipeline, columns);
} }
default Children avg(boolean condition, boolean enablePipeline, R... columns) {
default Children avg(boolean condition, boolean enablePipeline, String returnName, R column) { String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new);
return avg(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); return avg(condition, enablePipeline, fields);
} }
/** /**
@ -558,46 +557,46 @@ public interface Func<Children, R> extends Serializable {
* *
* @param condition 条件 * @param condition 条件
* @param enablePipeline 是否管道聚合 * @param enablePipeline 是否管道聚合
* @param returnName 返回的聚合字段名称 * @param columns 支持多列
* @param column
* @return 泛型 * @return 泛型
*/ */
Children avg(boolean condition, boolean enablePipeline, String returnName, String column); Children avg(boolean condition, boolean enablePipeline, String... columns);
default Children min(R column) { default Children min(R column) {
return min(true, FieldUtils.getFieldName(column), column); return min(true, true, column);
} }
default Children min(boolean enablePipeline, R column) { default Children min(boolean enablePipeline, R column) {
return min(true, enablePipeline, FieldUtils.getFieldName(column), column); return min(true, enablePipeline, column);
} }
default Children min(boolean enablePipeline, String returnName, R column) { default Children min(R... column) {
return min(true, enablePipeline, returnName, column); return min(true, true, column);
} }
default Children min(String returnName, R column) { default Children min(boolean enablePipeline, R... columns) {
return min(true, true, returnName, column); return min(true, enablePipeline, columns);
} }
default Children min(String column) { default Children min(String column) {
return min(true, column, column); return min(true, true, column);
} }
default Children min(boolean enablePipeline, String column) { default Children min(boolean enablePipeline, String column) {
return min(true, enablePipeline, column, column); return min(true, enablePipeline, column);
} }
default Children min(boolean enablePipeline, String returnName, String column) { default Children min(String... columns) {
return min(true, enablePipeline, returnName, column); return min(true, true, columns);
} }
default Children min(String returnName, String column) { default Children min(boolean enablePipeline, String... columns) {
return min(true, true, returnName, column); return min(true, enablePipeline, columns);
} }
default Children min(boolean condition, boolean enablePipeline, String returnName, R column) { default Children min(boolean condition, boolean enablePipeline, R... columns) {
return min(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new);
return min(condition, enablePipeline, fields);
} }
/** /**
@ -605,47 +604,46 @@ public interface Func<Children, R> extends Serializable {
* *
* @param condition 条件 * @param condition 条件
* @param enablePipeline 是否管道聚合 * @param enablePipeline 是否管道聚合
* @param returnName 返回的聚合字段名称 * @param columns 支持多列
* @param column
* @return 泛型 * @return 泛型
*/ */
Children min(boolean condition, boolean enablePipeline, String returnName, String column); Children min(boolean condition, boolean enablePipeline, String... columns);
default Children max(R column) { default Children max(R column) {
return max(true, FieldUtils.getFieldName(column), column); return max(true, true, column);
} }
default Children max(boolean enablePipeline, R column) { default Children max(boolean enablePipeline, R column) {
return max(true, enablePipeline, FieldUtils.getFieldName(column), column); return max(true, enablePipeline, column);
} }
default Children max(boolean enablePipeline, String returnName, R column) { default Children max(R... columns) {
return max(true, enablePipeline, returnName, column); return max(true, true, columns);
} }
default Children max(String returnName, R column) { default Children max(boolean enablePipeline, R... columns) {
return max(true, true, returnName, column); return max(true, enablePipeline, columns);
} }
default Children max(String column) { default Children max(String column) {
return max(true, column, column); return max(true, true, column);
} }
default Children max(boolean enablePipeline, String column) { default Children max(boolean enablePipeline, String column) {
return max(true, enablePipeline, column, column); return max(true, enablePipeline, column);
} }
default Children max(boolean enablePipeline, String returnName, String column) { default Children max(String... columns) {
return max(true, enablePipeline, returnName, column); return max(true, true, columns);
} }
default Children max(String returnName, String column) { default Children max(boolean enablePipeline, String... columns) {
return max(true, true, returnName, column); return max(true, enablePipeline, columns);
} }
default Children max(boolean condition, boolean enablePipeline, String returnName, R column) { default Children max(boolean condition, boolean enablePipeline, R... columns) {
return max(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new);
return max(condition, enablePipeline, fields);
} }
/** /**
@ -653,47 +651,46 @@ public interface Func<Children, R> extends Serializable {
* *
* @param condition 条件 * @param condition 条件
* @param enablePipeline 是否管道聚合 * @param enablePipeline 是否管道聚合
* @param returnName 返回的聚合字段名称 * @param columns 支持多列
* @param column
* @return 泛型 * @return 泛型
*/ */
Children max(boolean condition, boolean enablePipeline, String returnName, String column); Children max(boolean condition, boolean enablePipeline, String... columns);
default Children sum(R column) { default Children sum(R column) {
return sum(true, FieldUtils.getFieldName(column), column); return sum(true, true, column);
} }
default Children sum(boolean enablePipeline, R column) { default Children sum(boolean enablePipeline, R column) {
return sum(true, enablePipeline, FieldUtils.getFieldName(column), column); return sum(true, enablePipeline, column);
} }
default Children sum(boolean enablePipeline, String returnName, R column) { default Children sum(R... columns) {
return sum(true, enablePipeline, returnName, column); return sum(true, true, columns);
} }
default Children sum(String returnName, R column) { default Children sum(boolean enablePipeline, R... columns) {
return sum(true, true, returnName, column); return sum(true, enablePipeline, columns);
} }
default Children sum(String column) { default Children sum(String column) {
return sum(true, column, column); return sum(true, true, column);
} }
default Children sum(boolean enablePipeline, String column) { default Children sum(boolean enablePipeline, String column) {
return sum(true, enablePipeline, column, column); return sum(true, enablePipeline, column);
} }
default Children sum(boolean enablePipeline, String returnName, String column) { default Children sum(String... columns) {
return sum(true, enablePipeline, returnName, column); return sum(true, true, columns);
} }
default Children sum(String returnName, String column) { default Children sum(boolean enablePipeline, String... columns) {
return sum(true, true, returnName, column); return sum(true, enablePipeline, columns);
} }
default Children sum(boolean condition, boolean enablePipeline, String returnName, R column) { default Children sum(boolean condition, boolean enablePipeline, R... columns) {
return sum(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new);
return sum(condition, enablePipeline, fields);
} }
/** /**
@ -701,12 +698,10 @@ public interface Func<Children, R> extends Serializable {
* *
* @param condition 条件 * @param condition 条件
* @param enablePipeline 是否管道聚合 * @param enablePipeline 是否管道聚合
* @param returnName 返回的聚合字段名称 * @param columns 支持多列
* @param column
* @return 泛型 * @return 泛型
*/ */
Children sum(boolean condition, boolean enablePipeline, String returnName, String column); Children sum(boolean condition, boolean enablePipeline, String... columns);
default Children sort(SortBuilder<?> sortBuilder) { default Children sort(SortBuilder<?> sortBuilder) {
return sort(true, sortBuilder); return sort(true, sortBuilder);

View File

@ -59,6 +59,38 @@ public class AggTest {
System.out.println(response); System.out.println(response);
} }
@Test
@SuppressWarnings("unchecked")
public void testTermsFuncAgg() {
// 根据标题和副标题聚合,聚合完在该桶中再次根据点赞数聚合
// 注意:指定的多个聚合参数为链式聚合,就是第一个聚合参数聚合之后的结果,再根据第二个参数聚合,对应Pipeline聚合
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(Document::getTitle, "老汉")
.termsAggregation(Document::getTitle, Document::getSubTitle)
.avg(Document::getStarNum, Document::getScore)
.min(true, Document::getStarNum, Document::getScore)
.max(false, Document::getStarNum, Document::getScore)
.sum(false, false, Document::getStarNum, Document::getScore);
SearchResponse response = documentMapper.search(wrapper);
System.out.println(response);
}
@Test
public void testTermsStrAgg() {
// 根据标题和副标题聚合,聚合完在该桶中再次根据点赞数聚合
// 注意:指定的多个聚合参数为链式聚合,就是第一个聚合参数聚合之后的结果,再根据第二个参数聚合,对应Pipeline聚合
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(Document::getTitle, "老汉")
.termsAggregation("title", "subTitle")
.avg("starNum", "score")
.min(true, "starNum", "score")
.max(false, "starNum", "score")
.sum(false, false, "starNum", "score");
SearchResponse response = documentMapper.search(wrapper);
System.out.println(response);
}
@Test @Test
public void testAggNotPipeline() { public void testAggNotPipeline() {
// 对于下面两个字段,如果不想以pipeline管道聚合,各自聚合的结果在各自的桶中展示的话,我们也提供了支持 // 对于下面两个字段,如果不想以pipeline管道聚合,各自聚合的结果在各自的桶中展示的话,我们也提供了支持