(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;
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);
}
}

View File

@@ -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;

View File

@@ -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;

View File

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

View File

@@ -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);
}