mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
[improvement][headless] fix derived metric aggOption error (#679)
This commit is contained in:
@@ -4,7 +4,6 @@ package com.tencent.supersonic.headless.core.parser.calcite.schema;
|
||||
import com.tencent.supersonic.headless.api.enums.EngineType;
|
||||
import com.tencent.supersonic.headless.core.parser.calcite.Configuration;
|
||||
import com.tencent.supersonic.headless.core.parser.calcite.sql.S2SQLSqlValidatorImpl;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -74,7 +73,7 @@ public class SchemaBuilder {
|
||||
builder.addField(dim, SqlTypeName.VARCHAR);
|
||||
}
|
||||
for (String metric : metrics) {
|
||||
builder.addField(metric, SqlTypeName.BIGINT);
|
||||
builder.addField(metric, SqlTypeName.ANY);
|
||||
}
|
||||
DataSourceTable srcTable = builder
|
||||
.withRowCount(1)
|
||||
|
||||
@@ -135,6 +135,7 @@ public class CalculateAggConverter implements HeadlessConverter {
|
||||
throws Exception {
|
||||
QueryStructReq queryStructReq = queryStatement.getQueryStructReq();
|
||||
check(queryStructReq);
|
||||
queryStatement.setEnableOptimize(false);
|
||||
ParseSqlReq sqlCommand = new ParseSqlReq();
|
||||
sqlCommand.setRootPath(queryStructReq.getModelIdStr());
|
||||
String metricTableName = "v_metric_tb_tmp";
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
package com.tencent.supersonic.headless.core.utils;
|
||||
|
||||
import static com.tencent.supersonic.common.pojo.Constants.DAY;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.DAY_FORMAT;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.JOIN_UNDERLINE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.MONTH;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.WEEK;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.Aggregator;
|
||||
import com.tencent.supersonic.common.pojo.DateConf;
|
||||
import com.tencent.supersonic.common.pojo.ItemDateResp;
|
||||
@@ -10,21 +17,13 @@ import com.tencent.supersonic.common.util.SqlFilterUtils;
|
||||
import com.tencent.supersonic.common.util.StringUtil;
|
||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserReplaceHelper;
|
||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper;
|
||||
import com.tencent.supersonic.headless.api.enums.AggOption;
|
||||
import com.tencent.supersonic.headless.api.enums.EngineType;
|
||||
import com.tencent.supersonic.headless.api.enums.MetricDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.Measure;
|
||||
import com.tencent.supersonic.headless.api.request.QueryStructReq;
|
||||
import com.tencent.supersonic.headless.api.response.DimensionResp;
|
||||
import com.tencent.supersonic.headless.api.response.MetricResp;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import org.apache.commons.lang3.tuple.Triple;
|
||||
import org.apache.logging.log4j.util.Strings;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Collections;
|
||||
@@ -36,13 +35,14 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.tencent.supersonic.common.pojo.Constants.DAY;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.DAY_FORMAT;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.JOIN_UNDERLINE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.MONTH;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.WEEK;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import org.apache.commons.lang3.tuple.Triple;
|
||||
import org.apache.logging.log4j.util.Strings;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* tools functions to analyze queryStructReq
|
||||
@@ -271,7 +271,8 @@ public class SqlGenerateUtils {
|
||||
|
||||
public String generateDerivedMetric(final List<MetricResp> metricResps, final Set<String> allFields,
|
||||
final Map<String, Measure> allMeasures, final List<DimensionResp> dimensionResps,
|
||||
final String expression, final MetricDefineType metricDefineType, Set<String> visitedMetric,
|
||||
final String expression, final MetricDefineType metricDefineType, AggOption aggOption,
|
||||
Set<String> visitedMetric,
|
||||
Set<String> measures,
|
||||
Set<String> dimensions) {
|
||||
Set<String> fields = SqlParserSelectHelper.getColumnFromExpr(expression);
|
||||
@@ -289,14 +290,14 @@ public class SqlGenerateUtils {
|
||||
replace.put(field,
|
||||
generateDerivedMetric(metricResps, allFields, allMeasures, dimensionResps,
|
||||
getExpr(metricItem.get()), metricItem.get().getMetricDefineType(),
|
||||
visitedMetric, measures, dimensions));
|
||||
aggOption, visitedMetric, measures, dimensions));
|
||||
visitedMetric.add(field);
|
||||
}
|
||||
break;
|
||||
case MEASURE:
|
||||
if (allMeasures.containsKey(field)) {
|
||||
measures.add(field);
|
||||
replace.put(field, getExpr(allMeasures.get(field)));
|
||||
replace.put(field, getExpr(allMeasures.get(field), aggOption));
|
||||
}
|
||||
break;
|
||||
case FIELD:
|
||||
@@ -324,12 +325,15 @@ public class SqlGenerateUtils {
|
||||
return expression;
|
||||
}
|
||||
|
||||
public String getExpr(Measure measure) {
|
||||
public String getExpr(Measure measure, AggOption aggOption) {
|
||||
if (AggOperatorEnum.COUNT_DISTINCT.getOperator().equalsIgnoreCase(measure.getAgg())) {
|
||||
return AggOperatorEnum.COUNT.getOperator() + " ( " + AggOperatorEnum.DISTINCT + " " + measure.getBizName()
|
||||
+ " ) ";
|
||||
return aggOption.equals(AggOption.NATIVE) ? measure.getBizName()
|
||||
: AggOperatorEnum.COUNT.getOperator() + " ( " + AggOperatorEnum.DISTINCT + " "
|
||||
+ measure.getBizName()
|
||||
+ " ) ";
|
||||
}
|
||||
return measure.getAgg() + " ( " + measure.getBizName() + " ) ";
|
||||
return aggOption.equals(AggOption.NATIVE) ? measure.getBizName()
|
||||
: measure.getAgg() + " ( " + measure.getBizName() + " ) ";
|
||||
}
|
||||
|
||||
public String getExpr(MetricResp metricResp) {
|
||||
|
||||
Reference in New Issue
Block a user