Skip to content

Commit 778812e

Browse files
author
Jove Zhong
committed
initial version of timeplus plugin
1 parent a3d0eca commit 778812e

15 files changed

Lines changed: 2487 additions & 260 deletions

File tree

chat2db-client/src/components/ConnectionEdit/config/dataSource.ts

Lines changed: 270 additions & 249 deletions
Large diffs are not rendered by default.

chat2db-client/src/constants/common.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ export enum DatabaseTypeCode {
1010
SQLITE = 'SQLITE',
1111
MARIADB = 'MARIADB',
1212
CLICKHOUSE = 'CLICKHOUSE',
13-
DM = "DM",
14-
OCEANBASE = "OCEANBASE",
15-
PRESTO = "PRESTO",
16-
HIVE = "HIVE",
17-
KINGBASE = "KINGBASE",
13+
DM = 'DM',
14+
OCEANBASE = 'OCEANBASE',
15+
PRESTO = 'PRESTO',
16+
HIVE = 'HIVE',
17+
KINGBASE = 'KINGBASE',
18+
TIMEPLUS = 'TIMEPLUS',
1819
}
1920

2021
export enum ConsoleStatus {
@@ -30,7 +31,7 @@ export enum OSType {
3031

3132
export enum ConnectionKind {
3233
Private = 'PRIVATE',
33-
Shared = 'SHARED'
34+
Shared = 'SHARED',
3435
}
3536

3637
// 通用的增删改查枚举

chat2db-client/src/constants/database.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import redisLogo from '@/assets/img/databaseImg/redis.png';
33
import h2Logo from '@/assets/img/databaseImg/h2.png';
44
import moreDBLogo from '@/assets/img/databaseImg/other.png';
55
import { IDatabase } from '@/typings';
6-
import { DatabaseTypeCode } from '@/constants'
6+
import { DatabaseTypeCode } from '@/constants';
77

88
export enum ConnectionEnvType {
99
DAILY = 'DAILY',
@@ -94,7 +94,7 @@ export const databaseMap: {
9494
name: 'OceanBase',
9595
img: moreDBLogo,
9696
code: DatabaseTypeCode.OCEANBASE,
97-
// port: 2883,
97+
// port: 2883,
9898
icon: '\ue982',
9999
},
100100
[DatabaseTypeCode.HIVE]: {
@@ -118,6 +118,13 @@ export const databaseMap: {
118118
// port: 27017,
119119
icon: '\uec21',
120120
},
121+
[DatabaseTypeCode.TIMEPLUS]: {
122+
name: 'Timeplus',
123+
img: moreDBLogo,
124+
code: DatabaseTypeCode.TIMEPLUS,
125+
// port: 8123,
126+
icon: '\ue8f4',
127+
},
121128
// [DatabaseTypeCode.REDIS]: {
122129
// name: 'Redis',
123130
// img: moreDBLogo,

chat2db-client/src/utils/database.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ export function handleDatabaseAndSchema(databaseAndSchema: IWorkspaceModelType['
4545
* @returns
4646
*/
4747
export function compatibleDataBaseName(databaseName: string, databaseType: DatabaseTypeCode) {
48-
4948
//"" oracele sqlite postgrsql h2 dm
5049
// ` MYSQL clickhouse MariaDB
5150
// [ sqlserver
@@ -63,7 +62,11 @@ export function compatibleDataBaseName(databaseName: string, databaseType: Datab
6362
return `"${databaseName}"`;
6463
} else if ([DatabaseTypeCode.SQLSERVER].includes(databaseType)) {
6564
return `[${databaseName}]`;
66-
} else if ([DatabaseTypeCode.MYSQL, DatabaseTypeCode.CLICKHOUSE, DatabaseTypeCode.MARIADB].includes(databaseType)) {
65+
} else if (
66+
[DatabaseTypeCode.MYSQL, DatabaseTypeCode.CLICKHOUSE, DatabaseTypeCode.TIMEPLUS, DatabaseTypeCode.MARIADB].includes(
67+
databaseType,
68+
)
69+
) {
6770
return `\`${databaseName}\``;
6871
} else {
6972
return `${databaseName}`;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>ai.chat2db</groupId>
8+
<artifactId>chat2db-plugins</artifactId>
9+
<version>${revision}</version>
10+
<relativePath>../pom.xml</relativePath>
11+
</parent>
12+
13+
<dependencies>
14+
<dependency>
15+
<groupId>ai.chat2db</groupId>
16+
<artifactId>chat2db-spi</artifactId>
17+
</dependency>
18+
</dependencies>
19+
<artifactId>chat2db-timeplus</artifactId>
20+
<build>
21+
<resources>
22+
<resource>
23+
<directory>src/main/java</directory>
24+
<includes>
25+
<!--The properties configuration file will be placed together with the compiled class file-->
26+
<include>**/*.json</include>
27+
</includes>
28+
</resource>
29+
<resource>
30+
<directory>src/main/resources</directory>
31+
</resource>
32+
</resources>
33+
</build>
34+
</project>
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package ai.chat2db.plugin.timeplus;
2+
3+
import ai.chat2db.spi.DBManage;
4+
import ai.chat2db.spi.jdbc.DefaultDBManage;
5+
import ai.chat2db.spi.model.AsyncContext;
6+
import ai.chat2db.spi.sql.ConnectInfo;
7+
import ai.chat2db.spi.sql.SQLExecutor;
8+
import java.sql.*;
9+
import java.util.Objects;
10+
import org.apache.commons.lang3.StringUtils;
11+
12+
public class TimeplusDBManage extends DefaultDBManage implements DBManage {
13+
14+
@Override
15+
public void exportDatabase(
16+
Connection connection,
17+
String databaseName,
18+
String schemaName,
19+
AsyncContext asyncContext
20+
) throws SQLException {
21+
exportTablesOrViewsOrDictionaries(
22+
connection,
23+
databaseName,
24+
schemaName,
25+
asyncContext
26+
);
27+
exportFunctions(connection, asyncContext);
28+
}
29+
30+
private void exportFunctions(
31+
Connection connection,
32+
AsyncContext asyncContext
33+
) throws SQLException {
34+
String sql =
35+
"SELECT name,create_query from system.functions where origin='SQLUserDefined'";
36+
try (
37+
ResultSet resultSet = connection.createStatement().executeQuery(sql)
38+
) {
39+
while (resultSet.next()) {
40+
StringBuilder sqlBuilder = new StringBuilder();
41+
sqlBuilder
42+
.append("DROP FUNCTION IF EXISTS ")
43+
.append(resultSet.getString("name"))
44+
.append(";")
45+
.append("\n")
46+
.append(resultSet.getString("create_query"))
47+
.append(";")
48+
.append("\n");
49+
asyncContext.write(sqlBuilder.toString());
50+
}
51+
}
52+
}
53+
54+
private void exportTablesOrViewsOrDictionaries(
55+
Connection connection,
56+
String databaseName,
57+
String schemaName,
58+
AsyncContext asyncContext
59+
) throws SQLException {
60+
String sql = String.format(
61+
"SELECT create_table_query, has_own_data,engine,name from system.`tables` WHERE `database`='%s'",
62+
databaseName
63+
);
64+
try (
65+
Statement statement = connection.createStatement();
66+
ResultSet resultSet = statement.executeQuery(sql)
67+
) {
68+
while (resultSet.next()) {
69+
String ddl = resultSet.getString("create_table_query");
70+
boolean dataFlag = resultSet.getInt("has_own_data") == 1;
71+
String tableType = resultSet.getString("engine");
72+
String tableOrViewName = resultSet.getString("name");
73+
if (Objects.equals("View", tableType)) {
74+
StringBuilder sqlBuilder = new StringBuilder();
75+
sqlBuilder
76+
.append("DROP VIEW IF EXISTS ")
77+
.append(databaseName)
78+
.append(".")
79+
.append(tableOrViewName)
80+
.append(";")
81+
.append("\n")
82+
.append(ddl)
83+
.append(";")
84+
.append("\n");
85+
asyncContext.write(sqlBuilder.toString());
86+
} else if (Objects.equals("Dictionary", tableType)) {
87+
StringBuilder sqlBuilder = new StringBuilder();
88+
sqlBuilder
89+
.append("DROP DICTIONARY IF EXISTS ")
90+
.append(databaseName)
91+
.append(".")
92+
.append(tableOrViewName)
93+
.append(";")
94+
.append("\n")
95+
.append(ddl)
96+
.append(";")
97+
.append("\n");
98+
asyncContext.write(sqlBuilder.toString());
99+
} else {
100+
StringBuilder sqlBuilder = new StringBuilder();
101+
sqlBuilder
102+
.append("DROP STREAM IF EXISTS ")
103+
.append(databaseName)
104+
.append(".")
105+
.append(tableOrViewName)
106+
.append(";")
107+
.append("\n")
108+
.append(ddl)
109+
.append(";")
110+
.append("\n");
111+
asyncContext.write(sqlBuilder.toString());
112+
if (asyncContext.isContainsData() && dataFlag) {
113+
exportTableData(
114+
connection,
115+
databaseName,
116+
schemaName,
117+
tableOrViewName,
118+
asyncContext
119+
);
120+
}
121+
}
122+
}
123+
}
124+
}
125+
126+
@Override
127+
public Connection getConnection(ConnectInfo connectInfo) {
128+
String url = setDatabaseInJdbcUrl(connectInfo);
129+
connectInfo.setUrl(url);
130+
131+
return super.getConnection(connectInfo);
132+
}
133+
134+
private String setDatabaseInJdbcUrl(ConnectInfo connectInfo) {
135+
String databaseName;
136+
String url = connectInfo.getUrl();
137+
if (
138+
StringUtils.isBlank(
139+
(databaseName = connectInfo.getDatabaseName())
140+
) &&
141+
StringUtils.isBlank((databaseName = connectInfo.getSchemaName()))
142+
) {
143+
return url;
144+
}
145+
146+
String connectAddress =
147+
connectInfo.getHost() + ":" + connectInfo.getPort();
148+
String[] addressSplit = url.split(connectAddress);
149+
String connectParams = addressSplit[1];
150+
if (connectParams.startsWith("/")) {
151+
// Remove / from connection parameters
152+
connectParams = connectParams.substring(1);
153+
}
154+
// Add database name
155+
return (
156+
addressSplit[0] +
157+
connectAddress +
158+
"/" +
159+
databaseName +
160+
connectParams
161+
);
162+
}
163+
164+
@Override
165+
public void dropTable(
166+
Connection connection,
167+
String databaseName,
168+
String schemaName,
169+
String tableName
170+
) {
171+
String sql = "DROP STREAM IF EXISTS " + databaseName + "." + tableName;
172+
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
173+
}
174+
175+
@Override
176+
public void copyTable(
177+
Connection connection,
178+
String databaseName,
179+
String schemaName,
180+
String tableName,
181+
String newTableName,
182+
boolean copyData
183+
) throws SQLException {
184+
String sql = "CREATE STREAM " + newTableName + " AS " + tableName + "";
185+
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
186+
if (copyData) {
187+
sql = "INSERT INTO " +
188+
newTableName +
189+
" SELECT * FROM table(" +
190+
tableName +
191+
")";
192+
SQLExecutor.getInstance()
193+
.execute(connection, sql, resultSet -> null);
194+
}
195+
}
196+
}

0 commit comments

Comments
 (0)