diff --git a/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractChainWrapper.java b/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractChainWrapper.java index a185ccb0..60710029 100644 --- a/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractChainWrapper.java +++ b/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractChainWrapper.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Map; import java.util.function.BiPredicate; import java.util.function.Consumer; -import java.util.function.Function; /** * 链式 @@ -220,32 +219,32 @@ public abstract class AbstractChainWrapper doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, column, column)); + Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, column)); return typedThis; } @Override - public Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, String column) { - return doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, returnName, column); + public Children termsAggregation(boolean condition, boolean enablePipeline, String... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.TERMS, column)); + return typedThis; } @Override - public Children avg(boolean condition, boolean enablePipeline, String returnName, String column) { - return doIt(condition, enablePipeline, AggregationTypeEnum.AVG, returnName, column); + public Children avg(boolean condition, boolean enablePipeline, String... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.AVG, column)); + return typedThis; } @Override - public Children min(boolean condition, boolean enablePipeline, String returnName, String column) { - return doIt(condition, enablePipeline, AggregationTypeEnum.MIN, returnName, column); + public Children min(boolean condition, boolean enablePipeline, String... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.MIN, column)); + return typedThis; } @Override - public Children max(boolean condition, boolean enablePipeline, String returnName, String column) { - return doIt(condition, enablePipeline, AggregationTypeEnum.MAX, returnName, column); + public Children max(boolean condition, boolean enablePipeline, String... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.MAX, column)); + return typedThis; } @Override - public Children sum(boolean condition, boolean enablePipeline, String returnName, String column) { - return doIt(condition, enablePipeline, AggregationTypeEnum.SUM, returnName, column); + public Children sum(boolean condition, boolean enablePipeline, String... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + Arrays.stream(columns).forEach(column -> doIt(condition, enablePipeline, AggregationTypeEnum.SUM, column)); + return typedThis; } @Override @@ -531,15 +551,14 @@ public abstract class AbstractWrapper extends Serializable { } 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) { @@ -469,39 +469,40 @@ public interface Func extends Serializable { Children groupBy(boolean condition, boolean enablePipeline, String... columns); 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) { - return termsAggregation(true, enablePipeline, FieldUtils.getFieldName(column), column); + return termsAggregation(true, enablePipeline, column); } - default Children termsAggregation(String returnName, R column) { - return termsAggregation(true, true, returnName, column); + default Children termsAggregation(R... columns) { + return termsAggregation(true, true, columns); } - default Children termsAggregation(boolean enablePipeline, String returnName, R column) { - return termsAggregation(true, enablePipeline, returnName, column); + default Children termsAggregation(boolean enablePipeline, R... columns) { + return termsAggregation(true, enablePipeline, columns); } default Children termsAggregation(String column) { - return termsAggregation(true, true, column, column); + return termsAggregation(true, true, 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) { - return termsAggregation(true, true, returnName, column); + default Children termsAggregation(String... columns) { + return termsAggregation(true, true, columns); } - default Children termsAggregation(boolean enablePipeline, String returnName, String column) { - return termsAggregation(true, enablePipeline, returnName, column); + default Children termsAggregation(boolean enablePipeline, String... columns) { + return termsAggregation(true, enablePipeline, columns); } - default Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, R column) { - return termsAggregation(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); + default Children termsAggregation(boolean condition, boolean enablePipeline, R... columns) { + String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new); + return termsAggregation(condition, enablePipeline, fields); } /** @@ -509,48 +510,46 @@ public interface Func extends Serializable { * * @param condition 条件 * @param enablePipeline 是否管道聚合 - * @param returnName 返回的聚合字段名称 - * @param column 列 + * @param columns 列,支持多列 * @return 泛型 */ - Children termsAggregation(boolean condition, boolean enablePipeline, String returnName, String column); - + Children termsAggregation(boolean condition, boolean enablePipeline, String... columns); 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) { - return avg(true, enablePipeline, FieldUtils.getFieldName(column), column); + return avg(true, enablePipeline, column); } - default Children avg(boolean enablePipeline, String returnName, R column) { - return avg(true, enablePipeline, returnName, column); + default Children avg(R... columns) { + return avg(true, true, columns); } - default Children avg(String returnName, R column) { - return avg(true, true, returnName, column); + default Children avg(boolean enablePipeline, R... columns) { + return avg(true, enablePipeline, columns); } 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) { return avg(true, enablePipeline, column, column); } - default Children avg(boolean enablePipeline, String returnName, String column) { - return avg(true, enablePipeline, returnName, column); + default Children avg(String... columns) { + return avg(true, true, columns); } - default Children avg(String returnName, String column) { - return avg(true, true, returnName, column); + default Children avg(boolean enablePipeline, String... columns) { + return avg(true, enablePipeline, columns); } - - default Children avg(boolean condition, boolean enablePipeline, String returnName, R column) { - return avg(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); + default Children avg(boolean condition, boolean enablePipeline, R... columns) { + String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new); + return avg(condition, enablePipeline, fields); } /** @@ -558,46 +557,46 @@ public interface Func extends Serializable { * * @param condition 条件 * @param enablePipeline 是否管道聚合 - * @param returnName 返回的聚合字段名称 - * @param column 列 + * @param columns 列,支持多列 * @return 泛型 */ - Children avg(boolean condition, boolean enablePipeline, String returnName, String column); + Children avg(boolean condition, boolean enablePipeline, String... columns); default Children min(R column) { - return min(true, FieldUtils.getFieldName(column), column); + return min(true, true, 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) { - return min(true, enablePipeline, returnName, column); + default Children min(R... column) { + return min(true, true, column); } - default Children min(String returnName, R column) { - return min(true, true, returnName, column); + default Children min(boolean enablePipeline, R... columns) { + return min(true, enablePipeline, columns); } default Children min(String column) { - return min(true, column, column); + return min(true, true, 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) { - return min(true, enablePipeline, returnName, column); + default Children min(String... columns) { + return min(true, true, columns); } - default Children min(String returnName, String column) { - return min(true, true, returnName, column); + default Children min(boolean enablePipeline, String... columns) { + return min(true, enablePipeline, columns); } - default Children min(boolean condition, boolean enablePipeline, String returnName, R column) { - return min(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); + default Children min(boolean condition, boolean enablePipeline, R... columns) { + String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new); + return min(condition, enablePipeline, fields); } /** @@ -605,47 +604,46 @@ public interface Func extends Serializable { * * @param condition 条件 * @param enablePipeline 是否管道聚合 - * @param returnName 返回的聚合字段名称 - * @param column 列 + * @param columns 列,支持多列 * @return 泛型 */ - Children min(boolean condition, boolean enablePipeline, String returnName, String column); - + Children min(boolean condition, boolean enablePipeline, String... columns); default Children max(R column) { - return max(true, FieldUtils.getFieldName(column), column); + return max(true, true, 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) { - return max(true, enablePipeline, returnName, column); + default Children max(R... columns) { + return max(true, true, columns); } - default Children max(String returnName, R column) { - return max(true, true, returnName, column); + default Children max(boolean enablePipeline, R... columns) { + return max(true, enablePipeline, columns); } default Children max(String column) { - return max(true, column, column); + return max(true, true, 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) { - return max(true, enablePipeline, returnName, column); + default Children max(String... columns) { + return max(true, true, columns); } - default Children max(String returnName, String column) { - return max(true, true, returnName, column); + default Children max(boolean enablePipeline, String... columns) { + return max(true, enablePipeline, columns); } - default Children max(boolean condition, boolean enablePipeline, String returnName, R column) { - return max(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); + default Children max(boolean condition, boolean enablePipeline, R... columns) { + String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new); + return max(condition, enablePipeline, fields); } /** @@ -653,47 +651,46 @@ public interface Func extends Serializable { * * @param condition 条件 * @param enablePipeline 是否管道聚合 - * @param returnName 返回的聚合字段名称 - * @param column 列 + * @param columns 列,支持多列 * @return 泛型 */ - Children max(boolean condition, boolean enablePipeline, String returnName, String column); - + Children max(boolean condition, boolean enablePipeline, String... columns); default Children sum(R column) { - return sum(true, FieldUtils.getFieldName(column), column); + return sum(true, true, 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) { - return sum(true, enablePipeline, returnName, column); + default Children sum(R... columns) { + return sum(true, true, columns); } - default Children sum(String returnName, R column) { - return sum(true, true, returnName, column); + default Children sum(boolean enablePipeline, R... columns) { + return sum(true, enablePipeline, columns); } default Children sum(String column) { - return sum(true, column, column); + return sum(true, true, 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) { - return sum(true, enablePipeline, returnName, column); + default Children sum(String... columns) { + return sum(true, true, columns); } - default Children sum(String returnName, String column) { - return sum(true, true, returnName, column); + default Children sum(boolean enablePipeline, String... columns) { + return sum(true, enablePipeline, columns); } - default Children sum(boolean condition, boolean enablePipeline, String returnName, R column) { - return sum(condition, enablePipeline, returnName, FieldUtils.getFieldName(column)); + default Children sum(boolean condition, boolean enablePipeline, R... columns) { + String[] fields = Arrays.stream(columns).map(FieldUtils::getFieldName).toArray(String[]::new); + return sum(condition, enablePipeline, fields); } /** @@ -701,12 +698,10 @@ public interface Func extends Serializable { * * @param condition 条件 * @param enablePipeline 是否管道聚合 - * @param returnName 返回的聚合字段名称 - * @param column 列 + * @param columns 列,支持多列 * @return 泛型 */ - Children sum(boolean condition, boolean enablePipeline, String returnName, String column); - + Children sum(boolean condition, boolean enablePipeline, String... columns); default Children sort(SortBuilder sortBuilder) { return sort(true, sortBuilder); diff --git a/easy-es-test/src/test/java/cn/easyes/test/agg/AggTest.java b/easy-es-test/src/test/java/cn/easyes/test/agg/AggTest.java index bd44c64a..94f2d817 100644 --- a/easy-es-test/src/test/java/cn/easyes/test/agg/AggTest.java +++ b/easy-es-test/src/test/java/cn/easyes/test/agg/AggTest.java @@ -59,6 +59,38 @@ public class AggTest { System.out.println(response); } + @Test + @SuppressWarnings("unchecked") + public void testTermsFuncAgg() { + // 根据标题和副标题聚合,聚合完在该桶中再次根据点赞数聚合 + // 注意:指定的多个聚合参数为链式聚合,就是第一个聚合参数聚合之后的结果,再根据第二个参数聚合,对应Pipeline聚合 + LambdaEsQueryWrapper 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 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 public void testAggNotPipeline() { // 对于下面两个字段,如果不想以pipeline管道聚合,各自聚合的结果在各自的桶中展示的话,我们也提供了支持