mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
(improvement)(chat) suppoprt show having filter and sum(metirc) filter (#176)
This commit is contained in:
@@ -91,27 +91,39 @@ public class FieldAndValueAcquireVisitor extends ExpressionVisitorAdapter {
|
||||
}
|
||||
if (leftExpression instanceof Function) {
|
||||
Function leftExpressionFunction = (Function) leftExpression;
|
||||
String dateFunction = leftExpressionFunction.getName().toUpperCase();
|
||||
Column field = getColumn(leftExpressionFunction);
|
||||
if (Objects.isNull(field)) {
|
||||
return filterExpression;
|
||||
}
|
||||
String functionName = leftExpressionFunction.getName().toUpperCase();
|
||||
filterExpression.setFieldName(field.getColumnName());
|
||||
filterExpression.setFunction(functionName);
|
||||
filterExpression.setOperator(expr.getStringExpression());
|
||||
//deal with DAY/WEEK function
|
||||
List<DatePeriodEnum> collect = Arrays.stream(DatePeriodEnum.values()).collect(Collectors.toList());
|
||||
DatePeriodEnum periodEnum = DatePeriodEnum.get(dateFunction);
|
||||
DatePeriodEnum periodEnum = DatePeriodEnum.get(functionName);
|
||||
if (Objects.nonNull(periodEnum) && collect.contains(periodEnum)) {
|
||||
List<Expression> leftExpressions = leftExpressionFunction.getParameters().getExpressions();
|
||||
if (CollectionUtils.isEmpty(leftExpressions) || leftExpressions.size() < 1) {
|
||||
return filterExpression;
|
||||
}
|
||||
Column field = (Column) leftExpressions.get(0);
|
||||
filterExpression.setFieldName(field.getColumnName());
|
||||
filterExpression.setFieldValue(getFieldValue(rightExpression) + periodEnum.getChName());
|
||||
filterExpression.setOperator(expr.getStringExpression());
|
||||
return filterExpression;
|
||||
} else {
|
||||
//deal with aggregate function
|
||||
filterExpression.setFieldValue(getFieldValue(rightExpression));
|
||||
return filterExpression;
|
||||
}
|
||||
}
|
||||
|
||||
filterExpression.setFieldValue(getFieldValue(rightExpression));
|
||||
filterExpression.setOperator(expr.getStringExpression());
|
||||
return filterExpression;
|
||||
}
|
||||
|
||||
private Column getColumn(Function leftExpressionFunction) {
|
||||
List<Expression> leftExpressions = leftExpressionFunction.getParameters().getExpressions();
|
||||
if (CollectionUtils.isEmpty(leftExpressions) || leftExpressions.size() < 1) {
|
||||
return null;
|
||||
}
|
||||
return (Column) leftExpressions.get(0);
|
||||
}
|
||||
|
||||
private Object getFieldValue(Expression rightExpression) {
|
||||
if (rightExpression instanceof StringValue) {
|
||||
StringValue stringValue = (StringValue) rightExpression;
|
||||
|
||||
@@ -11,4 +11,6 @@ public class FilterExpression {
|
||||
|
||||
private Object fieldValue;
|
||||
|
||||
private String function;
|
||||
|
||||
}
|
||||
@@ -38,6 +38,10 @@ public class SqlParserSelectHelper {
|
||||
if (Objects.nonNull(where)) {
|
||||
where.accept(new FieldAndValueAcquireVisitor(result));
|
||||
}
|
||||
Expression having = plainSelect.getHaving();
|
||||
if (Objects.nonNull(having)) {
|
||||
having.accept(new FieldAndValueAcquireVisitor(result));
|
||||
}
|
||||
return new ArrayList<>(result);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user