mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 22:25:19 +00:00
[improvement][project] global refactor , code format , support llm , support fuzzy detect ,support query filter and so on.
This commit is contained in:
@@ -40,6 +40,7 @@ public class Constants {
|
||||
|
||||
public static final String DAY = "DAY";
|
||||
public static final String DAY_FORMAT = "yyyy-MM-dd";
|
||||
public static final String MONTH_FORMAT = "yyyy-MM";
|
||||
public static final String DAY_FORMAT_INT = "YYYYMMDD";
|
||||
public static final String MONTH = "MONTH";
|
||||
public static final String WEEK = "WEEK";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.tencent.supersonic.common.nlp;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -14,8 +14,18 @@ public class ItemDO implements Serializable {
|
||||
private Integer domain;
|
||||
private Integer itemId;
|
||||
private String name;
|
||||
private String bizName;
|
||||
private Long useCnt = 0L;
|
||||
|
||||
public ItemDO() {
|
||||
}
|
||||
|
||||
public ItemDO(Integer domain, Integer itemId, String name, String bizName) {
|
||||
this.domain = domain;
|
||||
this.itemId = itemId;
|
||||
this.name = name;
|
||||
this.bizName = bizName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
@@ -26,7 +36,14 @@ public class ItemDO implements Serializable {
|
||||
return false;
|
||||
}
|
||||
ItemDO itemDO = (ItemDO) o;
|
||||
return Objects.equals(domain, itemDO.domain) && Objects.equals(itemId, itemDO.itemId)
|
||||
&& Objects.equals(name, itemDO.name);
|
||||
return Objects.equal(domain, itemDO.domain) && Objects.equal(itemId,
|
||||
itemDO.itemId) && Objects.equal(name, itemDO.name)
|
||||
&& Objects.equal(bizName, itemDO.bizName) && Objects.equal(
|
||||
useCnt, itemDO.useCnt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(domain, itemId, name, bizName, useCnt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
package com.tencent.supersonic.common.util.calcite;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import org.apache.calcite.sql.SqlBasicCall;
|
||||
import org.apache.calcite.sql.SqlIdentifier;
|
||||
import org.apache.calcite.sql.SqlKind;
|
||||
import org.apache.calcite.sql.SqlNode;
|
||||
import org.apache.calcite.sql.SqlNodeList;
|
||||
import org.apache.calcite.sql.SqlOrderBy;
|
||||
import org.apache.calcite.sql.SqlSelect;
|
||||
import org.apache.calcite.sql.parser.SqlParseException;
|
||||
import org.apache.calcite.sql.parser.SqlParser;
|
||||
|
||||
/**
|
||||
* sql parse utils
|
||||
*/
|
||||
public class SqlParseUtils {
|
||||
|
||||
/**
|
||||
* get sql parseInfo
|
||||
*
|
||||
* @param sql
|
||||
* @return
|
||||
*/
|
||||
public static SqlParserInfo getSqlParseInfo(String sql) {
|
||||
try {
|
||||
SqlParser parser = SqlParser.create(sql);
|
||||
SqlNode sqlNode = parser.parseQuery();
|
||||
SqlParserInfo sqlParserInfo = new SqlParserInfo();
|
||||
handlerSQL(sqlNode, sqlParserInfo);
|
||||
|
||||
List<String> collect = sqlParserInfo.getAllFields().stream().distinct().collect(Collectors.toList());
|
||||
|
||||
sqlParserInfo.setAllFields(collect);
|
||||
return sqlParserInfo;
|
||||
} catch (SqlParseException e) {
|
||||
throw new RuntimeException("getSqlParseInfo", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* hanlder sql
|
||||
*
|
||||
* @param sqlNode
|
||||
* @param sqlParserInfo
|
||||
*/
|
||||
public static void handlerSQL(SqlNode sqlNode, SqlParserInfo sqlParserInfo) {
|
||||
SqlKind kind = sqlNode.getKind();
|
||||
|
||||
switch (kind) {
|
||||
case SELECT:
|
||||
handlerSelect(sqlNode, sqlParserInfo);
|
||||
break;
|
||||
case ORDER_BY:
|
||||
handlerOrderBy(sqlNode, sqlParserInfo);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* hanlder order by
|
||||
*
|
||||
* @param node
|
||||
* @param sqlParserInfo
|
||||
*/
|
||||
private static void handlerOrderBy(SqlNode node, SqlParserInfo sqlParserInfo) {
|
||||
SqlOrderBy sqlOrderBy = (SqlOrderBy) node;
|
||||
SqlNode query = sqlOrderBy.query;
|
||||
handlerSQL(query, sqlParserInfo);
|
||||
SqlNodeList orderList = sqlOrderBy.orderList;
|
||||
handlerField(orderList, sqlParserInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* hanlder select
|
||||
*
|
||||
* @param select
|
||||
* @param sqlParserInfo
|
||||
*/
|
||||
private static void handlerSelect(SqlNode select, SqlParserInfo sqlParserInfo) {
|
||||
SqlSelect sqlSelect = (SqlSelect) select;
|
||||
SqlNodeList selectList = sqlSelect.getSelectList();
|
||||
|
||||
selectList.getList().forEach(list -> {
|
||||
handlerField(list, sqlParserInfo);
|
||||
});
|
||||
String tableName = handlerFrom(sqlSelect.getFrom());
|
||||
sqlParserInfo.setTableName(tableName);
|
||||
|
||||
if (sqlSelect.hasWhere()) {
|
||||
handlerField(sqlSelect.getWhere(), sqlParserInfo);
|
||||
}
|
||||
if (sqlSelect.hasOrderBy()) {
|
||||
handlerField(sqlSelect.getOrderList(), sqlParserInfo);
|
||||
}
|
||||
SqlNodeList group = sqlSelect.getGroup();
|
||||
if (group != null) {
|
||||
group.forEach(groupField -> {
|
||||
handlerField(groupField, sqlParserInfo);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* hander from
|
||||
*
|
||||
* @param from
|
||||
* @return
|
||||
*/
|
||||
private static String handlerFrom(SqlNode from) {
|
||||
SqlKind kind = from.getKind();
|
||||
switch (kind) {
|
||||
case IDENTIFIER:
|
||||
SqlIdentifier sqlIdentifier = (SqlIdentifier) from;
|
||||
return sqlIdentifier.getSimple();
|
||||
case AS:
|
||||
SqlBasicCall sqlBasicCall = (SqlBasicCall) from;
|
||||
SqlNode sqlNode = sqlBasicCall.getOperandList().get(0);
|
||||
SqlSelect sqlSelect = (SqlSelect) sqlNode;
|
||||
return handlerFrom(sqlSelect.getFrom());
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* handler field
|
||||
*
|
||||
* @param field
|
||||
* @param sqlParserInfo
|
||||
*/
|
||||
private static void handlerField(SqlNode field, SqlParserInfo sqlParserInfo) {
|
||||
SqlKind kind = field.getKind();
|
||||
switch (kind) {
|
||||
case AS:
|
||||
List<SqlNode> operandList1 = ((SqlBasicCall) field).getOperandList();
|
||||
SqlNode left_as = operandList1.get(0);
|
||||
handlerField(left_as, sqlParserInfo);
|
||||
break;
|
||||
case IDENTIFIER:
|
||||
SqlIdentifier sqlIdentifier = (SqlIdentifier) field;
|
||||
sqlParserInfo.getAllFields().add(sqlIdentifier.getSimple());
|
||||
break;
|
||||
default:
|
||||
if (field instanceof SqlBasicCall) {
|
||||
List<SqlNode> operandList2 = ((SqlBasicCall) field).getOperandList();
|
||||
for (int i = 0; i < operandList2.size(); i++) {
|
||||
handlerField(operandList2.get(i), sqlParserInfo);
|
||||
}
|
||||
}
|
||||
if (field instanceof SqlNodeList) {
|
||||
((SqlNodeList) field).getList().forEach(node -> {
|
||||
handlerField(node, sqlParserInfo);
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.tencent.supersonic.common.util.calcite;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@ToString
|
||||
public class SqlParserInfo implements Serializable {
|
||||
|
||||
private String tableName;
|
||||
|
||||
private List<String> allFields = new ArrayList<>();
|
||||
|
||||
}
|
||||
@@ -4,6 +4,9 @@ package com.tencent.supersonic.common.util.context;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
import java.util.Map;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Builder
|
||||
@ToString
|
||||
@@ -16,4 +19,6 @@ public class ThreadContext {
|
||||
|
||||
private String token;
|
||||
|
||||
private Map<String, String> extendInfo;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user