support table page query

This commit is contained in:
SwallowGG
2023-10-11 21:30:29 +08:00
parent 787f3baffb
commit 94cc7ba36a
5 changed files with 141 additions and 26 deletions

View File

@ -75,6 +75,14 @@ public interface TableService {
*/
PageResult<Table> pageQuery(TablePageQueryParam param, TableSelector selector);
/**
* 查询表信息
* @param param
* @return
*/
ListResult<SimpleTable> queryTables(TablePageQueryParam param);
/**
* 查询表包含的字段
*

View File

@ -136,10 +136,10 @@ public class TableServiceImpl implements TableService {
@Override
public PageResult<Table> pageQuery(TablePageQueryParam param, TableSelector selector) {
LambdaQueryWrapper<TableCacheVersionDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TableCacheVersionDO::getKey, buildKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName()));
queryWrapper.eq(TableCacheVersionDO::getKey, getTableKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName()));
TableCacheVersionDO versionDO = tableCacheVersionMapper.selectOne(queryWrapper);
if (param.isRefresh() || versionDO == null) {
addDBCache(param, versionDO);
addDBCache(param.getDataSourceId(),param.getDatabaseName(),param.getSchemaName(), versionDO);
}
LambdaQueryWrapper<TableCacheDO> query = new LambdaQueryWrapper<>();
query.eq(TableCacheDO::getVersion, versionDO.getVersion());
@ -170,14 +170,49 @@ public class TableServiceImpl implements TableService {
return PageResult.of(tables, versionDO.getTableCount(), param);
}
private void addDBCache(TablePageQueryParam param, TableCacheVersionDO versionDO) {
@Override
public ListResult<SimpleTable> queryTables(TablePageQueryParam param) {
LambdaQueryWrapper<TableCacheVersionDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TableCacheVersionDO::getKey, getTableKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName()));
TableCacheVersionDO versionDO = tableCacheVersionMapper.selectOne(queryWrapper);
if (param.isRefresh() || versionDO == null) {
addDBCache(param.getDataSourceId(),param.getDatabaseName(), param.getSchemaName(), versionDO);
}
LambdaQueryWrapper<TableCacheDO> query = new LambdaQueryWrapper<>();
query.eq(TableCacheDO::getVersion, versionDO.getVersion());
query.eq(TableCacheDO::getDataSourceId, param.getDataSourceId());
if (StringUtils.isNotBlank(param.getDatabaseName())) {
query.eq(TableCacheDO::getDatabaseName, param.getDatabaseName());
}
if (StringUtils.isNotBlank(param.getSchemaName())) {
query.eq(TableCacheDO::getSchemaName, param.getSchemaName());
}
List<SimpleTable> tables = new ArrayList<>();
for (int i = 0; i < versionDO.getTableCount()/500 +1; i++) {
Page<TableCacheDO> page = new Page<>(i+1, 500);
IPage<TableCacheDO> iPage = tableCacheMapper.selectPage(page, query);
if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
for (TableCacheDO tableCacheDO : iPage.getRecords()) {
SimpleTable t = new SimpleTable();
t.setName(tableCacheDO.getTableName());
t.setComment(tableCacheDO.getExtendInfo());
tables.add(t);
}
}
}
return ListResult.of(tables);
}
private void addDBCache(Long dataSourceId,String databaseName,String schemaName, TableCacheVersionDO versionDO) {
String key = getTableKey(dataSourceId, databaseName, schemaName);
if (versionDO == null) {
versionDO = new TableCacheVersionDO();
versionDO.setDatabaseName(param.getDatabaseName());
versionDO.setSchemaName(param.getSchemaName());
versionDO.setDataSourceId(param.getDataSourceId());
versionDO.setDatabaseName(databaseName);
versionDO.setSchemaName(schemaName);
versionDO.setDataSourceId(dataSourceId);
versionDO.setStatus("2");
versionDO.setKey(buildKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName()));
versionDO.setKey(key);
versionDO.setVersion(0L);
versionDO.setTableCount(0L);
tableCacheVersionMapper.insert(versionDO);
@ -188,7 +223,7 @@ public class TableServiceImpl implements TableService {
}
Connection connection = Chat2DBContext.getConnection();
long n = 0;
try (ResultSet resultSet = connection.getMetaData().getTables(param.getDatabaseName(), param.getSchemaName(), param.getTableName(),
try (ResultSet resultSet = connection.getMetaData().getTables(databaseName, schemaName, null,
new String[]{"TABLE"})) {
List<TableCacheDO> cacheDOS = new ArrayList<>();
while (resultSet.next()) {
@ -197,9 +232,9 @@ public class TableServiceImpl implements TableService {
tableCacheDO.setSchemaName(resultSet.getString("TABLE_SCHEM"));
tableCacheDO.setTableName(resultSet.getString("TABLE_NAME"));
tableCacheDO.setExtendInfo(resultSet.getString("REMARKS"));
tableCacheDO.setDataSourceId(param.getDataSourceId());
tableCacheDO.setDataSourceId(dataSourceId);
tableCacheDO.setVersion(versionDO.getVersion());
tableCacheDO.setKey(buildKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName()));
tableCacheDO.setKey(key);
cacheDOS.add(tableCacheDO);
if (cacheDOS.size() >= 500) {
tableCacheMapper.batchInsert(cacheDOS);
@ -214,13 +249,13 @@ public class TableServiceImpl implements TableService {
versionDO.setTableCount(n);
tableCacheVersionMapper.updateById(versionDO);
LambdaQueryWrapper<TableCacheDO> q = new LambdaQueryWrapper();
q.eq(TableCacheDO::getDataSourceId, param.getDataSourceId());
q.eq(TableCacheDO::getDataSourceId, dataSourceId);
q.lt(TableCacheDO::getVersion, versionDO.getVersion());
if (param.getDatabaseName() != null) {
q.eq(TableCacheDO::getDatabaseName, param.getDatabaseName());
if (StringUtils.isNotBlank(databaseName)) {
q.eq(TableCacheDO::getDatabaseName, databaseName);
}
if (param.getSchemaName() != null) {
q.eq(TableCacheDO::getSchemaName, param.getSchemaName());
if (StringUtils.isNotBlank(schemaName)) {
q.eq(TableCacheDO::getSchemaName, schemaName);
}
tableCacheMapper.delete(q);
} catch (SQLException e) {
@ -230,16 +265,16 @@ public class TableServiceImpl implements TableService {
}
private String buildKey(Long dataSourceId, String databaseName, String schemaName) {
StringBuilder stringBuilder = new StringBuilder(dataSourceId.toString());
if (StringUtils.isNotBlank(databaseName)) {
stringBuilder.append("_").append(databaseName);
}
if (StringUtils.isNotBlank(schemaName)) {
stringBuilder.append("_").append(schemaName);
}
return stringBuilder.toString();
}
// private String buildKey(Long dataSourceId, String databaseName, String schemaName) {
// StringBuilder stringBuilder = new StringBuilder(dataSourceId.toString());
// if (StringUtils.isNotBlank(databaseName)) {
// stringBuilder.append("_").append(databaseName);
// }
// if (StringUtils.isNotBlank(schemaName)) {
// stringBuilder.append("_").append(schemaName);
// }
// return stringBuilder.toString();
// }
private List<Table> pinTable(List<Table> list, TablePageQueryParam param) {
if (CollectionUtils.isEmpty(list)) {

View File

@ -60,6 +60,22 @@ public class TableController {
request.getPageSize());
}
/**
* 查询当前DB下的表列表
*
* @param request
* @return
*/
@GetMapping("/table_list")
public ListResult<SimpleTable> tableList(@Valid TableBriefQueryRequest request) {
TablePageQueryParam queryParam = rdbWebConverter.tablePageRequest2param(request);
return tableService.queryTables(queryParam);
}
/**
* 查询当前DB下的表columns

View File

@ -0,0 +1,30 @@
package ai.chat2db.spi.model;
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class SimpleColumn {
/**
* 列名
*/
@JsonAlias({"COLUMN_NAME"})
private String name;
@JsonAlias({"TYPE_NAME"})
private String columnType;
/**
* 注释
*/
@JsonAlias({"REMARKS"})
private String comment;
}

View File

@ -0,0 +1,26 @@
package ai.chat2db.spi.model;
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class SimpleTable {
/**
* 表名
*/
@JsonAlias({"TABLE_NAME"})
private String name;
/**
* 描述
*/
@JsonAlias({"REMARKS"})
private String comment;
}