mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
(improvement)(chat) Rules, large models, and query dimension values support timelessness. (#1522)
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user