feat: 排序解析支持FunctionFragmentBuilder (#348)

This commit is contained in:
gyl
2026-04-03 15:41:54 +08:00
committed by GitHub
parent 5460f8b4d2
commit 4f9129cd8c
2 changed files with 65 additions and 6 deletions

View File

@@ -5,8 +5,6 @@ import lombok.SneakyThrows;
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.meta.FeatureSupportedMetadata;
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 @@ class QueryAnalyzerImpl implements FromItemVisitor, SelectItemVisitor, SelectVis
} 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");
}
}

View File

@@ -3,6 +3,7 @@ package org.hswebframework.web.crud.query;
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.boot.test.context.SpringBootTest;
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 class QueryAnalyzerImplTest {
// 验证SQL可以执行
executeAndVerify(request);
}
}
@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);
}
}