From 8f61856c648b02753f283d1803fd94f79721ee24 Mon Sep 17 00:00:00 2001 From: gyl <1554863190@qq.com> Date: Fri, 3 Apr 2026 14:29:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=92=E5=BA=8F=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=94=AF=E6=8C=81FunctionFragmentBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/crud/query/QueryAnalyzerImpl.java | 16 ++++-- .../web/crud/query/QueryAnalyzerImplTest.java | 55 ++++++++++++++++++- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java b/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java index fb5e13d48..152232771 100644 --- a/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java +++ b/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java @@ -5,8 +5,6 @@ import net.sf.jsqlparser.expression.*; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.select.*; import net.sf.jsqlparser.statement.values.ValuesStatement; import org.apache.commons.collections4.CollectionUtils; @@ -14,16 +12,21 @@ import org.hswebframework.ezorm.core.param.Sort; import org.hswebframework.ezorm.core.param.Term; import org.hswebframework.ezorm.rdb.executor.SqlRequest; -import org.hswebframework.ezorm.rdb.metadata.*; +import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata; +import org.hswebframework.ezorm.rdb.metadata.RDBSchemaMetadata; +import org.hswebframework.ezorm.rdb.metadata.RDBViewMetadata; +import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata; import org.hswebframework.ezorm.rdb.metadata.dialect.Dialect; import org.hswebframework.ezorm.rdb.operator.DatabaseOperator; import org.hswebframework.ezorm.rdb.operator.builder.fragments.*; +import org.hswebframework.ezorm.rdb.operator.builder.fragments.function.FunctionFragmentBuilder; import org.hswebframework.web.api.crud.entity.QueryParamEntity; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import java.util.*; +import static java.util.Optional.ofNullable; import static net.sf.jsqlparser.statement.select.PlainSelect.getFormatedList; import static org.hswebframework.ezorm.rdb.operator.builder.fragments.TermFragmentBuilder.createFeatureId; @@ -1009,9 +1012,12 @@ private void appendOrderBy(AppendableSqlFragments sql, QueryParamEntity param) { } else { orderByColumn.addSql(","); } - //todo function支持 + SqlFragments fragments = ofNullable(sort.getType()) + .flatMap(function -> column.metadata.findFeature(FunctionFragmentBuilder.createFeatureId(function))) + .map(builder -> builder.create(columnName, column.metadata, sort.getOpts())) + .orElseGet(() -> PrepareSqlFragments.of(columnName)); orderByColumn - .addSql(columnName) + .add(fragments) .addSql(desc ? "DESC" : "ASC"); } } diff --git a/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java b/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java index 0beab09f8..b20fe8fb4 100644 --- a/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java +++ b/hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java @@ -3,6 +3,7 @@ import org.hswebframework.ezorm.rdb.executor.SqlRequest; import org.hswebframework.ezorm.rdb.executor.wrapper.ResultWrappers; import org.hswebframework.ezorm.rdb.operator.DatabaseOperator; +import org.hswebframework.ezorm.core.param.Sort; import org.hswebframework.web.api.crud.entity.QueryParamEntity; import org.hswebframework.web.crud.TestApplication; import org.junit.Assert; @@ -13,6 +14,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import reactor.test.StepVerifier; +import java.util.ArrayList; + import static org.junit.jupiter.api.Assertions.*; @SpringBootTest(classes = TestApplication.class) @@ -1093,4 +1096,54 @@ public void testAggregateFunctions() { // 验证SQL可以执行 executeAndVerify(request); } -} \ No newline at end of file + + @Test + public void testSort() { + QueryAnalyzerImpl analyzer = new QueryAnalyzerImpl( + database, + "select t.id, t.name from s_test t group by t.id, t.name"); + + QueryParamEntity param = QueryParamEntity.of(); + param.setSorts(new ArrayList<>()); + + Sort sort = new Sort(); + sort.setName("name"); + sort.setOrder("desc"); + param.getSorts().add(sort); + + SqlRequest request = analyzer.refactor(param); + String sql = request.getSql().toLowerCase(); + + System.out.println(request); + assertTrue(sql.contains("order by t.\"name\" desc")); + + executeAndVerify(request); + } + + @Test + public void testCustomSortFunctionFallbackToColumn() { + QueryAnalyzerImpl analyzer = new QueryAnalyzerImpl( + database, + "select t.id, t.name from s_test t"); + + QueryParamEntity param = QueryParamEntity.of(); + param.setSorts(new ArrayList<>()); + + Sort sort = new Sort(); + sort.setName("name"); + sort.setType("not_exists_function"); + sort.setOrder("asc"); + param.getSorts().add(sort); + + SqlRequest request = analyzer.refactor(param); + String sql = request.getSql().toLowerCase(); + + System.out.println(request); + assertTrue(sql.contains("order by")); + assertFalse(sql.contains("not_exists_function(")); + assertTrue(sql.contains("name")); + assertTrue(sql.contains("asc")); + + executeAndVerify(request); + } +}