提交 1fd0fa65 authored 作者: yanjiantao's avatar yanjiantao

feat: add redshift datasource

上级 b8ab1d74
...@@ -151,6 +151,13 @@ ...@@ -151,6 +151,13 @@
<artifactId>postgresql</artifactId> <artifactId>postgresql</artifactId>
<version>42.2.14</version> <version>42.2.14</version>
</dependency> </dependency>
<!-- redshift jdbc -->
<dependency>
<groupId>com.amazon.redshift</groupId>
<artifactId>redshift-jdbc42</artifactId>
<version>2.1.0.1</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.curator</groupId> <groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId> <artifactId>curator-framework</artifactId>
......
...@@ -6,7 +6,8 @@ public enum DatasourceTypes { ...@@ -6,7 +6,8 @@ public enum DatasourceTypes {
pg("pg", "pg", "org.postgresql.Driver", "\"", "\"", "\"", "\""), pg("pg", "pg", "org.postgresql.Driver", "\"", "\"", "\"", "\""),
sqlServer("sqlServer", "sqlServer", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""), sqlServer("sqlServer", "sqlServer", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""),
doris("doris", "doris", "com.mysql.jdbc.Driver", "`", "`", "", ""), doris("doris", "doris", "com.mysql.jdbc.Driver", "`", "`", "", ""),
oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""); oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""),
redshift("redshift", "redshift", "org.postgresql.Driver", "\"", "\"", "\"", "\"");
private String feature; private String feature;
private String desc; private String desc;
......
package io.dataease.datasource.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class RedshiftConfigration extends JdbcDTO {
private String driver = "com.amazon.redshift.jdbc42.Driver";
public String getJdbc() {
// 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中
return "jdbc:redshift://HOSTNAME:PORT/DATABASE"
.replace("HOSTNAME", getHost().trim())
.replace("PORT", getPort().toString().trim())
.replace("DATABASE", getDataBase().trim());
}
}
\ No newline at end of file
...@@ -436,6 +436,12 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -436,6 +436,12 @@ public class JdbcProvider extends DatasourceProvider {
password = pgConfigration.getPassword(); password = pgConfigration.getPassword();
driver = pgConfigration.getDriver(); driver = pgConfigration.getDriver();
jdbcurl = pgConfigration.getJdbc(); jdbcurl = pgConfigration.getJdbc();
case redshift:
RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class);
username = redshiftConfigration.getUsername();
password = redshiftConfigration.getPassword();
driver = redshiftConfigration.getDriver();
jdbcurl = redshiftConfigration.getJdbc();
default: default:
break; break;
} }
...@@ -493,6 +499,13 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -493,6 +499,13 @@ public class JdbcProvider extends DatasourceProvider {
dataSource.setJdbcUrl(pgConfigration.getJdbc()); dataSource.setJdbcUrl(pgConfigration.getJdbc());
jdbcDTO = pgConfigration; jdbcDTO = pgConfigration;
break; break;
case redshift:
RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class);
dataSource.setUser(redshiftConfigration.getUsername());
dataSource.setDriverClass(redshiftConfigration.getDriver());
dataSource.setPassword(redshiftConfigration.getPassword());
dataSource.setJdbcUrl(redshiftConfigration.getJdbc());
jdbcDTO = redshiftConfigration;
default: default:
break; break;
} }
...@@ -514,6 +527,9 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -514,6 +527,9 @@ public class JdbcProvider extends DatasourceProvider {
case pg: case pg:
PgConfigration pgConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfigration.class); PgConfigration pgConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfigration.class);
return pgConfigration.getDataBase(); return pgConfigration.getDataBase();
case redshift:
RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class);
return redshiftConfigration.getDataBase();
default: default:
return null; return null;
} }
...@@ -546,6 +562,13 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -546,6 +562,13 @@ public class JdbcProvider extends DatasourceProvider {
throw new Exception(Translator.get("i18n_schema_is_empty")); throw new Exception(Translator.get("i18n_schema_is_empty"));
} }
return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", pgConfigration.getSchema()); return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", pgConfigration.getSchema());
case redshift:
RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class);
if(StringUtils.isEmpty(redshiftConfigration.getSchema())){
throw new Exception(Translator.get("i18n_schema_is_empty"));
}
return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", redshiftConfigration.getSchema());
default: default:
return "show tables;"; return "show tables;";
} }
...@@ -560,6 +583,8 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -560,6 +583,8 @@ public class JdbcProvider extends DatasourceProvider {
return "select name from sys.schemas;"; return "select name from sys.schemas;";
case pg: case pg:
return "SELECT nspname FROM pg_namespace;"; return "SELECT nspname FROM pg_namespace;";
case redshift:
return "SELECT nspname FROM pg_namespace;";
default: default:
return "show tables;"; return "show tables;";
} }
......
...@@ -30,6 +30,8 @@ public class ProviderFactory implements ApplicationContextAware { ...@@ -30,6 +30,8 @@ public class ProviderFactory implements ApplicationContextAware {
return context.getBean("jdbc", DatasourceProvider.class); return context.getBean("jdbc", DatasourceProvider.class);
case pg: case pg:
return context.getBean("jdbc", DatasourceProvider.class); return context.getBean("jdbc", DatasourceProvider.class);
case redshift:
return context.getBean("jdbc", DatasourceProvider.class);
default: default:
return context.getBean("jdbc", DatasourceProvider.class); return context.getBean("jdbc", DatasourceProvider.class);
} }
...@@ -48,6 +50,8 @@ public class ProviderFactory implements ApplicationContextAware { ...@@ -48,6 +50,8 @@ public class ProviderFactory implements ApplicationContextAware {
return context.getBean("pgQuery", QueryProvider.class); return context.getBean("pgQuery", QueryProvider.class);
case oracle: case oracle:
return context.getBean("oracleQuery", QueryProvider.class); return context.getBean("oracleQuery", QueryProvider.class);
case redshift:
return context.getBean("redshiftQuery", QueryProvider.class);
default: default:
return context.getBean("mysqlQuery", QueryProvider.class); return context.getBean("mysqlQuery", QueryProvider.class);
} }
......
package io.dataease.provider.redshift;
import io.dataease.provider.SQLConstants;
import static io.dataease.datasource.constants.DatasourceTypes.pg;
/**
* Redshift 静态变量
*
* @className: RedshiftConstants
* @description: Redshift 静态变量
* @author: Jiantao Yan
* @date: 2021/10/11 17:12
**/
public class RedshiftConstants extends SQLConstants {
public static final String KEYWORD_TABLE = pg.getKeywordPrefix() + "%s" + pg.getKeywordSuffix();
public static final String KEYWORD_FIX = "%s." + pg.getKeywordPrefix() + "%s" + pg.getKeywordSuffix();
public static final String UNIX_TIMESTAMP = "floor(extract(epoch from(( %s - timestamp '1970-01-01 00:00:00')*1000))) ";
public static final String DATE_FORMAT = "to_char(%s, %s)";
public static final String FROM_UNIXTIME = "to_timestamp(%s)";
public static final String TO_DATE = "to_date(%s,'%s')";
public static final String CAST = "CAST(%s AS %s)";
public static final String DEFAULT_DATE_FORMAT = "'YYYY-MM-DD HH24:MI:SS'";
public static final String DEFAULT_INT_FORMAT = "numeric(18,0)";
public static final String DEFAULT_FLOAT_FORMAT = "numeric(18,2)";
public static final String WHERE_VALUE_NULL = "(NULL,'')";
public static final String WHERE_VALUE_VALUE = "'%s'";
public static final String AGG_COUNT = "COUNT(*)";
public static final String AGG_FIELD = "%s(%s)";
public static final String WHERE_BETWEEN = "'%s' AND '%s'";
public static final String BRACKETS = "(%s)";
}
...@@ -149,6 +149,8 @@ export default { ...@@ -149,6 +149,8 @@ export default {
return 'Oracle' return 'Oracle'
}else if (type === 'pg') { }else if (type === 'pg') {
return 'PostgreSQL' return 'PostgreSQL'
}else if (type === 'redshift') {
return 'AWS Redshift'
} }
}, },
......
...@@ -45,13 +45,13 @@ ...@@ -45,13 +45,13 @@
<el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.port')" prop="configuration.port"> <el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.port')" prop="configuration.port">
<el-input v-model="form.configuration.port" autocomplete="off" /> <el-input v-model="form.configuration.port" autocomplete="off" />
</el-form-item> </el-form-item>
<el-form-item v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg'"> <el-form-item v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift'">
<el-button icon="el-icon-plus" size="mini" @click="getSchema()"> <el-button icon="el-icon-plus" size="mini" @click="getSchema()">
{{ $t('datasource.get_schema') }} {{ $t('datasource.get_schema') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg'" :label="$t('datasource.schema')"> <el-form-item v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift'" :label="$t('datasource.schema')">
<el-select filterable v-model="form.configuration.schema" :placeholder="$t('datasource.please_choose_schema')" class="select-width"> <el-select filterable v-model="form.configuration.schema" :placeholder="$t('datasource.please_choose_schema')" class="select-width">
<el-option <el-option
v-for="item in schemas" v-for="item in schemas"
...@@ -146,7 +146,8 @@ export default { ...@@ -146,7 +146,8 @@ export default {
allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' }, allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' },
{ name: 'oracle', label: 'Oracle', type: 'jdbc' }, { name: 'oracle', label: 'Oracle', type: 'jdbc' },
{ name: 'sqlServer', label: 'SQL Server', type: 'jdbc' }, { name: 'sqlServer', label: 'SQL Server', type: 'jdbc' },
{ name: 'pg', label: 'PostgreSQL', type: 'jdbc' }], { name: 'pg', label: 'PostgreSQL', type: 'jdbc' },
{ name: 'redshift', label: 'AWS Redshift', type: 'jdbc' }],
schemas: [], schemas: [],
canEdit: false, canEdit: false,
originConfiguration: {} originConfiguration: {}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论