mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 12:07:42 +00:00
(improvement)(headless) Refactor MetricDrillDownChecker code (#1356)
Co-authored-by: lxwcodemonkey
This commit is contained in:
@@ -43,6 +43,7 @@ import com.tencent.supersonic.headless.core.utils.ComponentFactory;
|
|||||||
import com.tencent.supersonic.headless.server.annotation.S2DataPermission;
|
import com.tencent.supersonic.headless.server.annotation.S2DataPermission;
|
||||||
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
||||||
import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager;
|
import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager;
|
||||||
|
import com.tencent.supersonic.headless.server.utils.MetricDrillDownChecker;
|
||||||
import com.tencent.supersonic.headless.server.utils.QueryReqConverter;
|
import com.tencent.supersonic.headless.server.utils.QueryReqConverter;
|
||||||
import com.tencent.supersonic.headless.server.utils.QueryUtils;
|
import com.tencent.supersonic.headless.server.utils.QueryUtils;
|
||||||
import com.tencent.supersonic.headless.server.utils.StatUtils;
|
import com.tencent.supersonic.headless.server.utils.StatUtils;
|
||||||
@@ -77,6 +78,8 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
private final SchemaService schemaService;
|
private final SchemaService schemaService;
|
||||||
private final SemanticTranslator semanticTranslator;
|
private final SemanticTranslator semanticTranslator;
|
||||||
|
|
||||||
|
private final MetricDrillDownChecker metricDrillDownChecker;
|
||||||
|
|
||||||
public S2SemanticLayerService(
|
public S2SemanticLayerService(
|
||||||
StatUtils statUtils,
|
StatUtils statUtils,
|
||||||
QueryUtils queryUtils,
|
QueryUtils queryUtils,
|
||||||
@@ -84,7 +87,8 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
SemanticSchemaManager semanticSchemaManager,
|
SemanticSchemaManager semanticSchemaManager,
|
||||||
DataSetService dataSetService,
|
DataSetService dataSetService,
|
||||||
SchemaService schemaService,
|
SchemaService schemaService,
|
||||||
SemanticTranslator semanticTranslator) {
|
SemanticTranslator semanticTranslator,
|
||||||
|
MetricDrillDownChecker metricDrillDownChecker) {
|
||||||
this.statUtils = statUtils;
|
this.statUtils = statUtils;
|
||||||
this.queryUtils = queryUtils;
|
this.queryUtils = queryUtils;
|
||||||
this.queryReqConverter = queryReqConverter;
|
this.queryReqConverter = queryReqConverter;
|
||||||
@@ -92,6 +96,7 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
this.dataSetService = dataSetService;
|
this.dataSetService = dataSetService;
|
||||||
this.schemaService = schemaService;
|
this.schemaService = schemaService;
|
||||||
this.semanticTranslator = semanticTranslator;
|
this.semanticTranslator = semanticTranslator;
|
||||||
|
this.metricDrillDownChecker = metricDrillDownChecker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DataSetSchema getDataSetSchema(Long id) {
|
public DataSetSchema getDataSetSchema(Long id) {
|
||||||
@@ -263,15 +268,17 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
return querySqlReq;
|
return querySqlReq;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SemanticQueryResp query(QueryStatement queryStatement) throws Exception {
|
private SemanticQueryResp query(QueryStatement queryStatement) {
|
||||||
SemanticQueryResp semanticQueryResp = null;
|
SemanticQueryResp semanticQueryResp = null;
|
||||||
try {
|
try {
|
||||||
//1 translate
|
//1 translate
|
||||||
if (!queryStatement.isTranslated()) {
|
if (!queryStatement.isTranslated()) {
|
||||||
semanticTranslator.translate(queryStatement);
|
semanticTranslator.translate(queryStatement);
|
||||||
}
|
}
|
||||||
|
//2. query pre-check
|
||||||
|
queryPreCheck(queryStatement);
|
||||||
|
|
||||||
//2 execute
|
//3 execute
|
||||||
for (QueryExecutor queryExecutor : ComponentFactory.getQueryExecutors()) {
|
for (QueryExecutor queryExecutor : ComponentFactory.getQueryExecutors()) {
|
||||||
if (queryExecutor.accept(queryStatement)) {
|
if (queryExecutor.accept(queryStatement)) {
|
||||||
semanticQueryResp = queryExecutor.execute(queryStatement);
|
semanticQueryResp = queryExecutor.execute(queryStatement);
|
||||||
@@ -286,6 +293,12 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void queryPreCheck(QueryStatement queryStatement) {
|
||||||
|
//Check whether the dimensions of the metric drill-down are correct temporarily,
|
||||||
|
//add the abstraction of a validator later.
|
||||||
|
metricDrillDownChecker.checkQuery(queryStatement);
|
||||||
|
}
|
||||||
|
|
||||||
public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, DataSetSchema dataSetSchema, User user) {
|
public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, DataSetSchema dataSetSchema, User user) {
|
||||||
if (parseInfo != null && parseInfo.getDataSetId() != null && parseInfo.getDataSetId() > 0) {
|
if (parseInfo != null && parseInfo.getDataSetId() != null && parseInfo.getDataSetId() > 0) {
|
||||||
EntityInfo entityInfo = getEntityBasicInfo(dataSetSchema);
|
EntityInfo entityInfo = getEntityBasicInfo(dataSetSchema);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.tencent.supersonic.headless.server.aspect;
|
package com.tencent.supersonic.headless.server.utils;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
|
||||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||||
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
|
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
|
||||||
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
|
|
||||||
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
|
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.DimSchemaResp;
|
import com.tencent.supersonic.headless.api.pojo.response.DimSchemaResp;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
||||||
@@ -14,9 +14,6 @@ import com.tencent.supersonic.headless.core.pojo.QueryStatement;
|
|||||||
import com.tencent.supersonic.headless.server.web.service.MetricService;
|
import com.tencent.supersonic.headless.server.web.service.MetricService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.aspectj.lang.ProceedingJoinPoint;
|
|
||||||
import org.aspectj.lang.annotation.Around;
|
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
@@ -25,7 +22,6 @@ import java.util.List;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Aspect
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class MetricDrillDownChecker {
|
public class MetricDrillDownChecker {
|
||||||
@@ -33,15 +29,10 @@ public class MetricDrillDownChecker {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private MetricService metricService;
|
private MetricService metricService;
|
||||||
|
|
||||||
@Around("execution(* com.tencent.supersonic.headless.core.translator.DefaultSemanticTranslator.parse(..))")
|
public void checkQuery(QueryStatement queryStatement) {
|
||||||
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
SemanticSchemaResp semanticSchemaResp = queryStatement.getSemanticSchemaResp();
|
||||||
Object[] objects = joinPoint.getArgs();
|
String sql = queryStatement.getDataSetQueryParam().getSql();
|
||||||
QueryStatement queryStatement = (QueryStatement) objects[0];
|
checkQuery(semanticSchemaResp, sql);
|
||||||
if (queryStatement.getDataSetQueryParam() == null) {
|
|
||||||
return joinPoint.proceed();
|
|
||||||
}
|
|
||||||
checkQuery(queryStatement.getSemanticSchemaResp(), queryStatement.getDataSetQueryParam().getSql());
|
|
||||||
return joinPoint.proceed();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkQuery(SemanticSchemaResp semanticSchemaResp, String sql) {
|
public void checkQuery(SemanticSchemaResp semanticSchemaResp, String sql) {
|
||||||
@@ -7,6 +7,7 @@ import com.tencent.supersonic.headless.api.pojo.response.DimSchemaResp;
|
|||||||
import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp;
|
import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
||||||
import com.tencent.supersonic.headless.server.utils.DataUtils;
|
import com.tencent.supersonic.headless.server.utils.DataUtils;
|
||||||
|
import com.tencent.supersonic.headless.server.utils.MetricDrillDownChecker;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
Reference in New Issue
Block a user