(improvement)(chat) Rules, large models, and query dimension values support timelessness. (#1522)

This commit is contained in:
lexluo09
2024-08-07 13:29:07 +08:00
committed by GitHub
parent c8fe6d2d04
commit 208686de46
28 changed files with 442 additions and 613 deletions

View File

@@ -44,7 +44,7 @@ public class ModelDetail {
return Lists.newArrayList();
}
return dimensions.stream()
.filter(dim -> DimensionType.time.name().equalsIgnoreCase(dim.getType()))
.filter(dim -> DimensionType.partition_time.name().equalsIgnoreCase(dim.getType()))
.collect(Collectors.toList());
}

View File

@@ -168,99 +168,129 @@ public class QueryStructReq extends SemanticQueryReq {
return result;
}
private String buildSql(QueryStructReq queryStructReq, boolean isBizName) throws JSQLParserException {
private String buildSql(QueryStructReq queryStructReq, boolean isBizName)
throws JSQLParserException {
ParenthesedSelect select = new ParenthesedSelect();
//1.Set the select items (columns)
PlainSelect plainSelect = new PlainSelect();
// 1. Set the select items (columns)
plainSelect.setSelectItems(buildSelectItems(queryStructReq));
// 2. Set the table name
plainSelect.setFromItem(new Table(queryStructReq.getTableName()));
// 3. Set the order by clause
plainSelect.setOrderByElements(buildOrderByElements(queryStructReq));
// 4. Set the group by clause
plainSelect.setGroupByElement(buildGroupByElement(queryStructReq));
// 5. Set the limit clause
plainSelect.setLimit(buildLimit(queryStructReq));
select.setSelect(plainSelect);
// 6. Set where clause
return addWhereClauses(select.toString(), queryStructReq, isBizName);
}
private List<SelectItem<?>> buildSelectItems(QueryStructReq queryStructReq) {
List<SelectItem<?>> selectItems = new ArrayList<>();
List<String> groups = queryStructReq.getGroups();
if (!CollectionUtils.isEmpty(groups)) {
for (String group : groups) {
selectItems.add(new SelectItem(new Column(group)));
}
}
List<Aggregator> aggregators = queryStructReq.getAggregators();
if (!CollectionUtils.isEmpty(aggregators)) {
for (Aggregator aggregator : aggregators) {
String columnName = aggregator.getColumn();
if (queryStructReq.getQueryType().isNativeAggQuery()) {
selectItems.add(new SelectItem(new Column(columnName)));
} else {
Function sumFunction = new Function();
AggOperatorEnum func = aggregator.getFunc();
if (AggOperatorEnum.UNKNOWN.equals(func)) {
func = AggOperatorEnum.SUM;
}
sumFunction.setName(func.getOperator());
if (AggOperatorEnum.COUNT_DISTINCT.equals(func)) {
sumFunction.setName("count");
sumFunction.setDistinct(true);
}
sumFunction.setParameters(new ExpressionList(new Column(columnName)));
SelectItem selectExpressionItem = new SelectItem(sumFunction);
String alias = StringUtils.isNotBlank(aggregator.getAlias()) ? aggregator.getAlias() : columnName;
selectExpressionItem.setAlias(new Alias(alias));
selectItems.add(selectExpressionItem);
}
selectItems.add(buildAggregatorSelectItem(aggregator, queryStructReq));
}
}
plainSelect.setSelectItems(selectItems);
//2.Set the table name
Table table = new Table(queryStructReq.getTableName());
plainSelect.setFromItem(table);
//3.Set the order by clause
return selectItems;
}
private SelectItem buildAggregatorSelectItem(Aggregator aggregator, QueryStructReq queryStructReq) {
String columnName = aggregator.getColumn();
if (queryStructReq.getQueryType().isNativeAggQuery()) {
return new SelectItem(new Column(columnName));
} else {
Function function = new Function();
AggOperatorEnum func = aggregator.getFunc();
if (AggOperatorEnum.UNKNOWN.equals(func)) {
func = AggOperatorEnum.SUM;
}
function.setName(func.getOperator());
if (AggOperatorEnum.COUNT_DISTINCT.equals(func)) {
function.setName("count");
function.setDistinct(true);
}
function.setParameters(new ExpressionList(new Column(columnName)));
SelectItem selectExpressionItem = new SelectItem(function);
String alias = StringUtils.isNotBlank(aggregator.getAlias()) ? aggregator.getAlias() : columnName;
selectExpressionItem.setAlias(new Alias(alias));
return selectExpressionItem;
}
}
private List<OrderByElement> buildOrderByElements(QueryStructReq queryStructReq) {
List<Order> orders = queryStructReq.getOrders();
List<OrderByElement> orderByElements = new ArrayList<>();
if (!CollectionUtils.isEmpty(orders)) {
List<OrderByElement> orderByElements = new ArrayList<>();
for (Order order : orders) {
if (StringUtils.isBlank(order.getColumn())) {
continue;
}
OrderByElement orderByElement = new OrderByElement();
orderByElement.setExpression(new Column(order.getColumn()));
orderByElement.setAsc(false);
if (Constants.ASC_UPPER.equalsIgnoreCase(order.getDirection())) {
orderByElement.setAsc(true);
}
orderByElement.setAsc(Constants.ASC_UPPER.equalsIgnoreCase(order.getDirection()));
orderByElements.add(orderByElement);
}
plainSelect.setOrderByElements(orderByElements);
}
//4.Set the group by clause
return orderByElements;
}
private GroupByElement buildGroupByElement(QueryStructReq queryStructReq) {
List<String> groups = queryStructReq.getGroups();
if (!CollectionUtils.isEmpty(groups) && !queryStructReq.getQueryType().isNativeAggQuery()) {
GroupByElement groupByElement = new GroupByElement();
for (String group : groups) {
groupByElement.addGroupByExpression(new Column(group));
}
plainSelect.setGroupByElement(groupByElement);
return groupByElement;
}
return null;
}
//5.Set the limit clause
if (Objects.nonNull(queryStructReq.getLimit())) {
Limit limit = new Limit();
limit.setRowCount(new LongValue(queryStructReq.getLimit()));
plainSelect.setLimit(limit);
private Limit buildLimit(QueryStructReq queryStructReq) {
if (Objects.isNull(queryStructReq.getLimit())) {
return null;
}
//select.setSelectBody(plainSelect);
select.setSelect(plainSelect);
Limit limit = new Limit();
limit.setRowCount(new LongValue(queryStructReq.getLimit()));
return limit;
}
//6.Set where
List<Filter> dimensionFilters = queryStructReq.getDimensionFilters();
private String addWhereClauses(String sql, QueryStructReq queryStructReq, boolean isBizName)
throws JSQLParserException {
SqlFilterUtils sqlFilterUtils = ContextUtils.getBean(SqlFilterUtils.class);
String whereClause = sqlFilterUtils.getWhereClause(dimensionFilters, isBizName);
String whereClause = sqlFilterUtils.getWhereClause(queryStructReq.getDimensionFilters(), isBizName);
String sql = select.toString();
if (StringUtils.isNotBlank(whereClause)) {
Expression expression = CCJSqlParserUtil.parseCondExpression(whereClause);
sql = SqlAddHelper.addWhere(sql, expression);
}
//7.Set DateInfo
DateModeUtils dateModeUtils = ContextUtils.getBean(DateModeUtils.class);
String dateWhereStr = dateModeUtils.getDateWhereStr(queryStructReq.getDateInfo());
if (StringUtils.isNotBlank(dateWhereStr)) {
Expression expression = CCJSqlParserUtil.parseCondExpression(dateWhereStr);
sql = SqlAddHelper.addWhere(sql, expression);