This is an automated email from the ASF dual-hosted git repository. xiangfu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push: new 48d1653 Support aggregation function name with underscore inside (#5795) 48d1653 is described below commit 48d1653c012b42f19999b50dc1b5d3039a09eeaa Author: Xiang Fu <fx19880...@gmail.com> AuthorDate: Thu Aug 6 23:43:03 2020 -0700 Support aggregation function name with underscore inside (#5795) * Support aggregation function name with underscore inside * Change ST_Union AggregationType enum to STUnion * Simplify the handling Co-authored-by: Xiaotian (Jackie) Jiang <jackie....@gmail.com> --- .../common/function/AggregationFunctionType.java | 13 ++++++++++--- .../function/AggregationFunctionFactory.java | 6 ++++-- .../function/StUnionAggregationFunction.java | 2 +- .../function/AggregationFunctionFactoryTest.java | 21 +++++++++++++++++++++ .../tests/OfflineClusterIntegrationTest.java | 17 +++++++++++++++++ 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/pinot-common/src/main/java/org/apache/pinot/common/function/AggregationFunctionType.java b/pinot-common/src/main/java/org/apache/pinot/common/function/AggregationFunctionType.java index 62704db..fc60ea6 100644 --- a/pinot-common/src/main/java/org/apache/pinot/common/function/AggregationFunctionType.java +++ b/pinot-common/src/main/java/org/apache/pinot/common/function/AggregationFunctionType.java @@ -18,6 +18,12 @@ */ package org.apache.pinot.common.function; +import org.apache.commons.lang3.StringUtils; + + +/** + * NOTE: No underscore is allowed in the enum name. + */ public enum AggregationFunctionType { // Aggregation functions for single-valued columns COUNT("count"), @@ -38,8 +44,8 @@ public enum AggregationFunctionType { PERCENTILEEST("percentileEst"), PERCENTILETDIGEST("percentileTDigest"), - // geo aggregation functions - ST_UNION("ST_Union"), + // Geo aggregation functions + STUNION("STUnion"), // Aggregation functions for multi-valued columns COUNTMV("countMV"), @@ -78,9 +84,10 @@ public enum AggregationFunctionType { /** * Returns the corresponding aggregation function type for the given function name. + * <p>NOTE: Underscores in the function name are ignored. */ public static AggregationFunctionType getAggregationFunctionType(String functionName) { - String upperCaseFunctionName = functionName.toUpperCase(); + String upperCaseFunctionName = StringUtils.remove(functionName, '_').toUpperCase(); if (upperCaseFunctionName.startsWith("PERCENTILE")) { String remainingFunctionName = upperCaseFunctionName.substring(10); if (remainingFunctionName.isEmpty() || remainingFunctionName.matches("\\d+")) { diff --git a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactory.java b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactory.java index 08eed30..a218ef1 100644 --- a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactory.java +++ b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactory.java @@ -20,6 +20,7 @@ package org.apache.pinot.core.query.aggregation.function; import com.google.common.base.Preconditions; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.apache.pinot.common.function.AggregationFunctionType; import org.apache.pinot.core.query.exception.BadQueryRequestException; import org.apache.pinot.core.query.request.context.ExpressionContext; @@ -37,6 +38,7 @@ public class AggregationFunctionFactory { /** * Given the function information, returns a new instance of the corresponding aggregation function. + * <p>NOTE: Underscores in the function name are ignored. * <p>NOTE: We pass the query context to this method because DISTINCT is currently modeled as an aggregation function * and requires the order-by and limit information from the query. * <p>TODO: Consider modeling DISTINCT as unique selection instead of aggregation so that early-termination, limit and @@ -44,7 +46,7 @@ public class AggregationFunctionFactory { */ public static AggregationFunction getAggregationFunction(FunctionContext function, QueryContext queryContext) { try { - String upperCaseFunctionName = function.getFunctionName().toUpperCase(); + String upperCaseFunctionName = StringUtils.remove(function.getFunctionName(), '_').toUpperCase(); List<ExpressionContext> arguments = function.getArguments(); ExpressionContext firstArgument = arguments.get(0); if (upperCaseFunctionName.startsWith("PERCENTILE")) { @@ -158,7 +160,7 @@ public class AggregationFunctionFactory { case DISTINCT: return new DistinctAggregationFunction(arguments, queryContext.getOrderByExpressions(), queryContext.getLimit()); - case ST_UNION: + case STUNION: return new StUnionAggregationFunction(firstArgument); default: throw new IllegalArgumentException(); diff --git a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/StUnionAggregationFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/StUnionAggregationFunction.java index eff99db..baff2ee 100644 --- a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/StUnionAggregationFunction.java +++ b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/StUnionAggregationFunction.java @@ -46,7 +46,7 @@ public class StUnionAggregationFunction extends BaseSingleInputAggregationFuncti @Override public AggregationFunctionType getType() { - return AggregationFunctionType.ST_UNION; + return AggregationFunctionType.STUNION; } @Override diff --git a/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactoryTest.java b/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactoryTest.java index 0b4360e..476c086 100644 --- a/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactoryTest.java +++ b/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AggregationFunctionFactoryTest.java @@ -163,6 +163,13 @@ public class AggregationFunctionFactoryTest { assertEquals(aggregationFunction.getColumnName(), "avgMV_column"); assertEquals(aggregationFunction.getResultColumnName(), function.toString()); + function = getFunction("AvG_mV"); + aggregationFunction = AggregationFunctionFactory.getAggregationFunction(function, DUMMY_QUERY_CONTEXT); + assertTrue(aggregationFunction instanceof AvgMVAggregationFunction); + assertEquals(aggregationFunction.getType(), AggregationFunctionType.AVGMV); + assertEquals(aggregationFunction.getColumnName(), "avgMV_column"); + assertEquals(aggregationFunction.getResultColumnName(), "avgmv(column)"); + function = getFunction("MiNmAxRaNgEmV"); aggregationFunction = AggregationFunctionFactory.getAggregationFunction(function, DUMMY_QUERY_CONTEXT); assertTrue(aggregationFunction instanceof MinMaxRangeMVAggregationFunction); @@ -184,6 +191,13 @@ public class AggregationFunctionFactoryTest { assertEquals(aggregationFunction.getColumnName(), "distinctCountHLLMV_column"); assertEquals(aggregationFunction.getResultColumnName(), function.toString()); + function = getFunction("DiStInCt_CoUnT_hLl_Mv"); + aggregationFunction = AggregationFunctionFactory.getAggregationFunction(function, DUMMY_QUERY_CONTEXT); + assertTrue(aggregationFunction instanceof DistinctCountHLLMVAggregationFunction); + assertEquals(aggregationFunction.getType(), AggregationFunctionType.DISTINCTCOUNTHLLMV); + assertEquals(aggregationFunction.getColumnName(), "distinctCountHLLMV_column"); + assertEquals(aggregationFunction.getResultColumnName(), "distinctcounthllmv(column)"); + function = getFunction("DiStInCtCoUnTrAwHlLmV"); aggregationFunction = AggregationFunctionFactory.getAggregationFunction(function, DUMMY_QUERY_CONTEXT); assertTrue(aggregationFunction instanceof DistinctCountRawHLLMVAggregationFunction); @@ -211,6 +225,13 @@ public class AggregationFunctionFactoryTest { assertEquals(aggregationFunction.getType(), AggregationFunctionType.PERCENTILETDIGESTMV); assertEquals(aggregationFunction.getColumnName(), "percentileTDigest95MV_column"); assertEquals(aggregationFunction.getResultColumnName(), function.toString()); + + function = getFunction("PeRcEnTiLe_TdIgEsT_95_mV"); + aggregationFunction = AggregationFunctionFactory.getAggregationFunction(function, DUMMY_QUERY_CONTEXT); + assertTrue(aggregationFunction instanceof PercentileTDigestMVAggregationFunction); + assertEquals(aggregationFunction.getType(), AggregationFunctionType.PERCENTILETDIGESTMV); + assertEquals(aggregationFunction.getColumnName(), "percentileTDigest95MV_column"); + assertEquals(aggregationFunction.getResultColumnName(), "percentiletdigest95mv(column)"); } private FunctionContext getFunction(String functionName) { diff --git a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java index 9827001..7475715 100644 --- a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java +++ b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java @@ -1264,4 +1264,21 @@ public class OfflineClusterIntegrationTest extends BaseClusterIntegrationTestSet assertEquals(postSqlQuery(query, _brokerBaseApiUrl).get("resultTable").get("rows").get(0).get(0).asLong(), expectedResults[10]); } + + @Test + public void testAggregationFunctionsWithUnderscore() + throws Exception { + String query; + + // The Accurate value is 6538. + query = "SELECT distinct_count(FlightNum) FROM mytable "; + assertEquals(postQuery(query).get("aggregationResults").get(0).get("value").asLong(), 6538); + assertEquals(postSqlQuery(query, _brokerBaseApiUrl).get("resultTable").get("rows").get(0).get(0).asLong(), 6538); + + // The Accurate value is 6538. + query = "SELECT c_o_u_n_t(FlightNum) FROM mytable "; + assertEquals(postQuery(query).get("aggregationResults").get(0).get("value").asLong(), 115545); + assertEquals(postSqlQuery(query, _brokerBaseApiUrl).get("resultTable").get("rows").get(0).get(0).asLong(), 115545); + + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org