Skip to content

Commit

Permalink
feat-ISelectAbility-实现带分页和排序的get查询接口
Browse files Browse the repository at this point in the history
  • Loading branch information
aruis committed Sep 2, 2024
1 parent b420ac2 commit 4273ad4
Show file tree
Hide file tree
Showing 10 changed files with 250 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import jakarta.transaction.Transactional;
import net.ximatai.muyun.database.IDatabaseAccess;
import net.ximatai.muyun.database.exception.MyDatabaseException;
import net.ximatai.muyun.domain.PageResult;
import net.ximatai.muyun.platform.controller.TestController;
import net.ximatai.muyun.testcontainers.PostgresTestResource;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -52,6 +53,23 @@ void setUp() {

}

@Test
void testPageView() {
String id = ids.getFirst();
PageResult response = given()
.get("/test/view?page=1&limit=2")
.then()
.statusCode(200)
.extract()
.as(new TypeRef<>() {
});

assertEquals(response.getTotal(), 3);
assertEquals(response.getList().size(), 2);
assertEquals(response.getPage(), 1);
assertEquals(response.getLimit(), 2);
}

@Test
void testCreate() {
String id = "666";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package net.ximatai.muyun.ability;

import net.ximatai.muyun.domain.OrderColumn;

import java.util.List;

public interface IMetadataAbility {

String getMainTable();
Expand All @@ -8,8 +12,20 @@ default String getPK() {
return "id";
}

default OrderColumn getOrderColumn() {
return OrderColumn.T_CREATE;
}

default List<OrderColumn> getOrderColumns() {
return List.of(getOrderColumn());
}

default String getSelectOneRowSql() {
return "select * from " + getMainTable() + " where " + getPK() + "=:id";
}

default String getSelectSql() {
return "select * from " + getMainTable();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,64 @@
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.QueryParam;
import net.ximatai.muyun.ability.IDatabaseAbility;
import net.ximatai.muyun.ability.IMetadataAbility;
import net.ximatai.muyun.domain.OrderColumn;
import net.ximatai.muyun.domain.PageResult;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public interface ISelectAbility extends IDatabaseAbility, IMetadataAbility {

@GET
@Path("/view/{id}")
default Map<String, Object> view(@PathParam("id") String id) {
default Map<String, ?> view(@PathParam("id") String id) {
return getDatabase().row(getSelectOneRowSql(), Map.of("id", id));
}

@GET
@Path("/view")
default PageResult view(
@QueryParam("page") int page,
@QueryParam("limit") int limit,
@QueryParam("orderField") String orderField,
@QueryParam("orderType") String orderType
) {
List<OrderColumn> orderColumns = (orderField != null)
? List.of(new OrderColumn(orderField, orderType))
: getOrderColumns();

String authCondition = "and 1=1";
String baseSql = "select * from (%s) %s where 1=1 %s".formatted(getSelectSql(), getMainTable(), authCondition);

// 计算总数
long total = (long) getDatabase()
.row("select count(*) as num from (%s) %s where 1=1 %s ".formatted(getSelectSql(), getMainTable(), authCondition))
.get("num");

// 构建查询 SQL
StringBuilder querySql = new StringBuilder(baseSql);
List<Object> params = new ArrayList<>();

// 添加排序列
if (!orderColumns.isEmpty()) {
querySql.append(" order by ");
querySql.append(orderColumns.stream()
.map(oc -> oc.getColumnName() + " " + (oc.getType().isASC() ? "asc" : "desc"))
.collect(Collectors.joining(", ")));
}

// 添加分页参数
querySql.append(" offset ? limit ? ");
params.add((page - 1) * limit);
params.add(limit);

List<?> list = getDatabase().query(querySql.toString(), params);

return new PageResult<>(list, total, limit, page);
}
}
47 changes: 47 additions & 0 deletions my-core/src/main/java/net/ximatai/muyun/domain/OrderColumn.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package net.ximatai.muyun.domain;

public class OrderColumn {

public static final OrderColumn T_CREATE = new OrderColumn("t_create", Type.DESC);
public static final OrderColumn I_ORDER = new OrderColumn("i_order");

private final String columnName;
private final Type type;

public enum Type {
DESC, ASC;

public boolean isASC() {
return this == ASC;
}

}

public OrderColumn(String columnName, Type type) {
this.columnName = columnName;
this.type = type;
}

public OrderColumn(String columnName, String typeString) {
this.columnName = columnName;
if (typeString != null) {
this.type = Type.valueOf(typeString.toUpperCase());
} else {
this.type = Type.ASC;
}
}

public OrderColumn(String columnName) {
this.columnName = columnName;
this.type = Type.ASC;
}

public String getColumnName() {
return columnName;
}

public Type getType() {
return type;
}

}
52 changes: 52 additions & 0 deletions my-core/src/main/java/net/ximatai/muyun/domain/PageResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package net.ximatai.muyun.domain;

import java.util.List;

public class PageResult<T> {
private List<T> list;
private long total;
private int limit;
private int page;

public PageResult() {
}

public PageResult(List<T> list, long total, int limit, int page) {
this.list = list;
this.total = total;
this.limit = limit;
this.page = page;
}

public List<T> getList() {
return list;
}

public long getTotal() {
return total;
}

public int getLimit() {
return limit;
}

public int getPage() {
return page;
}

public void setList(List<T> list) {
this.list = list;
}

public void setTotal(long total) {
this.total = total;
}

public void setLimit(int limit) {
this.limit = limit;
}

public void setPage(int page) {
this.page = page;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
public class DataAccessStd extends DBInfoProvider implements IDatabaseAccessStd {

@Override
public <T> T insert(String sql, Map<String, Object> params, String pk, Class<T> idType) {
public <T> T insert(String sql, Map<String, ?> params, String pk, Class<T> idType) {
return getJdbi().withHandle(handle -> {
var query = handle.createUpdate(sql);
if (params != null) {
Expand All @@ -25,7 +25,7 @@ public <T> T insert(String sql, Map<String, Object> params, String pk, Class<T>
}

@Override
public Map<String, Object> row(String sql, Map<String, Object> params) {
public Map<String, Object> row(String sql, Map<String, ?> params) {
var row = getJdbi().withHandle(handle -> {
var query = handle.createQuery(sql);
if (params != null) {
Expand All @@ -48,8 +48,30 @@ public Map<String, Object> row(String sql) {
}

@Override
public List<Map<String, Object>> query(String sql, Map<String, Object> params) {
return List.of();
public List<Map<String, Object>> query(String sql, Map<String, ?> params) {
return getJdbi().withHandle(handle -> {
var query = handle.createQuery(sql);
if (params != null) {
params.forEach(query::bind);
}

return query.mapToMap().list();
});
}

@Override
public List<Map<String, Object>> query(String sql, List<?> params) {
return getJdbi().withHandle(handle -> {
var query = handle.createQuery(sql);

if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
query.bind(i, params.get(i)); // 通过索引绑定参数
}
}

return query.mapToMap().list();
});
}

@Override
Expand All @@ -59,7 +81,7 @@ public List<Map<String, Object>> query(String sql) {

@Override
@Transactional
public Integer update(String sql, Map<String, Object> params) {
public Integer update(String sql, Map<String, ?> params) {
return getJdbi().withHandle(handle -> {
var update = handle.createUpdate(sql);
if (params != null) {
Expand All @@ -70,7 +92,7 @@ public Integer update(String sql, Map<String, Object> params) {
}

@Override
public Integer delete(String sql, Map<String, Object> params) {
public Integer delete(String sql, Map<String, ?> params) {
return update(sql, params);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class DataAccessUni extends DBInfoProvider implements IDatabaseAccessUni
Mutiny.SessionFactory sessionFactory;

@Override
public <T> Uni<T> insert(String sql, Map<String, Object> params, String pk, Class<T> idType) {
public <T> Uni<T> insert(String sql, Map<String, ?> params, String pk, Class<T> idType) {
return this.row(sql + " returning " + pk, params)
.map(Unchecked.function(row -> {
Object value = row.get(pk);
Expand All @@ -33,7 +33,7 @@ public <T> Uni<T> insert(String sql, Map<String, Object> params, String pk, Clas
}

@Override
public Uni<Map<String, Object>> row(String sql, Map<String, Object> params) {
public Uni<Map<String, Object>> row(String sql, Map<String, ?> params) {
return sessionFactory.withSession(session -> {

Mutiny.SelectionQuery<Tuple> query = session.createNativeQuery(sql, Tuple.class);
Expand All @@ -56,7 +56,12 @@ public Uni<Map<String, Object>> row(String sql) {
}

@Override
public Uni<List<Map<String, Object>>> query(String sql, Map<String, Object> params) {
public Uni<List<Map<String, Object>>> query(String sql, Map<String, ?> params) {
return null;
}

@Override
public Uni<List<Map<String, Object>>> query(String sql, List<?> params) {
return null;
}

Expand All @@ -66,12 +71,12 @@ public Uni<List<Map<String, Object>>> query(String sql) {
}

@Override
public Uni<Integer> update(String sql, Map<String, Object> params) {
public Uni<Integer> update(String sql, Map<String, ?> params) {
return null;
}

@Override
public Uni<Integer> delete(String sql, Map<String, Object> params) {
public Uni<Integer> delete(String sql, Map<String, ?> params) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,30 @@
public interface IDatabaseAccessUni extends IDatabaseAccess {

@Override
default Uni<String> insertItem(String tableName, Map<String, Object> params) {
default Uni<String> insertItem(String tableName, Map<String, ?> params) {
return (Uni<String>) IDatabaseAccess.super.insertItem(tableName, params);
}

default Uni<Boolean> updateItem(String tableName, Map<String, Object> params) {
default Uni<Boolean> updateItem(String tableName, Map<String, ?> params) {
Uni<Integer> updated = (Uni<Integer>) IDatabaseAccess.super.updateItem(tableName, params);
return updated.onItem().transform(rowsUpdated -> rowsUpdated == 1);
}

<T> Uni<T> insert(String sql, Map<String, Object> params, String pk, Class<T> idType);
<T> Uni<T> insert(String sql, Map<String, ?> params, String pk, Class<T> idType);

Uni<Map<String, Object>> row(String sql, Map<String, Object> params);
Uni<Map<String, Object>> row(String sql, Map<String, ?> params);

Uni<Map<String, Object>> row(String sql);

Uni<List<Map<String, Object>>> query(String sql, Map<String, Object> params);
Uni<List<Map<String, Object>>> query(String sql, Map<String, ?> params);

Uni<List<Map<String, Object>>> query(String sql, List<?> params);

Uni<List<Map<String, Object>>> query(String sql);

Uni<Integer> update(String sql, Map<String, Object> params);
Uni<Integer> update(String sql, Map<String, ?> params);

Uni<Integer> delete(String sql, Map<String, Object> params);
Uni<Integer> delete(String sql, Map<String, ?> params);

Uni<Void> execute(String sql);

Expand Down
Loading

0 comments on commit 4273ad4

Please sign in to comment.