[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 orderCondition;
public boolean isAsc() {
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 org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;
import java.util.List;
import org.springframework.util.CollectionUtils;
@Repository
@Primary
@@ -40,7 +40,6 @@ public class ChatMemoryRepositoryImpl implements ChatMemoryRepository {
}
}
@Override
public ChatMemoryDO getMemory(Long id) {
return chatMemoryMapper.selectById(id);

View File

@@ -1,5 +1,8 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
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.service.MemoryService;
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.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

View File

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

View File

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

View File

@@ -3,34 +3,15 @@ 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 ClickHouseParametersBuilder implements DbParametersBuilder {
public class ClickHouseParametersBuilder extends DefaultParametersBuilder {
@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);
List<DatabaseParameter> databaseParameters = super.build();
DatabaseParameter database = new DatabaseParameter();
database.setComment("数据库名称");
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 org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class H2ParametersBuilder implements DbParametersBuilder {
public class H2ParametersBuilder extends DefaultParametersBuilder {
@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);
List<DatabaseParameter> databaseParameters = super.build();
DatabaseParameter database = new DatabaseParameter();
database.setComment("数据库名称");
database.setName("database");

View File

@@ -8,7 +8,7 @@ import java.util.List;
@Service
@Slf4j
public class OtherParametersBuilder implements DbParametersBuilder {
public class OtherParametersBuilder extends DefaultParametersBuilder {
@Override
public List<DatabaseParameter> build() {
@@ -19,23 +19,7 @@ public class OtherParametersBuilder implements DbParametersBuilder {
databaseTypeName.setPlaceholder("请输入数据库类型名称");
databaseParameters.add(databaseTypeName);
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);
databaseParameters.addAll(super.build());
return databaseParameters;
}
}

View File

@@ -3,33 +3,14 @@ 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 PostgresqlParametersBuilder implements DbParametersBuilder {
public class PostgresqlParametersBuilder extends DefaultParametersBuilder {
@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;
return super.build();
}
}

View File

@@ -1,5 +1,8 @@
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.utils.UserHolder;
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.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@@ -109,7 +110,9 @@ public class DatabaseController {
}
@GetMapping("/getDatabaseParameters")
public Map<String, List<DatabaseParameter>> getDatabaseParameters() {
return databaseService.getDatabaseParameters();
public Map<String, List<DatabaseParameter>> 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);
Map<String, List<DatabaseParameter>> getDatabaseParameters();
Map<String, List<DatabaseParameter>> getDatabaseParameters(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.common.pojo.QueryColumn;
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.SqlExecuteReq;
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.pojo.DatabaseParameter;
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.service.DatabaseService;
import com.tencent.supersonic.headless.server.service.ModelService;
import com.tencent.supersonic.headless.server.utils.DatabaseConverter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -53,6 +57,11 @@ public class DatabaseServiceImpl extends ServiceImpl<DatabaseDOMapper, DatabaseD
@Override
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());
if (databaseDO != null) {
databaseReq.updatedBy(user.getName());
@@ -138,12 +147,38 @@ public class DatabaseServiceImpl extends ServiceImpl<DatabaseDOMapper, DatabaseD
}
@Override
public Map<String, List<DatabaseParameter>> getDatabaseParameters() {
return DbParameterFactory.getMap().entrySet().stream()
.collect(
LinkedHashMap::new,
(map, entry) -> map.put(entry.getKey(), entry.getValue().build()),
LinkedHashMap::putAll);
public Map<String, List<DatabaseParameter>> getDatabaseParameters(User user) {
List<DatabaseResp> databaseList = getDatabaseList(user);
Map<String, DbParametersBuilder> parametersBuilderMap = DbParameterFactory.getMap();
Map<String, List<DatabaseParameter>> result = new LinkedHashMap<>();
// 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) {