(improvement)(headless) Headless has preliminarily completed the abstraction of QueryCache, QueryParser, QueryPlanner, and QueryExecutor. (#651)

This commit is contained in:
lexluo09
2024-01-18 22:39:58 +08:00
committed by GitHub
parent b019f4d9bb
commit 3e77fc3069
56 changed files with 699 additions and 597 deletions

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.api.pojo;
import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.api.response.SemanticQueryResp;
import lombok.Data;
@Data
@@ -9,6 +9,6 @@ public class SingleItemQueryResult {
private Item item;
private QueryResultWithSchemaResp result;
private SemanticQueryResp result;
}

View File

@@ -1,15 +1,17 @@
package com.tencent.supersonic.headless.api.request;
import com.alibaba.fastjson.JSONObject;
import com.tencent.supersonic.headless.api.pojo.Cache;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.ToString;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.util.CollectionUtils;
@Data
@ToString
public class QueryMultiStructReq {
public class QueryMultiStructReq extends SemanticQueryReq {
List<QueryStructReq> queryStructReqs;
@@ -21,4 +23,18 @@ public class QueryMultiStructReq {
return DigestUtils.md5Hex(this.toCustomizedString());
}
public List<Long> getModelIds() {
if (CollectionUtils.isEmpty(this.getQueryStructReqs())) {
return new ArrayList<>();
}
return this.getQueryStructReqs().get(0).getModelIds();
}
public Cache getCacheInfo() {
if (CollectionUtils.isEmpty(this.getQueryStructReqs())) {
return getCacheInfo();
}
return this.getQueryStructReqs().get(0).getCacheInfo();
}
}

View File

@@ -1,35 +0,0 @@
package com.tencent.supersonic.headless.api.request;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.ToString;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Data
@ToString
public class QueryS2SQLReq {
private Set<Long> modelIds;
private String sql;
private Map<String, String> variables;
public void setModelId(Long modelId) {
modelIds = new HashSet<>();
modelIds.add(modelId);
}
public List<Long> getModelIds() {
return Lists.newArrayList(modelIds);
}
public String getModelIdStr() {
return String.join(",", modelIds.stream().map(Object::toString).collect(Collectors.toList()));
}
}

View File

@@ -0,0 +1,27 @@
package com.tencent.supersonic.headless.api.request;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class QuerySqlReq extends SemanticQueryReq {
private String sql;
@Override
public String toCustomizedString() {
StringBuilder stringBuilder = new StringBuilder("{");
stringBuilder.append("\"modelId\":")
.append(modelIds);
stringBuilder.append(",\"params\":")
.append(params);
stringBuilder.append(",\"cacheInfo\":")
.append(cacheInfo);
stringBuilder.append(",\"sql\":")
.append(sql);
stringBuilder.append('}');
return stringBuilder.toString();
}
}

View File

@@ -6,14 +6,16 @@ import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.Filter;
import com.tencent.supersonic.common.pojo.Order;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.common.util.DateModeUtils;
import com.tencent.supersonic.common.util.SqlFilterUtils;
import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper;
import com.tencent.supersonic.headless.api.pojo.Cache;
import com.tencent.supersonic.headless.api.pojo.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
@@ -37,20 +39,10 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@Data
@Slf4j
public class QueryStructReq {
private Set<Long> modelIds;
public class QueryStructReq extends SemanticQueryReq {
private String modelName;
private List<String> groups = new ArrayList<>();
@@ -58,11 +50,10 @@ public class QueryStructReq {
private List<Order> orders = new ArrayList<>();
private List<Filter> dimensionFilters = new ArrayList<>();
private List<Filter> metricFilters = new ArrayList<>();
private List<Param> params = new ArrayList<>();
private DateConf dateInfo;
private Long limit = 2000L;
private QueryType queryType = QueryType.ID;
private Cache cacheInfo;
/**
* Later deleted for compatibility only
@@ -73,23 +64,6 @@ public class QueryStructReq {
*/
private String correctS2SQL;
public void setModelId(Long modelId) {
modelIds = new HashSet<>();
modelIds.add(modelId);
}
public List<Long> getModelIds() {
return Lists.newArrayList(modelIds);
}
public String getModelIdStr() {
return String.join(",", modelIds.stream().map(Object::toString).collect(Collectors.toList()));
}
public Set<Long> getModelIdSet() {
return modelIds;
}
public List<String> getGroups() {
if (!CollectionUtils.isEmpty(this.groups)) {
this.groups = groups.stream().filter(group -> !Strings.isEmpty(group)).collect(Collectors.toList());
@@ -117,13 +91,6 @@ public class QueryStructReq {
return orders;
}
public List<Param> getParams() {
if (params == null) {
return Lists.newArrayList();
}
return params;
}
public String toCustomizedString() {
StringBuilder stringBuilder = new StringBuilder("{");
stringBuilder.append("\"modelId\":")
@@ -187,7 +154,7 @@ public class QueryStructReq {
* @param queryStructReq
* @return
*/
public QueryS2SQLReq convert(QueryStructReq queryStructReq) {
public QuerySqlReq convert(QueryStructReq queryStructReq) {
String sql = null;
try {
sql = buildSql(queryStructReq);
@@ -195,10 +162,10 @@ public class QueryStructReq {
log.error("buildSql error", e);
}
QueryS2SQLReq result = new QueryS2SQLReq();
QuerySqlReq result = new QuerySqlReq();
result.setSql(sql);
result.setModelIds(queryStructReq.getModelIdSet());
result.setVariables(new HashMap<>());
result.setParams(new ArrayList<>());
return result;
}

View File

@@ -0,0 +1,48 @@
package com.tencent.supersonic.headless.api.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.api.pojo.Cache;
import com.tencent.supersonic.headless.api.pojo.Param;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
@Data
@Slf4j
public abstract class SemanticQueryReq {
protected Set<Long> modelIds;
protected List<Param> params = new ArrayList<>();
protected Cache cacheInfo = new Cache();
public void setModelId(Long modelId) {
modelIds = new HashSet<>();
modelIds.add(modelId);
}
public String generateCommandMd5() {
return DigestUtils.md5Hex(this.toCustomizedString());
}
public abstract String toCustomizedString();
public List<Long> getModelIds() {
return Lists.newArrayList(modelIds);
}
public String getModelIdStr() {
return String.join(",", modelIds.stream().map(Object::toString).collect(Collectors.toList()));
}
public Set<Long> getModelIdSet() {
return modelIds;
}
}

View File

@@ -14,7 +14,7 @@ import java.util.stream.Collectors;
@Data
@ToString
public class QueryResultWithSchemaResp extends QueryResult<Map<String, Object>> {
public class SemanticQueryResp extends QueryResult<Map<String, Object>> {
List<QueryColumn> columns = Lists.newArrayList();
String sql;