From 8487966888d603207e65d79ad7accadc906963be Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:46:49 +0800 Subject: [PATCH] (improvement)(chat) suppoprt show having filter and sum(metirc) filter (#176) --- .../chat/api/pojo/request/QueryFilter.java | 15 +++++---- .../chat/parser/llm/dsl/LLMDslParser.java | 1 + .../FieldAndValueAcquireVisitor.java | 32 +++++++++++++------ .../util/jsqlparser/FilterExpression.java | 2 ++ .../jsqlparser/SqlParserSelectHelper.java | 4 +++ 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java index 8a2054b95..820cbf742 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java @@ -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); } } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java index 7cf8dfd93..999c63cc5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java @@ -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; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java index 78869857b..13dfbf407 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java @@ -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 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 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 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; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java index b4c304d62..3622fe326 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java @@ -11,4 +11,6 @@ public class FilterExpression { private Object fieldValue; + private String function; + } \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java index a1e4002be..1c49b85bf 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java @@ -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); }