mirror of
https://github.com/hs-web/hsweb-framework.git
synced 2026-05-07 05:36:21 +08:00
feat: 排序解析支持FunctionFragmentBuilder (#348)
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user