Skip to content

Commit 4f9129c

Browse files
authored
feat: 排序解析支持FunctionFragmentBuilder (#348)
1 parent 5460f8b commit 4f9129c

2 files changed

Lines changed: 65 additions & 6 deletions

File tree

hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,28 @@
55
import net.sf.jsqlparser.expression.*;
66
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
77
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
8-
import net.sf.jsqlparser.schema.Column;
9-
import net.sf.jsqlparser.schema.Table;
108
import net.sf.jsqlparser.statement.select.*;
119
import net.sf.jsqlparser.statement.values.ValuesStatement;
1210
import org.apache.commons.collections4.CollectionUtils;
1311
import org.hswebframework.ezorm.core.meta.FeatureSupportedMetadata;
1412
import org.hswebframework.ezorm.core.param.Sort;
1513
import org.hswebframework.ezorm.core.param.Term;
1614
import org.hswebframework.ezorm.rdb.executor.SqlRequest;
17-
import org.hswebframework.ezorm.rdb.metadata.*;
15+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
16+
import org.hswebframework.ezorm.rdb.metadata.RDBSchemaMetadata;
17+
import org.hswebframework.ezorm.rdb.metadata.RDBViewMetadata;
18+
import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
1819
import org.hswebframework.ezorm.rdb.metadata.dialect.Dialect;
1920
import org.hswebframework.ezorm.rdb.operator.DatabaseOperator;
2021
import org.hswebframework.ezorm.rdb.operator.builder.fragments.*;
22+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.function.FunctionFragmentBuilder;
2123
import org.hswebframework.web.api.crud.entity.QueryParamEntity;
2224
import org.springframework.util.Assert;
2325
import org.springframework.util.StringUtils;
2426

2527
import java.util.*;
2628

29+
import static java.util.Optional.ofNullable;
2730
import static net.sf.jsqlparser.statement.select.PlainSelect.getFormatedList;
2831
import static org.hswebframework.ezorm.rdb.operator.builder.fragments.TermFragmentBuilder.createFeatureId;
2932

@@ -1009,9 +1012,12 @@ private void appendOrderBy(AppendableSqlFragments sql, QueryParamEntity param) {
10091012
} else {
10101013
orderByColumn.addSql(",");
10111014
}
1012-
//todo function支持
1015+
SqlFragments fragments = ofNullable(sort.getType())
1016+
.flatMap(function -> column.metadata.findFeature(FunctionFragmentBuilder.createFeatureId(function)))
1017+
.map(builder -> builder.create(columnName, column.metadata, sort.getOpts()))
1018+
.orElseGet(() -> PrepareSqlFragments.of(columnName));
10131019
orderByColumn
1014-
.addSql(columnName)
1020+
.add(fragments)
10151021
.addSql(desc ? "DESC" : "ASC");
10161022
}
10171023
}

hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.hswebframework.ezorm.rdb.executor.SqlRequest;
44
import org.hswebframework.ezorm.rdb.executor.wrapper.ResultWrappers;
55
import org.hswebframework.ezorm.rdb.operator.DatabaseOperator;
6+
import org.hswebframework.ezorm.core.param.Sort;
67
import org.hswebframework.web.api.crud.entity.QueryParamEntity;
78
import org.hswebframework.web.crud.TestApplication;
89
import org.junit.Assert;
@@ -13,6 +14,8 @@
1314
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
1415
import reactor.test.StepVerifier;
1516

17+
import java.util.ArrayList;
18+
1619
import static org.junit.jupiter.api.Assertions.*;
1720

1821
@SpringBootTest(classes = TestApplication.class)
@@ -1093,4 +1096,54 @@ public void testAggregateFunctions() {
10931096
// 验证SQL可以执行
10941097
executeAndVerify(request);
10951098
}
1096-
}
1099+
1100+
@Test
1101+
public void testSort() {
1102+
QueryAnalyzerImpl analyzer = new QueryAnalyzerImpl(
1103+
database,
1104+
"select t.id, t.name from s_test t group by t.id, t.name");
1105+
1106+
QueryParamEntity param = QueryParamEntity.of();
1107+
param.setSorts(new ArrayList<>());
1108+
1109+
Sort sort = new Sort();
1110+
sort.setName("name");
1111+
sort.setOrder("desc");
1112+
param.getSorts().add(sort);
1113+
1114+
SqlRequest request = analyzer.refactor(param);
1115+
String sql = request.getSql().toLowerCase();
1116+
1117+
System.out.println(request);
1118+
assertTrue(sql.contains("order by t.\"name\" desc"));
1119+
1120+
executeAndVerify(request);
1121+
}
1122+
1123+
@Test
1124+
public void testCustomSortFunctionFallbackToColumn() {
1125+
QueryAnalyzerImpl analyzer = new QueryAnalyzerImpl(
1126+
database,
1127+
"select t.id, t.name from s_test t");
1128+
1129+
QueryParamEntity param = QueryParamEntity.of();
1130+
param.setSorts(new ArrayList<>());
1131+
1132+
Sort sort = new Sort();
1133+
sort.setName("name");
1134+
sort.setType("not_exists_function");
1135+
sort.setOrder("asc");
1136+
param.getSorts().add(sort);
1137+
1138+
SqlRequest request = analyzer.refactor(param);
1139+
String sql = request.getSql().toLowerCase();
1140+
1141+
System.out.println(request);
1142+
assertTrue(sql.contains("order by"));
1143+
assertFalse(sql.contains("not_exists_function("));
1144+
assertTrue(sql.contains("name"));
1145+
assertTrue(sql.contains("asc"));
1146+
1147+
executeAndVerify(request);
1148+
}
1149+
}

0 commit comments

Comments
 (0)