(improvement)(Headless) If it is in DETAIL mode and select *, add default metrics and dimensions. (#1186)

This commit is contained in:
lexluo09
2024-06-22 01:28:52 +08:00
committed by GitHub
parent e293be3ebf
commit cfde267a06
8 changed files with 271 additions and 50 deletions

View File

@@ -1,5 +1,6 @@
package com.tencent.supersonic.common.jsqlparser;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -24,6 +25,7 @@ import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.AllColumns;
import net.sf.jsqlparser.statement.select.GroupByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
@@ -37,20 +39,24 @@ import org.springframework.util.CollectionUtils;
@Slf4j
public class SqlRemoveHelper {
public static String removeSelect(String sql, Set<String> fields) {
public static String removeAsteriskAndAddFields(String sql, Set<String> needAddDefaultFields) {
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (selectStatement == null) {
if (Objects.isNull(selectStatement)) {
return sql;
}
//SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectStatement instanceof PlainSelect)) {
return sql;
}
List<SelectItem<?>> selectItems = ((PlainSelect) selectStatement).getSelectItems();
selectItems.removeIf(selectItem -> {
String columnName = SqlSelectHelper.getColumnName(selectItem.getExpression());
return fields.contains(columnName);
});
if (selectItems.stream().anyMatch(item -> item.getExpression() instanceof AllColumns)) {
selectItems.clear();
List<SelectItem<Column>> columnSelectItems = new ArrayList<>();
for (String fieldName : needAddDefaultFields) {
SelectItem<Column> selectExpressionItem = new SelectItem(new Column(fieldName));
columnSelectItems.add(selectExpressionItem);
}
selectItems.addAll(columnSelectItems);
}
return selectStatement.toString();
}
@@ -59,7 +65,6 @@ public class SqlRemoveHelper {
if (selectStatement == null) {
return sql;
}
//SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectStatement instanceof PlainSelect)) {
return sql;
}
@@ -79,8 +84,6 @@ public class SqlRemoveHelper {
public static String removeWhereCondition(String sql, Set<String> removeFieldNames) {
Select selectStatement = SqlSelectHelper.getSelect(sql);
//SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectStatement instanceof PlainSelect)) {
return sql;
}
@@ -105,8 +108,6 @@ public class SqlRemoveHelper {
if (selectStatement == null) {
return sql;
}
//SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectStatement instanceof PlainSelect)) {
return sql;
}
@@ -184,7 +185,6 @@ public class SqlRemoveHelper {
InExpression constantExpression = (InExpression) CCJSqlParserUtil.parseCondExpression(
JsqlConstants.IN_CONSTANT);
inExpression.setLeftExpression(constantExpression.getLeftExpression());
//inExpression.setRightItemsList(constantExpression.getRightItemsList());
inExpression.setRightExpression(constantExpression.getRightExpression());
inExpression.setASTNode(constantExpression.getASTNode());
} catch (JSQLParserException e) {
@@ -211,8 +211,6 @@ public class SqlRemoveHelper {
public static String removeHavingCondition(String sql, Set<String> removeFieldNames) {
Select selectStatement = SqlSelectHelper.getSelect(sql);
//SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectStatement instanceof PlainSelect)) {
return sql;
}

View File

@@ -14,6 +14,7 @@ import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.AllColumns;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectItem;
@@ -45,8 +46,6 @@ public class SqlSelectFunctionHelper {
public static Set<String> getFunctions(String sql) {
Select selectStatement = SqlSelectHelper.getSelect(sql);
//SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectStatement instanceof PlainSelect)) {
return new HashSet<>();
}
@@ -106,5 +105,18 @@ public class SqlSelectFunctionHelper {
return new ArrayList<>();
}
public static boolean hasAsterisk(String sql) {
List<PlainSelect> plainSelectList = SqlSelectHelper.getPlainSelect(sql);
if (CollectionUtils.isEmpty(plainSelectList)) {
return false;
}
for (PlainSelect plainSelect : plainSelectList) {
List<SelectItem<?>> selectItems = plainSelect.getSelectItems();
if (selectItems.stream().anyMatch(item -> item.getExpression() instanceof AllColumns)) {
return true;
}
}
return false;
}
}

View File

@@ -3,7 +3,6 @@ package com.tencent.supersonic.common.jsqlparser;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
@@ -12,6 +11,20 @@ import org.junit.jupiter.api.Test;
*/
class SqlRemoveHelperTest {
@Test
void testRemoveAsterisk() {
String sql = "select * from 歌曲库";
Set<String> fields = new HashSet<>();
fields.add("歌曲名");
fields.add("性别");
sql = SqlRemoveHelper.removeAsteriskAndAddFields(sql, fields);
Assert.assertEquals(sql, "SELECT 歌曲名, 性别 FROM 歌曲库");
sql = "select 歌曲名 from 歌曲库";
sql = SqlRemoveHelper.removeAsteriskAndAddFields(sql, fields);
Assert.assertEquals(sql, "SELECT 歌曲名 FROM 歌曲库");
}
@Test
void testRemoveSameFieldFromSelect() {
String sql = "select 歌曲名,歌手名,粉丝数,粉丝数,sum(粉丝数),sum(粉丝数),avg(播放量),avg(播放量)"

View File

@@ -72,4 +72,15 @@ class SqlSelectFunctionHelperTest {
Assert.assertEquals(hasFunction, true);
}
@Test
void testHasAsterisk() {
String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' "
+ "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1";
Assert.assertEquals(SqlSelectFunctionHelper.hasAsterisk(sql), false);
sql = "select * from 超音数 where 数据日期 = '2023-08-08' "
+ "and 用户 =alice and 发布日期 ='11'";
Assert.assertEquals(SqlSelectFunctionHelper.hasAsterisk(sql), true);
}
}