mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
(improvment)(chat) semantic parse info dimension filters support UNION and AND splicing methods (#203)
Co-authored-by: jolunoluo
This commit is contained in:
@@ -15,6 +15,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -27,6 +28,7 @@ public class SemanticParseInfo {
|
|||||||
private Set<SchemaElement> dimensions = new LinkedHashSet();
|
private Set<SchemaElement> dimensions = new LinkedHashSet();
|
||||||
private SchemaElement entity;
|
private SchemaElement entity;
|
||||||
private AggregateTypeEnum aggType = AggregateTypeEnum.NONE;
|
private AggregateTypeEnum aggType = AggregateTypeEnum.NONE;
|
||||||
|
private FilterType filterType = FilterType.UNION;
|
||||||
private Set<QueryFilter> dimensionFilters = new LinkedHashSet();
|
private Set<QueryFilter> dimensionFilters = new LinkedHashSet();
|
||||||
private Set<QueryFilter> metricFilters = new LinkedHashSet();
|
private Set<QueryFilter> metricFilters = new LinkedHashSet();
|
||||||
private Set<Order> orders = new LinkedHashSet();
|
private Set<Order> orders = new LinkedHashSet();
|
||||||
|
|||||||
@@ -220,7 +220,8 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable {
|
|||||||
try {
|
try {
|
||||||
explainSqlReq = ExplainSqlReq.builder()
|
explainSqlReq = ExplainSqlReq.builder()
|
||||||
.queryTypeEnum(QueryTypeEnum.STRUCT)
|
.queryTypeEnum(QueryTypeEnum.STRUCT)
|
||||||
.queryReq(convertQueryStruct())
|
.queryReq(isMultiStructQuery()
|
||||||
|
? convertQueryMultiStruct() : convertQueryStruct())
|
||||||
.build();
|
.build();
|
||||||
return semanticInterpreter.explain(explainSqlReq, user);
|
return semanticInterpreter.explain(explainSqlReq, user);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -229,6 +230,10 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean isMultiStructQuery() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public QueryResult multiStructExecute(User user) {
|
public QueryResult multiStructExecute(User user) {
|
||||||
String queryMode = parseInfo.getQueryMode();
|
String queryMode = parseInfo.getQueryMode();
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.tencent.supersonic.chat.query.rule.metric;
|
|||||||
|
|
||||||
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
||||||
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
||||||
|
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
||||||
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
|
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
|
||||||
import com.tencent.supersonic.semantic.api.query.pojo.Filter;
|
import com.tencent.supersonic.semantic.api.query.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
||||||
@@ -52,7 +53,7 @@ public class MetricEntityQuery extends MetricSemanticQuery {
|
|||||||
parseInfo.getDimensionFilters().stream()
|
parseInfo.getDimensionFilters().stream()
|
||||||
.filter(filter -> filter.getElementID() != null)
|
.filter(filter -> filter.getElementID() != null)
|
||||||
.forEach(filter -> filterBizName.add(filter.getBizName()));
|
.forEach(filter -> filterBizName.add(filter.getBizName()));
|
||||||
return filterBizName.size() > 1;
|
return FilterType.UNION.equals(parseInfo.getFilterType()) && filterBizName.size() > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNum
|
|||||||
|
|
||||||
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
||||||
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
||||||
|
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
||||||
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
|
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
|
||||||
import com.tencent.supersonic.semantic.api.query.pojo.Filter;
|
import com.tencent.supersonic.semantic.api.query.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
||||||
@@ -48,7 +49,7 @@ public class MetricFilterQuery extends MetricSemanticQuery {
|
|||||||
Set<String> filterBizName = new HashSet<>();
|
Set<String> filterBizName = new HashSet<>();
|
||||||
parseInfo.getDimensionFilters().forEach(filter ->
|
parseInfo.getDimensionFilters().forEach(filter ->
|
||||||
filterBizName.add(filter.getBizName()));
|
filterBizName.add(filter.getBizName()));
|
||||||
return filterBizName.size() > 1;
|
return FilterType.UNION.equals(parseInfo.getFilterType()) && filterBizName.size() > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.tencent.supersonic.common.pojo.enums;
|
||||||
|
|
||||||
|
public enum FilterType {
|
||||||
|
//filtering between different dimensions will directly splice the AND clause
|
||||||
|
AND,
|
||||||
|
//filtering between different dimensions will generate multiple sql clauses and splice them together using union
|
||||||
|
UNION
|
||||||
|
}
|
||||||
@@ -172,15 +172,7 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
}
|
}
|
||||||
log.info("stat queryByStructWithoutCache, queryMultiStructReq:{}", queryMultiStructReq);
|
log.info("stat queryByStructWithoutCache, queryMultiStructReq:{}", queryMultiStructReq);
|
||||||
try {
|
try {
|
||||||
List<QueryStatement> sqlParsers = new ArrayList<>();
|
QueryStatement sqlParser = getQueryStatementByMultiStruct(queryMultiStructReq);
|
||||||
for (QueryStructReq queryStructCmd : queryMultiStructReq.getQueryStructReqs()) {
|
|
||||||
QueryStatement queryStatement = semanticQueryEngine.plan(queryStructCmd);
|
|
||||||
queryUtils.checkSqlParse(queryStatement);
|
|
||||||
sqlParsers.add(queryStatement);
|
|
||||||
}
|
|
||||||
log.info("multi sqlParser:{}", sqlParsers);
|
|
||||||
|
|
||||||
QueryStatement sqlParser = queryUtils.sqlParserUnion(queryMultiStructReq, sqlParsers);
|
|
||||||
queryResultWithColumns = semanticQueryEngine.execute(sqlParser);
|
queryResultWithColumns = semanticQueryEngine.execute(sqlParser);
|
||||||
if (queryResultWithColumns != null) {
|
if (queryResultWithColumns != null) {
|
||||||
statUtils.statInfo2DbAsync(TaskStatusEnum.SUCCESS);
|
statUtils.statInfo2DbAsync(TaskStatusEnum.SUCCESS);
|
||||||
@@ -194,6 +186,17 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private QueryStatement getQueryStatementByMultiStruct(QueryMultiStructReq queryMultiStructReq) throws Exception {
|
||||||
|
List<QueryStatement> sqlParsers = new ArrayList<>();
|
||||||
|
for (QueryStructReq queryStructCmd : queryMultiStructReq.getQueryStructReqs()) {
|
||||||
|
QueryStatement queryStatement = semanticQueryEngine.plan(queryStructCmd);
|
||||||
|
queryUtils.checkSqlParse(queryStatement);
|
||||||
|
sqlParsers.add(queryStatement);
|
||||||
|
}
|
||||||
|
log.info("multi sqlParser:{}", sqlParsers);
|
||||||
|
return queryUtils.sqlParserUnion(queryMultiStructReq, sqlParsers);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public QueryResultWithSchemaResp queryDimValue(QueryDimValueReq queryDimValueReq, User user) {
|
public QueryResultWithSchemaResp queryDimValue(QueryDimValueReq queryDimValueReq, User user) {
|
||||||
@@ -236,6 +239,11 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
QueryStatement queryStatement = semanticQueryEngine.plan((QueryStructReq) queryReq);
|
QueryStatement queryStatement = semanticQueryEngine.plan((QueryStructReq) queryReq);
|
||||||
return getExplainResp(queryStatement);
|
return getExplainResp(queryStatement);
|
||||||
}
|
}
|
||||||
|
if (QueryTypeEnum.STRUCT.equals(queryTypeEnum) && queryReq instanceof QueryMultiStructReq) {
|
||||||
|
QueryMultiStructReq queryMultiStructReq = (QueryMultiStructReq) queryReq;
|
||||||
|
QueryStatement queryStatement = getQueryStatementByMultiStruct(queryMultiStructReq);
|
||||||
|
return getExplainResp(queryStatement);
|
||||||
|
}
|
||||||
|
|
||||||
throw new IllegalArgumentException("Parameters are invalid, explainSqlReq: " + explainSqlReq);
|
throw new IllegalArgumentException("Parameters are invalid, explainSqlReq: " + explainSqlReq);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user