Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@
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;
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;

Expand Down Expand Up @@ -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");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -1093,4 +1096,54 @@ public void testAggregateFunctions() {
// 验证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);
}
}
Loading