[improvement][headless] Backend uniformly supports other types of databases. (#1745)

This commit is contained in:
lexluo09
2024-09-30 15:02:58 +08:00
committed by GitHub
parent 2e45dcfd10
commit de2385cd2c
13 changed files with 102 additions and 98 deletions

View File

@@ -29,8 +29,8 @@ public class ChatMemoryFilter {
private String sort = "desc"; private String sort = "desc";
private String orderCondition; private String orderCondition;
public boolean isAsc() { public boolean isAsc() {
return "asc".equalsIgnoreCase(sort); return "asc".equalsIgnoreCase(sort);
} }
} }

View File

@@ -6,9 +6,9 @@ import com.tencent.supersonic.chat.server.persistence.mapper.ChatMemoryMapper;
import com.tencent.supersonic.chat.server.persistence.repository.ChatMemoryRepository; import com.tencent.supersonic.chat.server.persistence.repository.ChatMemoryRepository;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;
import java.util.List; import java.util.List;
import org.springframework.util.CollectionUtils;
@Repository @Repository
@Primary @Primary
@@ -40,7 +40,6 @@ public class ChatMemoryRepositoryImpl implements ChatMemoryRepository {
} }
} }
@Override @Override
public ChatMemoryDO getMemory(Long id) { public ChatMemoryDO getMemory(Long id) {
return chatMemoryMapper.selectById(id); return chatMemoryMapper.selectById(id);

View File

@@ -1,5 +1,8 @@
package com.tencent.supersonic.chat.server.rest; package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
@@ -8,8 +11,6 @@ import com.tencent.supersonic.chat.api.pojo.request.PageMemoryReq;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatMemoryDO; import com.tencent.supersonic.chat.server.persistence.dataobject.ChatMemoryDO;
import com.tencent.supersonic.chat.server.service.MemoryService; import com.tencent.supersonic.chat.server.service.MemoryService;
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;

View File

@@ -97,7 +97,8 @@ public class MemoryServiceImpl implements MemoryService {
if (StringUtils.isBlank(chatMemoryFilter.getOrderCondition())) { if (StringUtils.isBlank(chatMemoryFilter.getOrderCondition())) {
queryWrapper.orderByDesc("id"); queryWrapper.orderByDesc("id");
} else { } else {
queryWrapper.orderBy(true, chatMemoryFilter.isAsc(), chatMemoryFilter.getOrderCondition()); queryWrapper.orderBy(
true, chatMemoryFilter.isAsc(), chatMemoryFilter.getOrderCondition());
} }
return chatMemoryRepository.getMemories(queryWrapper); return chatMemoryRepository.getMemories(queryWrapper);
} }

View File

@@ -25,6 +25,8 @@ public class DatabaseReq extends RecordInfo {
private String database; private String database;
private String databaseType;
private String version; private String version;
private String description; private String description;

View File

@@ -3,34 +3,15 @@ package com.tencent.supersonic.headless.server.pojo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class ClickHouseParametersBuilder implements DbParametersBuilder { public class ClickHouseParametersBuilder extends DefaultParametersBuilder {
@Override @Override
public List<DatabaseParameter> build() { public List<DatabaseParameter> build() {
List<DatabaseParameter> databaseParameters = new ArrayList<>(); List<DatabaseParameter> databaseParameters = super.build();
DatabaseParameter host = new DatabaseParameter();
host.setComment("链接");
host.setName("url");
host.setPlaceholder("请输入链接");
databaseParameters.add(host);
DatabaseParameter userName = new DatabaseParameter();
userName.setComment("用户名");
userName.setName("username");
userName.setPlaceholder("请输入用户名");
databaseParameters.add(userName);
DatabaseParameter password = new DatabaseParameter();
password.setComment("密码");
password.setName("password");
password.setPlaceholder("请输入密码");
databaseParameters.add(password);
DatabaseParameter database = new DatabaseParameter(); DatabaseParameter database = new DatabaseParameter();
database.setComment("数据库名称"); database.setComment("数据库名称");
database.setName("database"); database.setName("database");

View File

@@ -0,0 +1,36 @@
package com.tencent.supersonic.headless.server.pojo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class DefaultParametersBuilder implements DbParametersBuilder {
@Override
public List<DatabaseParameter> build() {
List<DatabaseParameter> databaseParameters = new ArrayList<>();
DatabaseParameter host = new DatabaseParameter();
host.setComment("链接");
host.setName("url");
host.setPlaceholder("请输入链接");
databaseParameters.add(host);
DatabaseParameter userName = new DatabaseParameter();
userName.setComment("用户名");
userName.setName("username");
userName.setPlaceholder("请输入用户名");
databaseParameters.add(userName);
DatabaseParameter password = new DatabaseParameter();
password.setComment("密码");
password.setName("password");
password.setPlaceholder("请输入密码");
databaseParameters.add(password);
return databaseParameters;
}
}

View File

@@ -3,34 +3,15 @@ package com.tencent.supersonic.headless.server.pojo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class H2ParametersBuilder implements DbParametersBuilder { public class H2ParametersBuilder extends DefaultParametersBuilder {
@Override @Override
public List<DatabaseParameter> build() { public List<DatabaseParameter> build() {
List<DatabaseParameter> databaseParameters = new ArrayList<>(); List<DatabaseParameter> databaseParameters = super.build();
DatabaseParameter host = new DatabaseParameter();
host.setComment("链接");
host.setName("url");
host.setPlaceholder("请输入链接");
databaseParameters.add(host);
DatabaseParameter userName = new DatabaseParameter();
userName.setComment("用户名");
userName.setName("username");
userName.setPlaceholder("请输入用户名");
databaseParameters.add(userName);
DatabaseParameter password = new DatabaseParameter();
password.setComment("密码");
password.setName("password");
password.setPlaceholder("请输入密码");
databaseParameters.add(password);
DatabaseParameter database = new DatabaseParameter(); DatabaseParameter database = new DatabaseParameter();
database.setComment("数据库名称"); database.setComment("数据库名称");
database.setName("database"); database.setName("database");

View File

@@ -8,7 +8,7 @@ import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class OtherParametersBuilder implements DbParametersBuilder { public class OtherParametersBuilder extends DefaultParametersBuilder {
@Override @Override
public List<DatabaseParameter> build() { public List<DatabaseParameter> build() {
@@ -19,23 +19,7 @@ public class OtherParametersBuilder implements DbParametersBuilder {
databaseTypeName.setPlaceholder("请输入数据库类型名称"); databaseTypeName.setPlaceholder("请输入数据库类型名称");
databaseParameters.add(databaseTypeName); databaseParameters.add(databaseTypeName);
DatabaseParameter host = new DatabaseParameter(); databaseParameters.addAll(super.build());
host.setComment("链接");
host.setName("url");
host.setPlaceholder("请输入链接");
databaseParameters.add(host);
DatabaseParameter userName = new DatabaseParameter();
userName.setComment("用户名");
userName.setName("username");
userName.setPlaceholder("请输入用户名");
databaseParameters.add(userName);
DatabaseParameter password = new DatabaseParameter();
password.setComment("密码");
password.setName("password");
password.setPlaceholder("请输入密码");
databaseParameters.add(password);
return databaseParameters; return databaseParameters;
} }
} }

View File

@@ -3,33 +3,14 @@ package com.tencent.supersonic.headless.server.pojo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class PostgresqlParametersBuilder implements DbParametersBuilder { public class PostgresqlParametersBuilder extends DefaultParametersBuilder {
@Override @Override
public List<DatabaseParameter> build() { public List<DatabaseParameter> build() {
List<DatabaseParameter> databaseParameters = new ArrayList<>(); return super.build();
DatabaseParameter host = new DatabaseParameter();
host.setComment("链接");
host.setName("url");
host.setPlaceholder("请输入链接");
databaseParameters.add(host);
DatabaseParameter userName = new DatabaseParameter();
userName.setComment("用户名");
userName.setName("username");
userName.setPlaceholder("请输入用户名");
databaseParameters.add(userName);
DatabaseParameter password = new DatabaseParameter();
password.setComment("密码");
password.setName("password");
password.setPlaceholder("请输入密码");
databaseParameters.add(password);
return databaseParameters;
} }
} }

View File

@@ -1,5 +1,8 @@
package com.tencent.supersonic.headless.server.rest; package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.headless.api.pojo.DBColumn; import com.tencent.supersonic.headless.api.pojo.DBColumn;
@@ -19,8 +22,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -109,7 +110,9 @@ public class DatabaseController {
} }
@GetMapping("/getDatabaseParameters") @GetMapping("/getDatabaseParameters")
public Map<String, List<DatabaseParameter>> getDatabaseParameters() { public Map<String, List<DatabaseParameter>> getDatabaseParameters(
return databaseService.getDatabaseParameters(); HttpServletRequest request, HttpServletResponse response) {
User user = UserHolder.findUser(request, response);
return databaseService.getDatabaseParameters(user);
} }
} }

View File

@@ -22,7 +22,7 @@ public interface DatabaseService {
DatabaseResp getDatabase(Long id); DatabaseResp getDatabase(Long id);
Map<String, List<DatabaseParameter>> getDatabaseParameters(); Map<String, List<DatabaseParameter>> getDatabaseParameters(User user);
boolean testConnect(DatabaseReq databaseReq, User user); boolean testConnect(DatabaseReq databaseReq, User user);

View File

@@ -5,6 +5,7 @@ import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.common.pojo.QueryColumn;
import com.tencent.supersonic.headless.api.pojo.DBColumn; import com.tencent.supersonic.headless.api.pojo.DBColumn;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq; import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq;
import com.tencent.supersonic.headless.api.pojo.request.SqlExecuteReq; import com.tencent.supersonic.headless.api.pojo.request.SqlExecuteReq;
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp; import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
@@ -20,11 +21,14 @@ import com.tencent.supersonic.headless.server.persistence.dataobject.DatabaseDO;
import com.tencent.supersonic.headless.server.persistence.mapper.DatabaseDOMapper; import com.tencent.supersonic.headless.server.persistence.mapper.DatabaseDOMapper;
import com.tencent.supersonic.headless.server.pojo.DatabaseParameter; import com.tencent.supersonic.headless.server.pojo.DatabaseParameter;
import com.tencent.supersonic.headless.server.pojo.DbParameterFactory; import com.tencent.supersonic.headless.server.pojo.DbParameterFactory;
import com.tencent.supersonic.headless.server.pojo.DbParametersBuilder;
import com.tencent.supersonic.headless.server.pojo.DefaultParametersBuilder;
import com.tencent.supersonic.headless.server.pojo.ModelFilter; import com.tencent.supersonic.headless.server.pojo.ModelFilter;
import com.tencent.supersonic.headless.server.service.DatabaseService; import com.tencent.supersonic.headless.server.service.DatabaseService;
import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.service.ModelService;
import com.tencent.supersonic.headless.server.utils.DatabaseConverter; import com.tencent.supersonic.headless.server.utils.DatabaseConverter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -53,6 +57,11 @@ public class DatabaseServiceImpl extends ServiceImpl<DatabaseDOMapper, DatabaseD
@Override @Override
public DatabaseResp createOrUpdateDatabase(DatabaseReq databaseReq, User user) { public DatabaseResp createOrUpdateDatabase(DatabaseReq databaseReq, User user) {
if (StringUtils.isNotBlank(databaseReq.getDatabaseType())
&& EngineType.OTHER.getName().equalsIgnoreCase(databaseReq.getType())) {
databaseReq.setType(databaseReq.getDatabaseType());
}
DatabaseDO databaseDO = getDatabaseDO(databaseReq.getId()); DatabaseDO databaseDO = getDatabaseDO(databaseReq.getId());
if (databaseDO != null) { if (databaseDO != null) {
databaseReq.updatedBy(user.getName()); databaseReq.updatedBy(user.getName());
@@ -138,12 +147,38 @@ public class DatabaseServiceImpl extends ServiceImpl<DatabaseDOMapper, DatabaseD
} }
@Override @Override
public Map<String, List<DatabaseParameter>> getDatabaseParameters() { public Map<String, List<DatabaseParameter>> getDatabaseParameters(User user) {
return DbParameterFactory.getMap().entrySet().stream() List<DatabaseResp> databaseList = getDatabaseList(user);
.collect(
LinkedHashMap::new, Map<String, DbParametersBuilder> parametersBuilderMap = DbParameterFactory.getMap();
(map, entry) -> map.put(entry.getKey(), entry.getValue().build()), Map<String, List<DatabaseParameter>> result = new LinkedHashMap<>();
LinkedHashMap::putAll);
// Add all known database parameters
for (Map.Entry<String, DbParametersBuilder> entry : parametersBuilderMap.entrySet()) {
if (!entry.getKey().equals(EngineType.OTHER.getName())) {
result.put(entry.getKey(), entry.getValue().build());
}
}
// Add default parameters for unknown databases
if (!CollectionUtils.isEmpty(databaseList)) {
List<String> databaseTypeList =
databaseList.stream()
.map(databaseResp -> databaseResp.getType())
.collect(Collectors.toList());
DefaultParametersBuilder defaultParametersBuilder = new DefaultParametersBuilder();
for (String dbType : databaseTypeList) {
if (!parametersBuilderMap.containsKey(dbType)) {
result.put(dbType, defaultParametersBuilder.build());
}
}
}
// Add the OTHER type at the end
if (parametersBuilderMap.containsKey(EngineType.OTHER.getName())) {
result.put(
EngineType.OTHER.getName(),
parametersBuilderMap.get(EngineType.OTHER.getName()).build());
}
return result;
} }
private SemanticQueryResp queryWithColumns(String sql, Database database) { private SemanticQueryResp queryWithColumns(String sql, Database database) {