mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 22:08:56 +00:00
(improvement)(chat) Extend support for PostgreSQL data source. (#635)
This commit is contained in:
@@ -110,6 +110,11 @@
|
||||
<artifactId>easyexcel</artifactId>
|
||||
<version>${easyexcel.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>${postgresql.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -120,7 +120,7 @@ public class HeadlessSchemaManager {
|
||||
|
||||
public static DataSource getDatasource(final DataModelYamlTpl d) {
|
||||
DataSource datasource = DataSource.builder().id(d.getId()).sourceId(d.getSourceId())
|
||||
.sqlQuery(d.getSqlQuery()).name(d.getName()).tableQuery(d.getTableQuery())
|
||||
.type(d.getType()).sqlQuery(d.getSqlQuery()).name(d.getName()).tableQuery(d.getTableQuery())
|
||||
.identifiers(getIdentify(d.getIdentifiers())).measures(getMeasures(d.getMeasures()))
|
||||
.dimensions(getDimensions(d.getDimensions())).build();
|
||||
datasource.setAggTime(getDataSourceAggTime(datasource.getDimensions()));
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class ClickHouseParametersBuilder implements DbParametersBuilder {
|
||||
|
||||
@Override
|
||||
public List<DatabaseParameter> build() {
|
||||
List<DatabaseParameter> databaseParameters = new ArrayList<>();
|
||||
DatabaseParameter host = new DatabaseParameter();
|
||||
host.setName("host");
|
||||
host.setEnName("host");
|
||||
host.setComment("请输入host");
|
||||
databaseParameters.add(host);
|
||||
|
||||
DatabaseParameter port = new DatabaseParameter();
|
||||
port.setName("port");
|
||||
port.setEnName("port");
|
||||
port.setComment("请输入端口号");
|
||||
databaseParameters.add(port);
|
||||
|
||||
DatabaseParameter userName = new DatabaseParameter();
|
||||
userName.setName("用户名");
|
||||
userName.setEnName("username");
|
||||
databaseParameters.add(userName);
|
||||
|
||||
DatabaseParameter password = new DatabaseParameter();
|
||||
password.setName("密码");
|
||||
password.setEnName("password");
|
||||
databaseParameters.add(password);
|
||||
|
||||
DatabaseParameter database = new DatabaseParameter();
|
||||
database.setName("数据库名称");
|
||||
database.setEnName("database");
|
||||
databaseParameters.add(database);
|
||||
return databaseParameters;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class DatabaseParameter {
|
||||
|
||||
private String name;
|
||||
private String enName;
|
||||
private String comment;
|
||||
private String defaultValue;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
import com.tencent.supersonic.headless.api.enums.EngineType;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public class DbParameterFactory {
|
||||
|
||||
private static Map<String, DbParametersBuilder> parametersBuilder;
|
||||
|
||||
static {
|
||||
parametersBuilder = new LinkedHashMap<>();
|
||||
parametersBuilder.put(EngineType.H2.getName(), new H2ParametersBuilder());
|
||||
parametersBuilder.put(EngineType.CLICKHOUSE.getName(), new ClickHouseParametersBuilder());
|
||||
parametersBuilder.put(EngineType.MYSQL.getName(), new MysqlParametersBuilder());
|
||||
parametersBuilder.put(EngineType.POSTGRESQL.getName(), new PostgresqlParametersBuilder());
|
||||
}
|
||||
|
||||
public static DbParametersBuilder get(String engineType) {
|
||||
return parametersBuilder.get(engineType);
|
||||
}
|
||||
|
||||
public static Map<String, DbParametersBuilder> getMap() {
|
||||
return parametersBuilder;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface DbParametersBuilder {
|
||||
|
||||
List<DatabaseParameter> build();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class H2ParametersBuilder implements DbParametersBuilder {
|
||||
|
||||
@Override
|
||||
public List<DatabaseParameter> build() {
|
||||
List<DatabaseParameter> databaseParameters = new ArrayList<>();
|
||||
DatabaseParameter host = new DatabaseParameter();
|
||||
host.setName("链接");
|
||||
host.setEnName("url");
|
||||
host.setComment("请输入链接");
|
||||
databaseParameters.add(host);
|
||||
|
||||
DatabaseParameter port = new DatabaseParameter();
|
||||
port.setName("port");
|
||||
port.setEnName("port");
|
||||
port.setComment("请输入端口号");
|
||||
databaseParameters.add(port);
|
||||
|
||||
DatabaseParameter userName = new DatabaseParameter();
|
||||
userName.setName("用户名");
|
||||
userName.setEnName("username");
|
||||
databaseParameters.add(userName);
|
||||
|
||||
DatabaseParameter password = new DatabaseParameter();
|
||||
password.setName("密码");
|
||||
password.setEnName("password");
|
||||
databaseParameters.add(password);
|
||||
|
||||
DatabaseParameter database = new DatabaseParameter();
|
||||
database.setName("数据库名称");
|
||||
database.setEnName("database");
|
||||
databaseParameters.add(database);
|
||||
return databaseParameters;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class MysqlParametersBuilder implements DbParametersBuilder {
|
||||
|
||||
@Override
|
||||
public List<DatabaseParameter> build() {
|
||||
List<DatabaseParameter> databaseParameters = new ArrayList<>();
|
||||
DatabaseParameter host = new DatabaseParameter();
|
||||
host.setName("host");
|
||||
host.setEnName("host");
|
||||
host.setComment("请输入host");
|
||||
databaseParameters.add(host);
|
||||
|
||||
DatabaseParameter port = new DatabaseParameter();
|
||||
port.setName("port");
|
||||
port.setEnName("port");
|
||||
port.setComment("请输入端口号");
|
||||
databaseParameters.add(port);
|
||||
|
||||
DatabaseParameter version = new DatabaseParameter();
|
||||
version.setName("数据库版本");
|
||||
version.setEnName("version");
|
||||
version.setComment("请输入数据库版本");
|
||||
databaseParameters.add(version);
|
||||
|
||||
DatabaseParameter userName = new DatabaseParameter();
|
||||
userName.setName("用户名");
|
||||
userName.setEnName("username");
|
||||
databaseParameters.add(userName);
|
||||
|
||||
DatabaseParameter password = new DatabaseParameter();
|
||||
password.setName("密码");
|
||||
password.setEnName("password");
|
||||
databaseParameters.add(password);
|
||||
|
||||
DatabaseParameter database = new DatabaseParameter();
|
||||
database.setName("数据库名称");
|
||||
database.setEnName("database");
|
||||
databaseParameters.add(database);
|
||||
return databaseParameters;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.tencent.supersonic.headless.server.pojo;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class PostgresqlParametersBuilder implements DbParametersBuilder {
|
||||
|
||||
@Override
|
||||
public List<DatabaseParameter> build() {
|
||||
List<DatabaseParameter> databaseParameters = new ArrayList<>();
|
||||
DatabaseParameter host = new DatabaseParameter();
|
||||
host.setName("host");
|
||||
host.setEnName("host");
|
||||
host.setComment("请输入host");
|
||||
databaseParameters.add(host);
|
||||
|
||||
DatabaseParameter port = new DatabaseParameter();
|
||||
port.setName("port");
|
||||
port.setEnName("port");
|
||||
port.setComment("请输入端口号");
|
||||
databaseParameters.add(port);
|
||||
|
||||
DatabaseParameter userName = new DatabaseParameter();
|
||||
userName.setName("用户名");
|
||||
userName.setEnName("username");
|
||||
databaseParameters.add(userName);
|
||||
|
||||
DatabaseParameter password = new DatabaseParameter();
|
||||
password.setName("密码");
|
||||
password.setEnName("password");
|
||||
databaseParameters.add(password);
|
||||
|
||||
DatabaseParameter schema = new DatabaseParameter();
|
||||
schema.setName("schema");
|
||||
schema.setEnName("schema");
|
||||
schema.setDefaultValue("public");
|
||||
databaseParameters.add(schema);
|
||||
|
||||
DatabaseParameter database = new DatabaseParameter();
|
||||
database.setName("数据库名称");
|
||||
database.setEnName("database");
|
||||
databaseParameters.add(database);
|
||||
return databaseParameters;
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,9 @@ import com.tencent.supersonic.headless.api.request.DatabaseReq;
|
||||
import com.tencent.supersonic.headless.api.request.SqlExecuteReq;
|
||||
import com.tencent.supersonic.headless.api.response.DatabaseResp;
|
||||
import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp;
|
||||
import com.tencent.supersonic.headless.server.pojo.DatabaseParameter;
|
||||
import com.tencent.supersonic.headless.server.service.DatabaseService;
|
||||
import java.util.Map;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
@@ -53,7 +55,7 @@ public class DatabaseController {
|
||||
|
||||
@GetMapping("/getDatabaseList")
|
||||
public List<DatabaseResp> getDatabaseList(HttpServletRequest request,
|
||||
HttpServletResponse response) {
|
||||
HttpServletResponse response) {
|
||||
User user = UserHolder.findUser(request, response);
|
||||
return databaseService.getDatabaseList(user);
|
||||
}
|
||||
@@ -66,8 +68,8 @@ public class DatabaseController {
|
||||
|
||||
@PostMapping("/executeSql")
|
||||
public QueryResultWithSchemaResp executeSql(@RequestBody SqlExecuteReq sqlExecuteReq,
|
||||
HttpServletRequest request,
|
||||
HttpServletResponse response) {
|
||||
HttpServletRequest request,
|
||||
HttpServletResponse response) {
|
||||
User user = UserHolder.findUser(request, response);
|
||||
return databaseService.executeSql(sqlExecuteReq.getSql(), sqlExecuteReq.getId(), user);
|
||||
}
|
||||
@@ -90,4 +92,10 @@ public class DatabaseController {
|
||||
return databaseService.getColumns(id, db, table);
|
||||
}
|
||||
|
||||
@GetMapping("/getDatabaseParameters")
|
||||
public Map<String, List<DatabaseParameter>> getDatabaseParameters(HttpServletRequest request,
|
||||
HttpServletResponse response) {
|
||||
return databaseService.getDatabaseParameters();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,8 +4,9 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
||||
import com.tencent.supersonic.headless.api.request.DatabaseReq;
|
||||
import com.tencent.supersonic.headless.api.response.DatabaseResp;
|
||||
import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp;
|
||||
|
||||
import com.tencent.supersonic.headless.server.pojo.DatabaseParameter;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public interface DatabaseService {
|
||||
@@ -14,6 +15,8 @@ public interface DatabaseService {
|
||||
|
||||
QueryResultWithSchemaResp executeSql(String sql, Long id, User user);
|
||||
|
||||
Map<String, List<DatabaseParameter>> getDatabaseParameters();
|
||||
|
||||
boolean testConnect(DatabaseReq databaseReq, User user);
|
||||
|
||||
DatabaseResp createOrUpdateDatabase(DatabaseReq databaseReq, User user);
|
||||
|
||||
@@ -7,23 +7,26 @@ import com.tencent.supersonic.headless.api.response.ModelResp;
|
||||
import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp;
|
||||
import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptor;
|
||||
import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptorFactory;
|
||||
import com.tencent.supersonic.headless.core.pojo.Database;
|
||||
import com.tencent.supersonic.headless.core.utils.JdbcDataSourceUtils;
|
||||
import com.tencent.supersonic.headless.core.utils.SqlUtils;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.DatabaseDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.repository.DatabaseRepository;
|
||||
import com.tencent.supersonic.headless.core.pojo.Database;
|
||||
import com.tencent.supersonic.headless.server.pojo.DatabaseParameter;
|
||||
import com.tencent.supersonic.headless.server.pojo.DbParameterFactory;
|
||||
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 com.tencent.supersonic.headless.core.utils.JdbcDataSourceUtils;
|
||||
import com.tencent.supersonic.headless.core.utils.SqlUtils;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@@ -34,8 +37,8 @@ public class DatabaseServiceImpl implements DatabaseService {
|
||||
private ModelService datasourceService;
|
||||
|
||||
public DatabaseServiceImpl(DatabaseRepository databaseRepository,
|
||||
SqlUtils sqlUtils,
|
||||
@Lazy ModelService datasourceService) {
|
||||
SqlUtils sqlUtils,
|
||||
@Lazy ModelService datasourceService) {
|
||||
this.databaseRepository = databaseRepository;
|
||||
this.sqlUtils = sqlUtils;
|
||||
this.datasourceService = datasourceService;
|
||||
@@ -67,8 +70,8 @@ public class DatabaseServiceImpl implements DatabaseService {
|
||||
public List<DatabaseResp> getDatabaseList(User user) {
|
||||
List<DatabaseResp> databaseResps =
|
||||
databaseRepository.getDatabaseList()
|
||||
.stream().map(DatabaseConverter::convert)
|
||||
.collect(Collectors.toList());
|
||||
.stream().map(DatabaseConverter::convert)
|
||||
.collect(Collectors.toList());
|
||||
fillPermission(databaseResps, user);
|
||||
return databaseResps;
|
||||
}
|
||||
@@ -133,6 +136,13 @@ public class DatabaseServiceImpl implements DatabaseService {
|
||||
return queryWithColumns(sql, databaseResp);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
private QueryResultWithSchemaResp queryWithColumns(String sql, DatabaseResp databaseResp) {
|
||||
QueryResultWithSchemaResp queryResultWithColumns = new QueryResultWithSchemaResp();
|
||||
SqlUtils sqlUtils = this.sqlUtils.init(databaseResp);
|
||||
|
||||
Reference in New Issue
Block a user