mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 12:07:42 +00:00
(improvement)(chat) suppoprt show having filter and sum(metirc) filter (#176)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package com.tencent.supersonic.chat.api.pojo.request;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
|
||||
import java.util.Objects;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@@ -19,6 +19,8 @@ public class QueryFilter {
|
||||
|
||||
private Long elementID;
|
||||
|
||||
private String function;
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
@@ -27,14 +29,15 @@ public class QueryFilter {
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
QueryFilter filter = (QueryFilter) o;
|
||||
return Objects.equals(bizName, filter.bizName) && Objects.equals(name, filter.name)
|
||||
&& operator == filter.operator && Objects.equals(value, filter.value) && Objects.equals(
|
||||
elementID, filter.elementID);
|
||||
QueryFilter that = (QueryFilter) o;
|
||||
return Objects.equal(bizName, that.bizName) && Objects.equal(name,
|
||||
that.name) && operator == that.operator && Objects.equal(value, that.value)
|
||||
&& Objects.equal(elementID, that.elementID) && Objects.equal(
|
||||
function, that.function);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(bizName, name, operator, value, elementID);
|
||||
return Objects.hashCode(bizName, name, operator, value, elementID, function);
|
||||
}
|
||||
}
|
||||
@@ -188,6 +188,7 @@ public class LLMDslParser implements SemanticParser {
|
||||
|
||||
FilterOperatorEnum operatorEnum = FilterOperatorEnum.getSqlOperator(expression.getOperator());
|
||||
dimensionFilter.setOperator(operatorEnum);
|
||||
dimensionFilter.setFunction(expression.getFunction());
|
||||
result.add(dimensionFilter);
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -91,27 +91,39 @@ public class FieldAndValueAcquireVisitor extends ExpressionVisitorAdapter {
|
||||
}
|
||||
if (leftExpression instanceof Function) {
|
||||
Function leftExpressionFunction = (Function) leftExpression;
|
||||
String dateFunction = leftExpressionFunction.getName().toUpperCase();
|
||||
List<DatePeriodEnum> collect = Arrays.stream(DatePeriodEnum.values()).collect(Collectors.toList());
|
||||
DatePeriodEnum periodEnum = DatePeriodEnum.get(dateFunction);
|
||||
if (Objects.nonNull(periodEnum) && collect.contains(periodEnum)) {
|
||||
List<Expression> leftExpressions = leftExpressionFunction.getParameters().getExpressions();
|
||||
if (CollectionUtils.isEmpty(leftExpressions) || leftExpressions.size() < 1) {
|
||||
Column field = getColumn(leftExpressionFunction);
|
||||
if (Objects.isNull(field)) {
|
||||
return filterExpression;
|
||||
}
|
||||
Column field = (Column) leftExpressions.get(0);
|
||||
String functionName = leftExpressionFunction.getName().toUpperCase();
|
||||
filterExpression.setFieldName(field.getColumnName());
|
||||
filterExpression.setFieldValue(getFieldValue(rightExpression) + periodEnum.getChName());
|
||||
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(functionName);
|
||||
if (Objects.nonNull(periodEnum) && collect.contains(periodEnum)) {
|
||||
filterExpression.setFieldValue(getFieldValue(rightExpression) + periodEnum.getChName());
|
||||
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