From efd9aa490a349fe589ee45644bb49991f7dcaf14 Mon Sep 17 00:00:00 2001 From: jipengfei-jpf <1558143046@qq.com> Date: Sat, 24 Jun 2023 16:32:02 +0800 Subject: [PATCH] support PinService --- .../plugin/postgresql/PostgreSQLDBManage.java | 2 +- .../chat2db/plugin/redis/RedisMetaData.java | 8 +- .../chat2db/plugin/sqlite/SqliteMetaData.java | 8 +- .../domain/api/param/MetaDataQueryParam.java | 18 +++++ .../domain/api/param/PinTableParam.java | 31 ++++++++ .../domain/api/param/SchemaQueryParam.java | 1 - .../domain/api/service/DatabaseService.java | 14 +++- .../server/domain/api/service/PinService.java | 33 ++++++++ .../core/converter/PinTableConverter.java | 21 +++++ .../core/impl/DataSourceServiceImpl.java | 4 +- .../domain/core/impl/DatabaseServiceImpl.java | 44 +++++++---- .../domain/core/impl/PinServiceImpl.java | 77 +++++++++++++++++++ .../domain/core/impl/TableServiceImpl.java | 51 ++++++++++-- .../domain/repository/entity/PinTableDO.java | 61 +++++++++++++++ .../repository/mapper/PinTableMapper.java | 8 ++ .../domain/repository/PinTableMapper.xml | 5 ++ .../db/migration/V1_0_5__增加置顶表.sql | 14 ++++ .../web/api/controller/pin/PinController.java | 35 +++++++++ .../pin/converter/PinWebConverter.java | 12 +++ .../pin/request/PinTableRequest.java | 35 +++++++++ .../api/controller/rdb/RdbDdlController.java | 50 ++++++------ .../rdb/converter/RdbWebConverter.java | 17 ++-- .../api/controller/rdb/vo/MetaSchemaVO.java | 19 +++++ chat2db-server/chat2db-spi/pom.xml | 4 + .../main/java/ai/chat2db/spi/MetaData.java | 11 +-- .../chat2db/spi/jdbc/DefaultMetaService.java | 47 +++++++---- .../java/ai/chat2db/spi/model/Database.java | 9 ++- .../java/ai/chat2db/spi/model/MetaSchema.java | 25 ++++++ .../java/ai/chat2db/spi/model/Schema.java | 5 ++ .../main/java/ai/chat2db/spi/model/Table.java | 5 +- .../java/ai/chat2db/spi/sql/SQLExecutor.java | 11 ++- chat2db-server/pom.xml | 5 ++ 32 files changed, 595 insertions(+), 95 deletions(-) create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/MetaDataQueryParam.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/PinTableParam.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/PinService.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/converter/PinTableConverter.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/PinServiceImpl.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/PinTableDO.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/PinTableMapper.java create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/resources/ai/chat2db/server/domain/repository/PinTableMapper.xml create mode 100644 chat2db-server/chat2db-server-start/src/main/resources/db/migration/V1_0_5__增加置顶表.sql create mode 100644 chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/PinController.java create mode 100644 chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/converter/PinWebConverter.java create mode 100644 chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/request/PinTableRequest.java create mode 100644 chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/MetaSchemaVO.java create mode 100644 chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/MetaSchema.java diff --git a/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLDBManage.java b/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLDBManage.java index 2a54b644..e254d009 100644 --- a/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLDBManage.java +++ b/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLDBManage.java @@ -11,7 +11,7 @@ public class PostgreSQLDBManage implements DBManage { @Override public void connectDatabase(String database) { try { - SQLExecutor.getInstance().execute("connect " + database + ""); + SQLExecutor.getInstance().execute("SELECT pg_database_size('"+database+"');"); } catch (SQLException e) { throw new RuntimeException(e); } diff --git a/chat2db-server/chat2db-plugins/chat2db-redis/src/main/java/ai/chat2db/plugin/redis/RedisMetaData.java b/chat2db-server/chat2db-plugins/chat2db-redis/src/main/java/ai/chat2db/plugin/redis/RedisMetaData.java index c2809ed9..95a2b35f 100644 --- a/chat2db-server/chat2db-plugins/chat2db-redis/src/main/java/ai/chat2db/plugin/redis/RedisMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-redis/src/main/java/ai/chat2db/plugin/redis/RedisMetaData.java @@ -2,6 +2,7 @@ package ai.chat2db.plugin.redis; import ai.chat2db.spi.MetaData; import ai.chat2db.spi.jdbc.DefaultMetaService; +import ai.chat2db.spi.model.Database; import ai.chat2db.spi.model.Table; import ai.chat2db.spi.sql.SQLExecutor; import jakarta.validation.constraints.NotEmpty; @@ -19,15 +20,16 @@ public class RedisMetaData extends DefaultMetaService implements MetaData { @Override - public List databases() { - List databases = new ArrayList<>(); + public List databases() { + List databases = new ArrayList<>(); return SQLExecutor.getInstance().executeSql("config get databases", resultSet -> { try { if (resultSet.next()) { Object count = resultSet.getObject(2); if(StringUtils.isNotBlank(count.toString())) { for (int i = 0; i < Integer.parseInt(count.toString()); i++) { - databases.add(String.valueOf(i)); + Database database = Database.builder().name(String.valueOf(i)).build(); + databases.add(database); } } } diff --git a/chat2db-server/chat2db-plugins/chat2db-sqlite/src/main/java/ai/chat2db/plugin/sqlite/SqliteMetaData.java b/chat2db-server/chat2db-plugins/chat2db-sqlite/src/main/java/ai/chat2db/plugin/sqlite/SqliteMetaData.java index c5dc70fc..29201c16 100644 --- a/chat2db-server/chat2db-plugins/chat2db-sqlite/src/main/java/ai/chat2db/plugin/sqlite/SqliteMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-sqlite/src/main/java/ai/chat2db/plugin/sqlite/SqliteMetaData.java @@ -2,6 +2,8 @@ package ai.chat2db.plugin.sqlite; import ai.chat2db.spi.MetaData; import ai.chat2db.spi.jdbc.DefaultMetaService; +import ai.chat2db.spi.model.Database; +import ai.chat2db.spi.model.Schema; import ai.chat2db.spi.sql.SQLExecutor; import com.google.common.collect.Lists; @@ -24,12 +26,12 @@ public class SqliteMetaData extends DefaultMetaService implements MetaData { }); } @Override - public List databases() { - return Lists.newArrayList("main"); + public List databases() { + return Lists.newArrayList(Database.builder().name("main").build()); } @Override - public List schemas(String databaseName) { + public List schemas(String databaseName) { return Lists.newArrayList(); } } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/MetaDataQueryParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/MetaDataQueryParam.java new file mode 100644 index 00000000..86c0d561 --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/MetaDataQueryParam.java @@ -0,0 +1,18 @@ +package ai.chat2db.server.domain.api.param; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class MetaDataQueryParam { + + @NotNull + private Long dataSourceId; + +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/PinTableParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/PinTableParam.java new file mode 100644 index 00000000..bbda4bfe --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/PinTableParam.java @@ -0,0 +1,31 @@ +package ai.chat2db.server.domain.api.param; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class PinTableParam { + + @NotNull + private Long dataSourceId; + + /** + * DB名称 + */ + private String databaseName; + + /** + * 表所在空间 + */ + private String schemaName; + + /** + * tableName + */ + private String tableName; + + /** + * pin userId + */ + private Long userId; +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/SchemaQueryParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/SchemaQueryParam.java index b434ad6f..c61df050 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/SchemaQueryParam.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/SchemaQueryParam.java @@ -24,6 +24,5 @@ public class SchemaQueryParam { @NotNull private Long dataSourceId; - @NotNull private String dataBaseName; } \ No newline at end of file diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DatabaseService.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DatabaseService.java index d6256fb8..b5168276 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DatabaseService.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DatabaseService.java @@ -1,9 +1,8 @@ package ai.chat2db.server.domain.api.service; -import ai.chat2db.server.domain.api.param.DatabaseOperationParam; -import ai.chat2db.server.domain.api.param.DatabaseQueryAllParam; -import ai.chat2db.server.domain.api.param.SchemaOperationParam; -import ai.chat2db.server.domain.api.param.SchemaQueryParam; +import ai.chat2db.server.domain.api.param.*; +import ai.chat2db.server.tools.base.wrapper.Result; +import ai.chat2db.server.tools.base.wrapper.result.DataResult; import ai.chat2db.spi.model.*; import ai.chat2db.server.tools.base.wrapper.result.ActionResult; import ai.chat2db.server.tools.base.wrapper.result.ListResult; @@ -32,6 +31,13 @@ public interface DatabaseService { */ ListResult querySchema(SchemaQueryParam param); + /** + * query Database and Schema + * @param param + * @return + */ + DataResult queryDatabaseSchema(MetaDataQueryParam param); + /** diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/PinService.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/PinService.java new file mode 100644 index 00000000..c9479837 --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/PinService.java @@ -0,0 +1,33 @@ +package ai.chat2db.server.domain.api.service; + +import ai.chat2db.server.domain.api.param.PinTableParam; +import ai.chat2db.server.tools.base.wrapper.result.ActionResult; +import ai.chat2db.server.tools.base.wrapper.result.ListResult; + +import java.util.List; + +public interface PinService { + + /** + * User pin table + * @param param + * @return + */ + ActionResult pinTable(PinTableParam param); + + + /** + * Delete pin table + * @param param + * @return + */ + ActionResult deletePinTable(PinTableParam param); + + + /** + * Query user pin tables + * @param param + * @return + */ + ListResult queryPinTables(PinTableParam param); +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/converter/PinTableConverter.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/converter/PinTableConverter.java new file mode 100644 index 00000000..0e3548a1 --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/converter/PinTableConverter.java @@ -0,0 +1,21 @@ +package ai.chat2db.server.domain.core.converter; + +import ai.chat2db.server.domain.api.param.PinTableParam; +import ai.chat2db.server.domain.api.param.TablePageQueryParam; +import ai.chat2db.server.domain.repository.entity.PinTableDO; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring") +public abstract class PinTableConverter { + + /** + * + * @param param + * @return + */ + public abstract PinTableDO param2do(PinTableParam param); + + + + public abstract PinTableParam toPinTableParam (TablePageQueryParam param); +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DataSourceServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DataSourceServiceImpl.java index db42e502..143d876d 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DataSourceServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DataSourceServiceImpl.java @@ -137,8 +137,8 @@ public class DataSourceServiceImpl implements DataSourceService { public ListResult connect(Long id) { DatabaseQueryAllParam queryAllParam = new DatabaseQueryAllParam(); queryAllParam.setDataSourceId(id); - List databases = Chat2DBContext.getMetaData().databases(); - return ListResult.of(EasyCollectionUtils.toList(databases, name -> Database.builder().name(name).build())); + List databases = Chat2DBContext.getMetaData().databases(); + return ListResult.of(databases); } @Override diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DatabaseServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DatabaseServiceImpl.java index 1ca45a8b..6e6802be 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DatabaseServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DatabaseServiceImpl.java @@ -1,20 +1,23 @@ package ai.chat2db.server.domain.core.impl; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; -import ai.chat2db.server.domain.api.param.DatabaseOperationParam; -import ai.chat2db.server.domain.api.param.SchemaOperationParam; +import ai.chat2db.server.domain.api.param.*; import ai.chat2db.server.domain.api.service.DatabaseService; +import ai.chat2db.server.tools.base.wrapper.Result; +import ai.chat2db.server.tools.base.wrapper.result.DataResult; import ai.chat2db.spi.model.Database; +import ai.chat2db.spi.model.MetaSchema; import ai.chat2db.spi.model.Schema; -import ai.chat2db.server.domain.api.param.DatabaseQueryAllParam; -import ai.chat2db.server.domain.api.param.SchemaQueryParam; import ai.chat2db.server.tools.base.wrapper.result.ActionResult; import ai.chat2db.server.tools.base.wrapper.result.ListResult; import ai.chat2db.server.tools.common.util.EasyCollectionUtils; import ai.chat2db.spi.sql.Chat2DBContext; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; /** * @author moji @@ -26,14 +29,29 @@ public class DatabaseServiceImpl implements DatabaseService { @Override public ListResult queryAll(DatabaseQueryAllParam param) { - List databases = Chat2DBContext.getMetaData().databases(); - return ListResult.of(EasyCollectionUtils.toList(databases, name -> Database.builder().name(name).build())); + return ListResult.of(Chat2DBContext.getMetaData().databases()); } @Override public ListResult querySchema(SchemaQueryParam param) { - List databases = Chat2DBContext.getMetaData().schemas(param.getDataBaseName()); - return ListResult.of(EasyCollectionUtils.toList(databases, name -> Schema.builder().name(name).build())); + return ListResult.of(Chat2DBContext.getMetaData().schemas(param.getDataBaseName())); + } + + @Override + public DataResult queryDatabaseSchema(MetaDataQueryParam param) { + MetaSchema metaSchema = new MetaSchema(); + List databases = Chat2DBContext.getMetaData().databases(); + if (!CollectionUtils.isEmpty(databases)) { + for (Database dataBase : databases) { + List schemaList = Chat2DBContext.getMetaData().schemas(dataBase.getName()); + dataBase.setSchemas(schemaList); + } + metaSchema.setDatabases(databases); + } else { + List schemas = Chat2DBContext.getMetaData().schemas(null); + metaSchema.setSchemas(schemas); + } + return DataResult.of(metaSchema); } @Override @@ -50,26 +68,26 @@ public class DatabaseServiceImpl implements DatabaseService { @Override public ActionResult modifyDatabase(DatabaseOperationParam param) { - Chat2DBContext.getDBManage().modifyDatabase(param.getDatabaseName(),param.getNewDatabaseName()); + Chat2DBContext.getDBManage().modifyDatabase(param.getDatabaseName(), param.getNewDatabaseName()); return ActionResult.isSuccess(); } @Override public ActionResult deleteSchema(SchemaOperationParam param) { - Chat2DBContext.getDBManage().dropSchema(param.getDatabaseName(),param.getSchemaName()); + Chat2DBContext.getDBManage().dropSchema(param.getDatabaseName(), param.getSchemaName()); return ActionResult.isSuccess(); } @Override public ActionResult createSchema(SchemaOperationParam param) { - Chat2DBContext.getDBManage().createSchema(param.getDatabaseName(),param.getSchemaName()); + Chat2DBContext.getDBManage().createSchema(param.getDatabaseName(), param.getSchemaName()); return ActionResult.isSuccess(); } @Override public ActionResult modifySchema(SchemaOperationParam param) { - Chat2DBContext.getDBManage().modifySchema(param.getDatabaseName(),param.getSchemaName(), - param.getNewSchemaName()); + Chat2DBContext.getDBManage().modifySchema(param.getDatabaseName(), param.getSchemaName(), + param.getNewSchemaName()); return ActionResult.isSuccess(); } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/PinServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/PinServiceImpl.java new file mode 100644 index 00000000..c7ead4b6 --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/PinServiceImpl.java @@ -0,0 +1,77 @@ +package ai.chat2db.server.domain.core.impl; + +import ai.chat2db.server.domain.api.param.PinTableParam; +import ai.chat2db.server.domain.api.service.PinService; +import ai.chat2db.server.domain.core.converter.PinTableConverter; +import ai.chat2db.server.domain.repository.entity.PinTableDO; +import ai.chat2db.server.domain.repository.mapper.PinTableMapper; +import ai.chat2db.server.tools.base.wrapper.result.ActionResult; +import ai.chat2db.server.tools.base.wrapper.result.ListResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class PinServiceImpl implements PinService { + + @Autowired + private PinTableConverter pinTableConverter; + + @Autowired + private PinTableMapper pinTableMapper; + + @Override + public ActionResult pinTable(PinTableParam param) { + PinTableDO entity = pinTableConverter.param2do(param); + pinTableMapper.insert(entity); + return ActionResult.isSuccess(); + } + + @Override + public ActionResult deletePinTable(PinTableParam param) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(PinTableDO::getUserId, param.getUserId()); + updateWrapper.eq(PinTableDO::getDataSourceId, param.getDataSourceId()); + if (StringUtils.isNotBlank(param.getDatabaseName())) { + updateWrapper.eq(PinTableDO::getDatabaseName, param.getDatabaseName()); + } + if (StringUtils.isNotBlank(param.getSchemaName())) { + updateWrapper.eq(PinTableDO::getSchemaName, param.getSchemaName()); + } + if (StringUtils.isNotBlank(param.getTableName())) { + updateWrapper.eq(PinTableDO::getTableName, param.getTableName()); + } + pinTableMapper.delete(updateWrapper); + return ActionResult.isSuccess(); + } + + @Override + public ListResult queryPinTables(PinTableParam param) { + List result = new ArrayList<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PinTableDO::getUserId, param.getUserId()); + queryWrapper.eq(PinTableDO::getDataSourceId, param.getDataSourceId()); + if (StringUtils.isNotBlank(param.getDatabaseName())) { + queryWrapper.eq(PinTableDO::getDatabaseName, param.getDatabaseName()); + } + if (StringUtils.isNotBlank(param.getSchemaName())) { + queryWrapper.eq(PinTableDO::getSchemaName, param.getSchemaName()); + } + if (StringUtils.isNotBlank(param.getTableName())) { + queryWrapper.eq(PinTableDO::getTableName, param.getTableName()); + } + queryWrapper.orderByDesc(PinTableDO::getGmtModified); + List list = pinTableMapper.selectList(queryWrapper); + if (!CollectionUtils.isEmpty(list)) { + result = list.stream().map(pinTableDO -> pinTableDO.getTableName()).collect(Collectors.toList()); + } + return ListResult.of(result); + } +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java index fd0ceed8..82eb18af 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java @@ -1,19 +1,22 @@ package ai.chat2db.server.domain.core.impl; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import ai.chat2db.server.domain.api.param.*; +import ai.chat2db.server.domain.api.service.PinService; import ai.chat2db.server.domain.api.service.TableService; +import ai.chat2db.server.domain.core.converter.PinTableConverter; +import ai.chat2db.server.tools.common.util.ContextUtils; import ai.chat2db.spi.DBManage; import ai.chat2db.spi.MetaData; import ai.chat2db.spi.model.Sql; import ai.chat2db.spi.model.Table; import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableIndex; -import ai.chat2db.server.domain.api.param.DropParam; -import ai.chat2db.server.domain.api.param.ShowCreateTableParam; -import ai.chat2db.server.domain.api.param.TablePageQueryParam; -import ai.chat2db.server.domain.api.param.TableQueryParam; -import ai.chat2db.server.domain.api.param.TableSelector; import ai.chat2db.server.tools.base.wrapper.result.ActionResult; import ai.chat2db.server.tools.base.wrapper.result.DataResult; import ai.chat2db.server.tools.base.wrapper.result.ListResult; @@ -22,7 +25,9 @@ import ai.chat2db.server.tools.common.util.EasyEnumUtils; import ai.chat2db.spi.sql.Chat2DBContext; import ai.chat2db.spi.util.SqlUtils; +import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -33,6 +38,12 @@ import org.springframework.stereotype.Service; @Service public class TableServiceImpl implements TableService { + @Autowired + private PinService pinService; + + @Autowired + private PinTableConverter pinTableConverter; + @Override public DataResult showCreateTable(ShowCreateTableParam param) { MetaData metaSchema = Chat2DBContext.getMetaData(); @@ -83,12 +94,42 @@ public class TableServiceImpl implements TableService { public PageResult pageQuery(TablePageQueryParam param, TableSelector selector) { MetaData metaSchema = Chat2DBContext.getMetaData(); List
list = metaSchema.tables(param.getDatabaseName(), param.getSchemaName(), param.getTableName()); + list = pinTable(list,param); if (CollectionUtils.isEmpty(list)) { return PageResult.of(list, 0L, param); } return PageResult.of(list, Long.valueOf(list.size()), param); } + private List
pinTable(List
list, TablePageQueryParam param) { + if (CollectionUtils.isEmpty(list)) { + return Lists.newArrayList(); + } + PinTableParam pinTableParam = pinTableConverter.toPinTableParam(param); + pinTableParam.setUserId(ContextUtils.getUserId()); + ListResult listResult = pinService.queryPinTables(pinTableParam); + if (!listResult.success() || CollectionUtils.isEmpty(listResult.getData())) { + return list; + } + List
tables = new ArrayList<>(); + Map tableMap = list.stream().collect(Collectors.toMap(Table::getName, Function.identity())); + for (String tableName : listResult.getData()) { + Table table = tableMap.get(tableName); + if (table != null) { + table.setPinned(true); + tables.add(table); + } + } + + for (Table table : list) { + if (table!=null && !tables.contains(table)) { + tables.add(table); + } + } + return tables; + } + + @Override public List queryColumns(TableQueryParam param) { MetaData metaSchema = Chat2DBContext.getMetaData(); diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/PinTableDO.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/PinTableDO.java new file mode 100644 index 00000000..9d764d2f --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/entity/PinTableDO.java @@ -0,0 +1,61 @@ +package ai.chat2db.server.domain.repository.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Getter +@Setter +@TableName("PIN_TABLE") +public class PinTableDO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + + /** + * 创建时间 + */ + private LocalDateTime gmtCreate; + + /** + * 修改时间 + */ + private LocalDateTime gmtModified; + + /** + * 数据源连接ID + */ + private Long dataSourceId; + + /** + * db名称 + */ + private String databaseName; + + + /** + * 保存名称 + */ + private String schemaName; + + /** + * userId + */ + private Long userId; + + /** + * tableName + */ + private String tableName; + +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/PinTableMapper.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/PinTableMapper.java new file mode 100644 index 00000000..c9ae1bdf --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/java/ai/chat2db/server/domain/repository/mapper/PinTableMapper.java @@ -0,0 +1,8 @@ +package ai.chat2db.server.domain.repository.mapper; + +import ai.chat2db.server.domain.repository.entity.PinTableDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PinTableMapper extends BaseMapper { + +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/resources/ai/chat2db/server/domain/repository/PinTableMapper.xml b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/resources/ai/chat2db/server/domain/repository/PinTableMapper.xml new file mode 100644 index 00000000..01eb63fd --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-repository/src/main/resources/ai/chat2db/server/domain/repository/PinTableMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V1_0_5__增加置顶表.sql b/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V1_0_5__增加置顶表.sql new file mode 100644 index 00000000..ba90e932 --- /dev/null +++ b/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V1_0_5__增加置顶表.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS `pin_table` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `data_source_id` bigint(20) unsigned NOT NULL COMMENT '数据源连接ID', + `database_name` varchar(128) DEFAULT NULL COMMENT 'db名称', + `schema_name` varchar(128) DEFAULT NULL COMMENT 'schema名称', + `table_name` varchar(128) DEFAULT NULL COMMENT 'table_name', + `deleted` text DEFAULT NULL COMMENT '是否被删除,y表示删除,n表示未删除', + `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户id', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='PIN TABLES' +; +create INDEX idx_user_id_data_source_id on pin_table(user_id,data_source_id) ; \ No newline at end of file diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/PinController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/PinController.java new file mode 100644 index 00000000..d0b9dcf9 --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/PinController.java @@ -0,0 +1,35 @@ +package ai.chat2db.server.web.api.controller.pin; + +import ai.chat2db.server.domain.api.service.PinService; +import ai.chat2db.server.tools.base.wrapper.result.ActionResult; +import ai.chat2db.server.web.api.controller.pin.converter.PinWebConverter; +import ai.chat2db.server.web.api.controller.pin.request.PinTableRequest; +import ai.chat2db.server.web.api.controller.rdb.request.DataExportRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequestMapping("/api/pin") +@RestController +public class PinController { + + @Autowired + private PinService pinService; + + @Autowired + private PinWebConverter pinWebConverter; + + @PostMapping("/table/add") + public ActionResult add(PinTableRequest request) { + return pinService.pinTable(pinWebConverter.req2param(request)); + } + + @PostMapping("/table/delete") + public ActionResult delete(PinTableRequest request) { + return pinService.deletePinTable(pinWebConverter.req2param(request)); + } + + +} diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/converter/PinWebConverter.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/converter/PinWebConverter.java new file mode 100644 index 00000000..4a3aa9f7 --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/converter/PinWebConverter.java @@ -0,0 +1,12 @@ +package ai.chat2db.server.web.api.controller.pin.converter; + +import ai.chat2db.server.domain.api.param.PinTableParam; +import ai.chat2db.server.web.api.controller.pin.request.PinTableRequest; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring") +public abstract class PinWebConverter { + + + public abstract PinTableParam req2param(PinTableRequest request); +} diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/request/PinTableRequest.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/request/PinTableRequest.java new file mode 100644 index 00000000..ab4a26d3 --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/pin/request/PinTableRequest.java @@ -0,0 +1,35 @@ +package ai.chat2db.server.web.api.controller.pin.request; + +import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class PinTableRequest { + + /** + * 数据源id + */ + @NotNull + private Long dataSourceId; + + /** + * DB名称 + */ + private String databaseName; + + /** + * 表所在空间 + */ + private String schemaName; + /** + * Pin table name + */ + private String tableName; +} diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDdlController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDdlController.java index c09758b9..d70d6c9f 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDdlController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDdlController.java @@ -2,21 +2,12 @@ package ai.chat2db.server.web.api.controller.rdb; import java.util.List; -import ai.chat2db.server.domain.api.param.DatabaseOperationParam; -import ai.chat2db.server.domain.api.param.DropParam; -import ai.chat2db.server.domain.api.param.SchemaOperationParam; -import ai.chat2db.server.domain.api.param.SchemaQueryParam; -import ai.chat2db.server.domain.api.param.ShowCreateTableParam; -import ai.chat2db.server.domain.api.param.TablePageQueryParam; -import ai.chat2db.server.domain.api.param.TableQueryParam; -import ai.chat2db.server.domain.api.param.TableSelector; +import ai.chat2db.server.domain.api.param.*; import ai.chat2db.server.domain.api.service.DatabaseService; import ai.chat2db.server.domain.api.service.DlTemplateService; import ai.chat2db.server.domain.api.service.TableService; -import ai.chat2db.spi.model.Schema; -import ai.chat2db.spi.model.Table; -import ai.chat2db.spi.model.TableColumn; -import ai.chat2db.spi.model.TableIndex; +import ai.chat2db.server.web.api.controller.rdb.vo.*; +import ai.chat2db.spi.model.*; import ai.chat2db.server.tools.base.wrapper.result.ActionResult; import ai.chat2db.server.tools.base.wrapper.result.DataResult; import ai.chat2db.server.tools.base.wrapper.result.ListResult; @@ -34,11 +25,6 @@ import ai.chat2db.server.web.api.controller.rdb.request.TableModifySqlRequest; import ai.chat2db.server.web.api.controller.rdb.request.TableUpdateDdlQueryRequest; import ai.chat2db.server.web.api.controller.rdb.request.UpdateDatabaseRequest; import ai.chat2db.server.web.api.controller.rdb.request.UpdateSchemaRequest; -import ai.chat2db.server.web.api.controller.rdb.vo.ColumnVO; -import ai.chat2db.server.web.api.controller.rdb.vo.IndexVO; -import ai.chat2db.server.web.api.controller.rdb.vo.SchemaVO; -import ai.chat2db.server.web.api.controller.rdb.vo.SqlVO; -import ai.chat2db.server.web.api.controller.rdb.vo.TableVO; import com.google.common.collect.Lists; import jakarta.validation.Valid; @@ -89,7 +75,7 @@ public class RdbDdlController { PageResult
tableDTOPageResult = tableService.pageQuery(queryParam, tableSelector); List tableVOS = rdbWebConverter.tableDto2vo(tableDTOPageResult.getData()); return WebPageResult.of(tableVOS, tableDTOPageResult.getTotal(), request.getPageNo(), - request.getPageSize()); + request.getPageSize()); } /** @@ -106,6 +92,20 @@ public class RdbDdlController { return ListResult.of(tableVOS); } + /** + * 查询数据库里包含的database_schema_list + * + * @param request + * @return + */ + @GetMapping("/database_schema_list") + public DataResult databaseSchemaList(@Valid DataSourceBaseRequest request) { + MetaDataQueryParam queryParam = MetaDataQueryParam.builder().dataSourceId(request.getDataSourceId()).build(); + DataResult result = databaseService.queryDatabaseSchema(queryParam); + MetaSchemaVO schemaDto2vo = rdbWebConverter.metaSchemaDto2vo(result.getData()); + return DataResult.of(schemaDto2vo); + } + /** * 删除数据库 * @@ -139,7 +139,7 @@ public class RdbDdlController { @PostMapping("/modify_database") public ActionResult modifyDatabase(@Valid @RequestBody UpdateDatabaseRequest request) { DatabaseOperationParam param = DatabaseOperationParam.builder().databaseName(request.getDatabaseName()) - .newDatabaseName(request.getNewDatabaseName()).build(); + .newDatabaseName(request.getNewDatabaseName()).build(); return databaseService.modifyDatabase(param); } @@ -152,7 +152,7 @@ public class RdbDdlController { @PostMapping("/delete_schema") public ActionResult deleteSchema(@Valid @RequestBody DataSourceBaseRequest request) { SchemaOperationParam param = SchemaOperationParam.builder().databaseName(request.getDatabaseName()) - .schemaName(request.getSchemaName()).build(); + .schemaName(request.getSchemaName()).build(); return databaseService.deleteSchema(param); } @@ -165,7 +165,7 @@ public class RdbDdlController { @PostMapping("/create_schema") public ActionResult createSchema(@Valid @RequestBody DataSourceBaseRequest request) { SchemaOperationParam param = SchemaOperationParam.builder().databaseName(request.getDatabaseName()) - .schemaName(request.getSchemaName()).build(); + .schemaName(request.getSchemaName()).build(); return databaseService.createSchema(param); } @@ -178,7 +178,7 @@ public class RdbDdlController { @PostMapping("/modify_schema") public ActionResult modifySchema(@Valid @RequestBody UpdateSchemaRequest request) { SchemaOperationParam param = SchemaOperationParam.builder().databaseName(request.getDatabaseName()) - .schemaName(request.getSchemaName()).newSchemaName(request.getNewSchemaName()).build(); + .schemaName(request.getSchemaName()).newSchemaName(request.getNewSchemaName()).build(); return databaseService.modifySchema(param); } @@ -283,9 +283,9 @@ public class RdbDdlController { @GetMapping("/modify/sql") public ListResult modifySql(@Valid TableModifySqlRequest request) { return tableService.buildSql( - rdbWebConverter.tableRequest2param(request.getOldTable()), - rdbWebConverter.tableRequest2param(request.getNewTable())) - .map(rdbWebConverter::dto2vo); + rdbWebConverter.tableRequest2param(request.getOldTable()), + rdbWebConverter.tableRequest2param(request.getNewTable())) + .map(rdbWebConverter::dto2vo); } /** diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java index 97079b05..2b704487 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java @@ -8,12 +8,9 @@ import ai.chat2db.server.domain.api.param.DropParam; import ai.chat2db.server.domain.api.param.ShowCreateTableParam; import ai.chat2db.server.domain.api.param.TablePageQueryParam; import ai.chat2db.server.domain.api.param.TableQueryParam; -import ai.chat2db.spi.model.ExecuteResult; -import ai.chat2db.spi.model.Schema; -import ai.chat2db.spi.model.Sql; -import ai.chat2db.spi.model.Table; -import ai.chat2db.spi.model.TableColumn; -import ai.chat2db.spi.model.TableIndex; +import ai.chat2db.server.tools.base.wrapper.result.DataResult; +import ai.chat2db.server.web.api.controller.rdb.vo.*; +import ai.chat2db.spi.model.*; import ai.chat2db.server.web.api.controller.rdb.request.DdlCountRequest; import ai.chat2db.server.web.api.controller.rdb.request.DdlExportRequest; import ai.chat2db.server.web.api.controller.rdb.request.DdlRequest; @@ -22,12 +19,6 @@ import ai.chat2db.server.web.api.controller.rdb.request.TableBriefQueryRequest; import ai.chat2db.server.web.api.controller.rdb.request.TableDeleteRequest; import ai.chat2db.server.web.api.controller.rdb.request.TableDetailQueryRequest; import ai.chat2db.server.web.api.controller.rdb.request.TableRequest; -import ai.chat2db.server.web.api.controller.rdb.vo.ColumnVO; -import ai.chat2db.server.web.api.controller.rdb.vo.ExecuteResultVO; -import ai.chat2db.server.web.api.controller.rdb.vo.IndexVO; -import ai.chat2db.server.web.api.controller.rdb.vo.SchemaVO; -import ai.chat2db.server.web.api.controller.rdb.vo.SqlVO; -import ai.chat2db.server.web.api.controller.rdb.vo.TableVO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -199,4 +190,6 @@ public abstract class RdbWebConverter { * @return */ public abstract SchemaVO schemaDto2vo(Schema dto); + + public abstract MetaSchemaVO metaSchemaDto2vo(MetaSchema data); } diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/MetaSchemaVO.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/MetaSchemaVO.java new file mode 100644 index 00000000..59b3b2a3 --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/MetaSchemaVO.java @@ -0,0 +1,19 @@ +package ai.chat2db.server.web.api.controller.rdb.vo; + +import ai.chat2db.spi.model.Database; +import ai.chat2db.spi.model.Schema; +import lombok.Data; + +import java.util.List; +@Data +public class MetaSchemaVO { + /** + * database list + */ + private List databases; + + /** + * schema list + */ + private List schemas; +} diff --git a/chat2db-server/chat2db-spi/pom.xml b/chat2db-server/chat2db-spi/pom.xml index 724e7979..5f13dc85 100644 --- a/chat2db-server/chat2db-spi/pom.xml +++ b/chat2db-server/chat2db-spi/pom.xml @@ -60,5 +60,9 @@ com.baomidou mybatis-plus-boot-starter + + commons-beanutils + commons-beanutils + \ No newline at end of file diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/MetaData.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/MetaData.java index 9bd8b945..7d8ee0fe 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/MetaData.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/MetaData.java @@ -6,12 +6,7 @@ package ai.chat2db.spi; import java.util.List; -import ai.chat2db.spi.model.Function; -import ai.chat2db.spi.model.Procedure; -import ai.chat2db.spi.model.Table; -import ai.chat2db.spi.model.TableColumn; -import ai.chat2db.spi.model.TableIndex; -import ai.chat2db.spi.model.Trigger; +import ai.chat2db.spi.model.*; import jakarta.validation.constraints.NotEmpty; /** @@ -26,7 +21,7 @@ public interface MetaData { * * @return */ - List databases(); + List databases(); /** * Querying all schemas under a database @@ -34,7 +29,7 @@ public interface MetaData { * @param databaseName * @return */ - List schemas(String databaseName); + List schemas(String databaseName); /** * Querying DDL information diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java index 049bac11..b54fe228 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java @@ -4,16 +4,18 @@ */ package ai.chat2db.spi.jdbc; +import java.lang.reflect.InvocationTargetException; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import ai.chat2db.spi.MetaData; -import ai.chat2db.spi.model.Function; -import ai.chat2db.spi.model.Procedure; -import ai.chat2db.spi.model.Table; -import ai.chat2db.spi.model.TableColumn; -import ai.chat2db.spi.model.TableIndex; -import ai.chat2db.spi.model.Trigger; +import ai.chat2db.spi.model.*; import ai.chat2db.spi.sql.SQLExecutor; +import cn.hutool.json.JSON; +import com.google.common.collect.Lists; +import org.apache.commons.beanutils.BeanUtils; +import org.springframework.util.CollectionUtils; /** * @author jipengfei @@ -21,13 +23,32 @@ import ai.chat2db.spi.sql.SQLExecutor; */ public class DefaultMetaService implements MetaData { @Override - public List databases() { - return SQLExecutor.getInstance().databases(); + public List databases() { + List dataBases = SQLExecutor.getInstance().databases(); + if (CollectionUtils.isEmpty(dataBases)) { + return Lists.newArrayList(); + } + return dataBases.stream().map(str -> Database.builder().name(str).build()).collect(Collectors.toList()); + } @Override - public List schemas(String databaseName) { - return SQLExecutor.getInstance().schemas(databaseName, null); + public List schemas(String databaseName) { + List> maps = SQLExecutor.getInstance().schemas(databaseName, null); + if (CollectionUtils.isEmpty(maps)) { + return Lists.newArrayList(); + } + return maps.stream().map(map -> map2Schema(map)).collect(Collectors.toList()); + + } + + private Schema map2Schema(Map map) { + Schema schema = new Schema(); + try { + BeanUtils.populate(schema, map); + } catch (Exception e) { + } + return schema; } @Override @@ -37,12 +58,12 @@ public class DefaultMetaService implements MetaData { @Override public List
tables(String databaseName, String schemaName, String tableName) { - return SQLExecutor.getInstance().tables(databaseName, schemaName, tableName, new String[] {"TABLE"}); + return SQLExecutor.getInstance().tables(databaseName, schemaName, tableName, new String[]{"TABLE"}); } @Override public List views(String databaseName, String schemaName) { - return SQLExecutor.getInstance().tables(databaseName, schemaName, null, new String[] {"VIEW"}); + return SQLExecutor.getInstance().tables(databaseName, schemaName, null, new String[]{"VIEW"}); } @Override @@ -67,7 +88,7 @@ public class DefaultMetaService implements MetaData { @Override public List columns(String databaseName, String schemaName, String tableName, - String columnName) { + String columnName) { return SQLExecutor.getInstance().columns(databaseName, schemaName, tableName, columnName); } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Database.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Database.java index 6ca30064..216ce7b8 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Database.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Database.java @@ -5,6 +5,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.List; + /** * 数据库 * @@ -16,7 +18,12 @@ import lombok.experimental.SuperBuilder; @AllArgsConstructor public class Database { /** - * 数据名字 + * 数据库名字 */ private String name; + + /** + * schema name + */ + private List schemas; } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/MetaSchema.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/MetaSchema.java new file mode 100644 index 00000000..0ac4b706 --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/MetaSchema.java @@ -0,0 +1,25 @@ +package ai.chat2db.spi.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class MetaSchema { + + /** + * database list + */ + private List databases; + + /** + * schema list + */ + private List schemas; +} diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Schema.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Schema.java index 0d0f0e7e..ad61fde5 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Schema.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Schema.java @@ -18,6 +18,11 @@ import lombok.experimental.SuperBuilder; @NoArgsConstructor @AllArgsConstructor public class Schema { + + /** + * databaseName + */ + private String databaseName; /** * 数据名字 */ diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java index 84ef9ac6..ab6906f2 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java @@ -59,6 +59,9 @@ public class Table { */ private String type; - + /** + * 是否置顶 + */ + private boolean pinned; } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java index 672dd846..4e55c1a3 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java @@ -9,7 +9,9 @@ import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -203,13 +205,16 @@ public class SQLExecutor { * @param schemaName * @return */ - public List schemas(String databaseName, String schemaName) { - List schemaList = Lists.newArrayList(); + public List> schemas(String databaseName, String schemaName) { + List> schemaList = Lists.newArrayList(); try { ResultSet resultSet = getConnection().getMetaData().getSchemas(databaseName, schemaName); if (resultSet != null) { while (resultSet.next()) { - schemaList.add(resultSet.getString("TABLE_SCHEM")); + Map map = new HashMap<>(); + map.put("name",resultSet.getString("TABLE_SCHEM")); + map.put("databaseName",resultSet.getString("TABLE_CATALOG")); + schemaList.add(map); } } } catch (SQLException e) { diff --git a/chat2db-server/pom.xml b/chat2db-server/pom.xml index 88c5f7f7..b2b8bee3 100644 --- a/chat2db-server/pom.xml +++ b/chat2db-server/pom.xml @@ -217,6 +217,11 @@ 6.0.10 optional + + commons-beanutils + commons-beanutils + 1.9.4 +