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;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -11,4 +11,6 @@ public class FilterExpression {
|
|||||||
|
|
||||||
private Object fieldValue;
|
private Object fieldValue;
|
||||||
|
|
||||||
|
private String function;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user