(improvement)(chat) suppoprt show having filter and sum(metirc) filter (#176)

This commit is contained in:
lexluo09
2023-10-08 21:46:49 +08:00
committed by GitHub
parent 4bbd2c7446
commit 8487966888
5 changed files with 38 additions and 16 deletions

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.chat.api.pojo.request; package com.tencent.supersonic.chat.api.pojo.request;
import com.google.common.base.Objects;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import java.util.Objects;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
@@ -19,6 +19,8 @@ public class QueryFilter {
private Long elementID; private Long elementID;
private String function;
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) { if (this == o) {
@@ -27,14 +29,15 @@ public class QueryFilter {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
QueryFilter filter = (QueryFilter) o; QueryFilter that = (QueryFilter) o;
return Objects.equals(bizName, filter.bizName) && Objects.equals(name, filter.name) return Objects.equal(bizName, that.bizName) && Objects.equal(name,
&& operator == filter.operator && Objects.equals(value, filter.value) && Objects.equals( that.name) && operator == that.operator && Objects.equal(value, that.value)
elementID, filter.elementID); && Objects.equal(elementID, that.elementID) && Objects.equal(
function, that.function);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(bizName, name, operator, value, elementID); return Objects.hashCode(bizName, name, operator, value, elementID, function);
} }
} }

View File

@@ -188,6 +188,7 @@ public class LLMDslParser implements SemanticParser {
FilterOperatorEnum operatorEnum = FilterOperatorEnum.getSqlOperator(expression.getOperator()); FilterOperatorEnum operatorEnum = FilterOperatorEnum.getSqlOperator(expression.getOperator());
dimensionFilter.setOperator(operatorEnum); dimensionFilter.setOperator(operatorEnum);
dimensionFilter.setFunction(expression.getFunction());
result.add(dimensionFilter); result.add(dimensionFilter);
} }
return result; return result;

View File

@@ -91,27 +91,39 @@ public class FieldAndValueAcquireVisitor extends ExpressionVisitorAdapter {
} }
if (leftExpression instanceof Function) { if (leftExpression instanceof Function) {
Function leftExpressionFunction = (Function) leftExpression; 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()); 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)) { 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.setFieldValue(getFieldValue(rightExpression) + periodEnum.getChName());
filterExpression.setOperator(expr.getStringExpression()); return filterExpression;
} else {
//deal with aggregate function
filterExpression.setFieldValue(getFieldValue(rightExpression));
return filterExpression; return filterExpression;
} }
} }
filterExpression.setFieldValue(getFieldValue(rightExpression)); filterExpression.setFieldValue(getFieldValue(rightExpression));
filterExpression.setOperator(expr.getStringExpression()); filterExpression.setOperator(expr.getStringExpression());
return filterExpression; 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) { private Object getFieldValue(Expression rightExpression) {
if (rightExpression instanceof StringValue) { if (rightExpression instanceof StringValue) {
StringValue stringValue = (StringValue) rightExpression; StringValue stringValue = (StringValue) rightExpression;

View File

@@ -11,4 +11,6 @@ public class FilterExpression {
private Object fieldValue; private Object fieldValue;
private String function;
} }

View File

@@ -38,6 +38,10 @@ public class SqlParserSelectHelper {
if (Objects.nonNull(where)) { if (Objects.nonNull(where)) {
where.accept(new FieldAndValueAcquireVisitor(result)); where.accept(new FieldAndValueAcquireVisitor(result));
} }
Expression having = plainSelect.getHaving();
if (Objects.nonNull(having)) {
having.accept(new FieldAndValueAcquireVisitor(result));
}
return new ArrayList<>(result); return new ArrayList<>(result);
} }