6 Commits

Author SHA1 Message Date
beat4ocean
dc703bf6c6 Merge branch 'tencentmusic:master' into master 2025-02-19 10:35:01 +08:00
jerryjzhang
d1e5e8777a (improvement)(chat)Try to find all fields in the same model to avoid unnecessary join.
Some checks are pending
supersonic CentOS CI / build (21) (push) Waiting to run
supersonic mac CI / build (21) (push) Waiting to run
supersonic ubuntu CI / build (21) (push) Waiting to run
supersonic windows CI / build (21) (push) Waiting to run
2025-02-18 21:29:39 +08:00
jerryjzhang
b743585d3e (fix)(headless)Fix NPE issue. 2025-02-18 19:07:39 +08:00
weimengdalao
9aa305ca7a [fix][headless]fix Check if metricFilters is empty not dimensionFilters (#2064) 2025-02-18 12:49:43 +08:00
jerryjzhang
fe51882031 Merge remote-tracking branch 'origin/master' 2025-02-18 12:48:35 +08:00
jerryjzhang
17a3dd052c (improvement)(chat)LLM might output table or column with `` enclose, should handle with it. 2025-02-18 12:48:26 +08:00
4 changed files with 39 additions and 17 deletions

View File

@@ -294,7 +294,8 @@ public class SqlSelectHelper {
}
// do not account in aliases
results.removeAll(aliases);
return new ArrayList<>(results);
return new ArrayList<>(
results.stream().map(r -> r.replaceAll("`", "")).collect(Collectors.toList()));
}
private static List<String> getFieldsByPlainSelect(PlainSelect plainSelect) {

View File

@@ -241,7 +241,7 @@ public abstract class RuleSemanticQuery extends BaseSemanticQuery {
.forEach(filter -> filter.setName(bizNameToName.get(filter.getBizName())));
}
List<Filter> metricFilters = queryStructReq.getMetricFilters();
if (CollectionUtils.isNotEmpty(dimensionFilters)) {
if (CollectionUtils.isNotEmpty(metricFilters)) {
metricFilters.forEach(filter -> filter.setName(bizNameToName.get(filter.getBizName())));
}
}

View File

@@ -10,6 +10,7 @@ import com.tencent.supersonic.common.pojo.enums.EngineType;
import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
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.QueryState;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
@@ -188,12 +189,10 @@ public class SqlQueryParser implements QueryParser {
String modelName = entry.getKey();
entry.getValue().forEach(m -> {
if (fields.contains(m.getName()) || fields.contains(m.getBizName())) {
if (!ontologyQuery.getMetricMap().containsKey(modelName)) {
ontologyQuery.getMetricMap().put(modelName, Sets.newHashSet());
}
ontologyQuery.getModelMap().put(modelName,
ontology.getModelMap().get(modelName));
ontologyQuery.getMetricMap().get(modelName).add(m);
ontologyQuery.getMetricMap().computeIfAbsent(modelName, k -> Sets.newHashSet())
.add(m);
fields.remove(m.getName());
fields.remove(m.getBizName());
}
@@ -207,33 +206,51 @@ public class SqlQueryParser implements QueryParser {
String modelName = entry.getKey();
entry.getValue().forEach(d -> {
if (fields.contains(d.getName()) || fields.contains(d.getBizName())) {
if (!ontologyQuery.getDimensionMap().containsKey(entry.getKey())) {
ontologyQuery.getDimensionMap().put(entry.getKey(),
Sets.newHashSet());
}
ontologyQuery.getModelMap().put(modelName,
ontology.getModelMap().get(modelName));
ontologyQuery.getDimensionMap().get(entry.getKey()).add(d);
ontologyQuery.getDimensionMap()
.computeIfAbsent(modelName, k -> Sets.newHashSet()).add(d);
fields.remove(d.getName());
fields.remove(d.getBizName());
}
});
});
// if there are still fields not found belonging models, try to find in the models without
// querying metrics.
// second, try to find a model that has all the remaining fields, such that no further join
// is needed.
if (!fields.isEmpty()) {
Map<String, Set<DimSchemaResp>> model2dims = new HashMap<>();
ontology.getDimensionMap().entrySet().forEach(entry -> {
String modelName = entry.getKey();
entry.getValue().forEach(d -> {
if (fields.contains(d.getName()) || fields.contains(d.getBizName())) {
model2dims.computeIfAbsent(modelName, k -> Sets.newHashSet()).add(d);
}
});
});
Optional<Map.Entry<String, Set<DimSchemaResp>>> modelEntry = model2dims.entrySet()
.stream().filter(entry -> entry.getValue().size() == fields.size()).findFirst();
if (modelEntry.isPresent()) {
ontologyQuery.getDimensionMap().put(modelEntry.get().getKey(),
modelEntry.get().getValue());
ontologyQuery.getModelMap().put(modelEntry.get().getKey(),
ontology.getModelMap().get(modelEntry.get().getKey()));
fields.clear();
}
}
// finally if there are still fields not found belonging models, try to find in the models
// iteratively
if (!fields.isEmpty()) {
ontology.getDimensionMap().entrySet().forEach(entry -> {
String modelName = entry.getKey();
if (!ontologyQuery.getDimensionMap().containsKey(modelName)) {
entry.getValue().forEach(d -> {
if (fields.contains(d.getName()) || fields.contains(d.getBizName())) {
if (!ontologyQuery.getDimensionMap().containsKey(modelName)) {
ontologyQuery.getDimensionMap().put(modelName, Sets.newHashSet());
}
ontologyQuery.getModelMap().put(modelName,
ontology.getModelMap().get(modelName));
ontologyQuery.getDimensionMap().get(modelName).add(d);
ontologyQuery.getDimensionMap()
.computeIfAbsent(modelName, k -> Sets.newHashSet()).add(d);
fields.remove(d.getName());
fields.remove(d.getBizName());
}

View File

@@ -431,6 +431,10 @@ public class DictUtils {
private String generateDictDateFilter(DictItemResp dictItemResp) {
ItemValueConfig config = dictItemResp.getConfig();
if (config == null) {
return "";
}
if (!partitionedModel(dictItemResp.getModelId())) {
return "";
}