Supports fuzzy query of table names, not case sensitive.

Automatically add pagination parameters when users query SQL without pagination parameters.
Sort the database schema and prioritize the user-defined ones.
This commit is contained in:
SwallowGG
2023-10-22 22:46:26 +08:00
parent c0161df83b
commit 51a35f770e
28 changed files with 539 additions and 129 deletions

View File

@ -2,12 +2,26 @@ package ai.chat2db.plugin.db2;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import ai.chat2db.plugin.db2.builder.DB2SqlBuilder;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.jdbc.DefaultSqlBuilder;
import ai.chat2db.spi.model.Schema;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SortUtils;
public class DB2MetaData extends DefaultMetaService implements MetaData {
private List<String> systemSchemas = Arrays.asList("NULLID","SQLJ","SYSCAT","SYSFUN","SYSIBM","SYSIBMADM","SYSIBMINTERNAL","SYSIBMTS","SYSPROC","SYSPUBLIC","SYSSTAT","SYSTOOLS");
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
List<Schema> schemas = SQLExecutor.getInstance().schemas(connection, databaseName, null);
return SortUtils.sortSchema(schemas, systemSchemas);
}
private String functionSQL
= "CREATE FUNCTION tableSchema.ufn_GetCreateTableScript( @schema_name NVARCHAR(128), @table_name NVARCHAR"
+ "(128)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @CreateTableScript NVARCHAR(MAX); DECLARE @IndexScripts "
@ -40,7 +54,6 @@ public class DB2MetaData extends DefaultMetaService implements MetaData {
@Override
public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) {
try {
System.out.println(functionSQL);
SQLExecutor.getInstance().executeSql(connection, functionSQL.replace("tableSchema", schemaName), resultSet -> null);
} catch (Exception e) {
//log.error("创建函数失败", e);
@ -59,6 +72,9 @@ public class DB2MetaData extends DefaultMetaService implements MetaData {
return null;
});
}
@Override
public SqlBuilder getSqlBuilder() {
return new DB2SqlBuilder();
}
}

View File

@ -0,0 +1,23 @@
package ai.chat2db.plugin.db2.builder;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultSqlBuilder;
public class DB2SqlBuilder extends DefaultSqlBuilder {
@Override
public String pageLimit(String sql, int offset, int pageNo, int pageSize) {
int startRow = offset + 1;
int endRow = offset+ pageSize;
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 120);
sqlBuilder.append("SELECT * FROM (SELECT TMP_PAGE.*,ROWNUMBER() OVER() AS PAGEHELPER_ROW_ID FROM ( \n");
sqlBuilder.append(sql);
sqlBuilder.append("\n ) AS TMP_PAGE) TMP_PAGE WHERE PAGEHELPER_ROW_ID BETWEEN ");
sqlBuilder.append(startRow);
sqlBuilder.append(" AND ");
sqlBuilder.append(endRow);
return sqlBuilder.toString();
}
}

View File

@ -3,19 +3,26 @@ package ai.chat2db.plugin.dm;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.Function;
import ai.chat2db.spi.model.Procedure;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.Trigger;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SortUtils;
import ai.chat2db.spi.util.SqlUtils;
import jakarta.validation.constraints.NotEmpty;
public class DMMetaData extends DefaultMetaService implements MetaData {
private List<String> systemSchemas = Arrays.asList("CTISYS", "SYS","SYSDBA","SYSSSO","SYSAUDITOR");
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
List<Schema> schemas = SQLExecutor.getInstance().schemas(connection, databaseName, null);
return SortUtils.sortSchema(schemas, systemSchemas);
}
public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) {
String selectObjectDDLSQL = String.format(
"select dbms_metadata.get_ddl(%s, %s, %s) AS \"sql\" from dual",

View File

@ -3,21 +3,24 @@ package ai.chat2db.plugin.h2;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.Function;
import ai.chat2db.spi.model.Procedure;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.Trigger;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SortUtils;
import jakarta.validation.constraints.NotEmpty;
public class H2Meta extends DefaultMetaService implements MetaData {
private List<String> systemSchemas = Arrays.asList("INFORMATION_SCHEMA");
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
List<Schema> schemas = SQLExecutor.getInstance().schemas(connection, databaseName, null);
return SortUtils.sortSchema(schemas, systemSchemas);
}
@Override
public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName,
@NotEmpty String tableName) {
@ -69,19 +72,13 @@ public class H2Meta extends DefaultMetaService implements MetaData {
createTableDDL.append(tableName).append(" (\n");
createTableDDL.append(String.join(",\n", columnDefinitions));
createTableDDL.append("\n);\n");
System.out.println("DDL建表语句");
System.out.println(createTableDDL.toString());
// 输出索引信息
System.out.println("\nDDL索引语句");
for (Map.Entry<String, List<String>> entry : indexMap.entrySet()) {
String indexName = entry.getKey();
List<String> columnList = entry.getValue();
String indexColumns = String.join(", ", columnList);
String createIndexDDL = String.format("CREATE INDEX %s ON %s (%s);", indexName, tableName,
indexColumns);
System.out.println(createIndexDDL);
createTableDDL.append(createIndexDDL);
}
return createTableDDL.toString();

View File

@ -5,6 +5,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import ai.chat2db.plugin.mysql.builder.MysqlSqlBuilder;
import ai.chat2db.plugin.mysql.type.MysqlCharsetEnum;
@ -17,9 +18,21 @@ import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import jakarta.validation.constraints.NotEmpty;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import static ai.chat2db.spi.util.SortUtils.sortDatabase;
public class MysqlMetaData extends DefaultMetaService implements MetaData {
private List<String> systemDatabases = Arrays.asList("information_schema", "performance_schema", "mysql", "sys");
@Override
public List<Database> databases(Connection connection) {
List<Database> databases = SQLExecutor.getInstance().databases(connection);
return sortDatabase(databases,systemDatabases,connection);
}
@Override
public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName,
@NotEmpty String tableName) {

View File

@ -104,4 +104,22 @@ public class MysqlSqlBuilder implements SqlBuilder {
}
@Override
public String pageLimit(String sql, int offset, int pageNo, int pageSize) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
sqlBuilder.append(sql);
if (offset == 0) {
sqlBuilder.append("\n LIMIT ");
sqlBuilder.append(pageSize);
} else {
sqlBuilder.append("\n LIMIT ");
sqlBuilder.append(offset);
sqlBuilder.append(",");
sqlBuilder.append(pageSize);
}
return sqlBuilder.toString();
}
}

View File

@ -14,6 +14,7 @@ import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SortUtils;
import com.google.common.collect.Lists;
import jakarta.validation.constraints.NotEmpty;
import org.apache.commons.lang3.StringUtils;
@ -22,6 +23,15 @@ public class OracleMetaData extends DefaultMetaService implements MetaData {
private static final String TABLE_DDL_SQL = "select dbms_metadata.get_ddl('TABLE','%s','%s') as sql from dual";
private List<String> systemSchemas = Arrays.asList("ANONYMOUS","APEX_030200","APEX_PUBLIC_USER","APPQOSSYS","BI","CTXSYS","DBSNMP","DIP","EXFSYS","FLOWS_FILES","HR","IX","MDDATA","MDSYS","MGMT_VIEW","OE","OLAPSYS","ORACLE_OCM","ORDDATA","ORDPLUGINS","ORDSYS","OUTLN","OWBSYS","OWBSYS_AUDIT","PM","SCOTT","SH","SI_INFORMTN_SCHEMA","SPATIAL_CSW_ADMIN_USR","SPATIAL_WFS_ADMIN_USR","SYS","SYSMAN","SYSTEM","WMSYS","XDB","XS$NULL");
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
List<Schema> schemas = SQLExecutor.getInstance().schemas(connection, databaseName, null);
return SortUtils.sortSchema(schemas, systemSchemas);
}
@Override
public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) {
String sql = String.format(TABLE_DDL_SQL, tableName, schemaName);

View File

@ -6,6 +6,7 @@ import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.model.TableIndex;
import ai.chat2db.spi.sql.Chat2DBContext;
import org.apache.commons.lang3.StringUtils;
public class OracleSqlBuilder implements SqlBuilder {
@ -16,7 +17,7 @@ public class OracleSqlBuilder implements SqlBuilder {
script.append("CREATE TABLE ").append("\"").append(table.getSchemaName()).append("\".\"").append(table.getName()).append("\" (").append("\n");
for (TableColumn column : table.getColumnList()) {
if(StringUtils.isBlank(column.getName())|| StringUtils.isBlank(column.getColumnType())){
if (StringUtils.isBlank(column.getName()) || StringUtils.isBlank(column.getColumnType())) {
continue;
}
OracleColumnTypeEnum typeEnum = OracleColumnTypeEnum.getByType(column.getColumnType());
@ -27,7 +28,7 @@ public class OracleSqlBuilder implements SqlBuilder {
script.append("\n);");
for (TableIndex tableIndex : table.getIndexList()) {
if(StringUtils.isBlank(tableIndex.getName())|| StringUtils.isBlank(tableIndex.getType())){
if (StringUtils.isBlank(tableIndex.getName()) || StringUtils.isBlank(tableIndex.getType())) {
continue;
}
OracleIndexTypeEnum oracleColumnTypeEnum = OracleIndexTypeEnum.getByType(tableIndex.getType());
@ -35,7 +36,7 @@ public class OracleSqlBuilder implements SqlBuilder {
}
for (TableColumn column : table.getColumnList()) {
if(StringUtils.isBlank(column.getName())|| StringUtils.isBlank(column.getColumnType()) || StringUtils.isBlank(column.getComment())){
if (StringUtils.isBlank(column.getName()) || StringUtils.isBlank(column.getColumnType()) || StringUtils.isBlank(column.getComment())) {
continue;
}
script.append("\n").append(buildComment(column)).append(";");
@ -66,7 +67,7 @@ public class OracleSqlBuilder implements SqlBuilder {
StringBuilder script = new StringBuilder();
if (!StringUtils.equalsIgnoreCase(oldTable.getName(), newTable.getName())) {
script.append("ALTER TABLE "). append("\"").append(oldTable.getSchemaName()).append("\".\"").append(oldTable.getName()).append("\"");
script.append("ALTER TABLE ").append("\"").append(oldTable.getSchemaName()).append("\".\"").append(oldTable.getName()).append("\"");
script.append(" ").append("RENAME TO ").append("\"").append(newTable.getName()).append("\"").append(";\n");
}
if (!StringUtils.equalsIgnoreCase(oldTable.getComment(), newTable.getComment())) {
@ -79,7 +80,7 @@ public class OracleSqlBuilder implements SqlBuilder {
if (StringUtils.isNotBlank(tableColumn.getEditStatus())) {
OracleColumnTypeEnum typeEnum = OracleColumnTypeEnum.getByType(tableColumn.getColumnType());
script.append("\t").append(typeEnum.buildModifyColumn(tableColumn)).append(";\n");
if(StringUtils.isNotBlank(tableColumn.getComment())){
if (StringUtils.isNotBlank(tableColumn.getComment())) {
script.append("\n").append(buildComment(tableColumn)).append(";\n");
}
}
@ -92,11 +93,38 @@ public class OracleSqlBuilder implements SqlBuilder {
script.append("\t").append(mysqlIndexTypeEnum.buildModifyIndex(tableIndex)).append(";\n");
}
}
if(script.length()>2) {
if (script.length() > 2) {
script = new StringBuilder(script.substring(0, script.length() - 2));
script.append(";");
}
return script.toString();
}
@Override
public String pageLimit(String sql, int offset, int pageNo, int pageSize) {
int startRow = offset;
int endRow = offset + pageSize;
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 120);
if (startRow > 0) {
sqlBuilder.append("SELECT * FROM ( ");
}
if (endRow > 0) {
sqlBuilder.append(" SELECT TMP_PAGE.*, ROWNUM CAHT2DB_AUTO_ROW_ID FROM ( ");
}
sqlBuilder.append("\n");
sqlBuilder.append(sql);
sqlBuilder.append("\n");
if (endRow > 0) {
sqlBuilder.append(" ) TMP_PAGE WHERE ROWNUM <= ");
sqlBuilder.append(endRow);
}
if (startRow > 0) {
sqlBuilder.append(" ) WHERE CAHT2DB_AUTO_ROW_ID > ");
sqlBuilder.append(startRow);
}
return sqlBuilder.toString();
}
}

View File

@ -17,22 +17,23 @@ import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import com.alibaba.druid.sql.visitor.functions.If;
import com.alibaba.fastjson2.JSON;
import ai.chat2db.spi.util.SortUtils;
import com.google.common.collect.Lists;
import jakarta.validation.constraints.NotEmpty;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import static ai.chat2db.plugin.postgresql.consts.SQLConst.FUNCTION_SQL;
import static ai.chat2db.spi.util.SortUtils.sortDatabase;
public class PostgreSQLMetaData extends DefaultMetaService implements MetaData {
private static final String SELECT_KEY_INDEX = "SELECT ccu.table_schema AS Foreign_schema_name, ccu.table_name AS Foreign_table_name, ccu.column_name AS Foreign_column_name, constraint_type AS Constraint_type, tc.CONSTRAINT_NAME AS Key_name, tc.TABLE_NAME, kcu.Column_name, tc.is_deferrable, tc.initially_deferred FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name WHERE tc.TABLE_SCHEMA = '%s' AND tc.TABLE_NAME = '%s';";
private List<String> systemDatabases = Arrays.asList("postgres");
@Override
public List<Database> databases(Connection connection) {
return SQLExecutor.getInstance().executeSql(connection, "SELECT datname FROM pg_database;", resultSet -> {
List<Database> list = SQLExecutor.getInstance().executeSql(connection, "SELECT datname FROM pg_database;", resultSet -> {
List<Database> databases = new ArrayList<>();
try {
while (resultSet.next()) {
@ -49,8 +50,30 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData {
}
return databases;
});
return sortDatabase(list, systemDatabases,connection);
}
private List<String> systemSchemas = Arrays.asList("pg_toast","pg_temp_1","pg_toast_temp_1","pg_catalog","information_schema");
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
List<Schema> schemas = SQLExecutor.getInstance().execute(connection,
"SELECT catalog_name, schema_name FROM information_schema.schemata;", resultSet -> {
List<Schema> databases = new ArrayList<>();
while (resultSet.next()) {
Schema schema = new Schema();
String name = resultSet.getString("schema_name");
String catalogName = resultSet.getString("catalog_name");
schema.setName(name);
schema.setDatabaseName(catalogName);
databases.add(schema);
}
return databases;
});
return SortUtils.sortSchema(schemas, systemSchemas);
}
private static final String SELECT_TABLE_INDEX = "SELECT tmp.INDISPRIMARY AS Index_primary, tmp.TABLE_SCHEM, tmp.TABLE_NAME, tmp.NON_UNIQUE, tmp.INDEX_QUALIFIER, tmp.INDEX_NAME AS Key_name, tmp.indisclustered, tmp.ORDINAL_POSITION AS Seq_in_index, TRIM ( BOTH '\"' FROM pg_get_indexdef ( tmp.CI_OID, tmp.ORDINAL_POSITION, FALSE ) ) AS Column_name,CASE tmp.AM_NAME WHEN 'btree' THEN CASE tmp.I_INDOPTION [ tmp.ORDINAL_POSITION - 1 ] & 1 :: SMALLINT WHEN 1 THEN 'D' ELSE'A' END ELSE NULL END AS Collation, tmp.CARDINALITY, tmp.PAGES, tmp.FILTER_CONDITION , tmp.AM_NAME AS Index_method, tmp.DESCRIPTION AS Index_comment FROM ( SELECT n.nspname AS TABLE_SCHEM, ct.relname AS TABLE_NAME, NOT i.indisunique AS NON_UNIQUE, NULL AS INDEX_QUALIFIER, ci.relname AS INDEX_NAME,i.INDISPRIMARY , i.indisclustered , ( information_schema._pg_expandarray ( i.indkey ) ).n AS ORDINAL_POSITION, ci.reltuples AS CARDINALITY, ci.relpages AS PAGES, pg_get_expr ( i.indpred, i.indrelid ) AS FILTER_CONDITION, ci.OID AS CI_OID, i.indoption AS I_INDOPTION, am.amname AS AM_NAME , d.description FROM pg_class ct JOIN pg_namespace n ON ( ct.relnamespace = n.OID ) JOIN pg_index i ON ( ct.OID = i.indrelid ) JOIN pg_class ci ON ( ci.OID = i.indexrelid ) JOIN pg_am am ON ( ci.relam = am.OID ) left outer join pg_description d on i.indexrelid = d.objoid WHERE n.nspname = '%s' AND ct.relname = '%s' ) AS tmp ;";
private static String ROUTINES_SQL
= " SELECT p.proname, p.prokind, pg_catalog.pg_get_functiondef(p.oid) as \"code\" FROM pg_catalog.pg_proc p "
@ -99,22 +122,6 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData {
});
}
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
return SQLExecutor.getInstance().execute(connection,
"SELECT catalog_name, schema_name FROM information_schema.schemata;", resultSet -> {
List<Schema> databases = new ArrayList<>();
while (resultSet.next()) {
Schema schema = new Schema();
String name = resultSet.getString("schema_name");
String catalogName = resultSet.getString("catalog_name");
schema.setName(name);
schema.setDatabaseName(catalogName);
databases.add(schema);
}
return databases;
});
}
@Override
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,

View File

@ -156,5 +156,20 @@ public class PostgreSQLSqlBuilder implements SqlBuilder {
return script.toString();
}
@Override
public String pageLimit(String sql, int offset, int pageNo, int pageSize) {
StringBuilder sqlStr = new StringBuilder(sql.length() + 17);
sqlStr.append(sql);
if (offset == 0) {
sqlStr.append(" LIMIT ");
sqlStr.append(pageSize);
} else {
sqlStr.append(" LIMIT ");
sqlStr.append(pageSize);
sqlStr.append(" OFFSET ");
sqlStr.append(offset);
}
return sqlStr.toString();
}
}

View File

@ -18,7 +18,7 @@ public class SqliteBuilder implements SqlBuilder {
// append column
for (TableColumn column : table.getColumnList()) {
if(StringUtils.isBlank(column.getName())|| StringUtils.isBlank(column.getColumnType())){
if (StringUtils.isBlank(column.getName()) || StringUtils.isBlank(column.getColumnType())) {
continue;
}
SqliteColumnTypeEnum typeEnum = SqliteColumnTypeEnum.getByType(column.getColumnType());
@ -27,7 +27,7 @@ public class SqliteBuilder implements SqlBuilder {
// append primary key and index
for (TableIndex tableIndex : table.getIndexList()) {
if(StringUtils.isBlank(tableIndex.getName())|| StringUtils.isBlank(tableIndex.getType())){
if (StringUtils.isBlank(tableIndex.getName()) || StringUtils.isBlank(tableIndex.getType())) {
continue;
}
SqliteIndexTypeEnum sqliteIndexTypeEnum = SqliteIndexTypeEnum.getByType(tableIndex.getType());
@ -53,7 +53,7 @@ public class SqliteBuilder implements SqlBuilder {
// append modify column
for (TableColumn tableColumn : newTable.getColumnList()) {
if (StringUtils.isNotBlank(tableColumn.getEditStatus()) && StringUtils.isNotBlank(tableColumn.getColumnType())&& StringUtils.isNotBlank(tableColumn.getName())){
if (StringUtils.isNotBlank(tableColumn.getEditStatus()) && StringUtils.isNotBlank(tableColumn.getColumnType()) && StringUtils.isNotBlank(tableColumn.getName())) {
script.append("ALTER TABLE ").append("\"").append(newTable.getDatabaseName()).append("\".\"").append(newTable.getName()).append("\"").append("\n");
SqliteColumnTypeEnum typeEnum = SqliteColumnTypeEnum.getByType(tableColumn.getColumnType());
script.append("\t").append(typeEnum.buildModifyColumn(tableColumn)).append(";\n");
@ -63,7 +63,7 @@ public class SqliteBuilder implements SqlBuilder {
// append modify index
for (TableIndex tableIndex : newTable.getIndexList()) {
if (StringUtils.isNotBlank(tableIndex.getEditStatus()) && StringUtils.isNotBlank(tableIndex.getType())) {
// script.append("ALTER TABLE ").append("\"").append(newTable.getDatabaseName()).append("\".\"").append(newTable.getName()).append("\"").append("\n");
// script.append("ALTER TABLE ").append("\"").append(newTable.getDatabaseName()).append("\".\"").append(newTable.getName()).append("\"").append("\n");
SqliteIndexTypeEnum sqliteIndexTypeEnum = SqliteIndexTypeEnum.getByType(tableIndex.getType());
script.append("\t").append(sqliteIndexTypeEnum.buildModifyIndex(tableIndex)).append(";\n");
}
@ -75,5 +75,8 @@ public class SqliteBuilder implements SqlBuilder {
return script.toString();
}
@Override
public String pageLimit(String sql, int offset, int pageNo, int pageSize) {
return "select * from(" + sql + ") t LIMIT " + pageNo + " OFFSET " + offset + "";
}
}

View File

@ -14,10 +14,33 @@ import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SortUtils;
import jakarta.validation.constraints.NotEmpty;
import org.apache.commons.lang3.StringUtils;
import static ai.chat2db.spi.util.SortUtils.sortDatabase;
public class SqlServerMetaData extends DefaultMetaService implements MetaData {
private List<String> systemDatabases = Arrays.asList("master", "model", "msdb", "tempdb");
@Override
public List<Database> databases(Connection connection) {
List<Database> databases = SQLExecutor.getInstance().databases(connection);
return sortDatabase(databases,systemDatabases,connection);
}
private List<String> systemSchemas = Arrays.asList("guest", "INFORMATION_SCHEMA", "sys", "db_owner",
"db_accessadmin", "db_securityadmin", "db_ddladmin", "db_backupoperator", "db_datareader", "db_datawriter",
"db_denydatareader", "db_denydatawriter");
@Override
public List<Schema> schemas(Connection connection, String databaseName) {
List<Schema> schemas = SQLExecutor.getInstance().schemas(connection, databaseName, null);
return SortUtils.sortSchema(schemas, systemSchemas);
}
private String functionSQL
= "CREATE FUNCTION tableSchema.ufn_GetCreateTableScript( @schema_name NVARCHAR(128), @table_name NVARCHAR"
+ "(128)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @CreateTableScript NVARCHAR(MAX); DECLARE @IndexScripts "
@ -49,7 +72,6 @@ public class SqlServerMetaData extends DefaultMetaService implements MetaData {
@Override
public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) {
try {
System.out.println(functionSQL);
SQLExecutor.getInstance().executeSql(connection, functionSQL.replace("tableSchema", schemaName),
resultSet -> null);
} catch (Exception e) {

View File

@ -6,6 +6,7 @@ import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.model.TableIndex;
import ai.chat2db.spi.sql.Chat2DBContext;
import org.apache.commons.lang3.StringUtils;
public class SqlServerSqlBuilder implements SqlBuilder {
@ -80,9 +81,9 @@ public class SqlServerSqlBuilder implements SqlBuilder {
script.append(buildRenameTable(oldTable, newTable));
}
if (!StringUtils.equalsIgnoreCase(oldTable.getComment(), newTable.getComment())) {
if(oldTable.getComment() == null){
if (oldTable.getComment() == null) {
script.append("\n").append(buildTableComment(newTable));
}else {
} else {
script.append("\n").append(buildUpdateTableComment(newTable));
}
}
@ -110,8 +111,8 @@ public class SqlServerSqlBuilder implements SqlBuilder {
return script.toString();
}
private static String UPDATE_TABLE_COMMENT_SCRIPT = "exec sp_updateextendedproperty 'MS_Description','%s','SCHEMA','%s','TABLE','%s' \ngo";
private String buildUpdateTableComment(Table newTable) {
return String.format(UPDATE_TABLE_COMMENT_SCRIPT, newTable.getComment(), newTable.getSchemaName(), newTable.getName());
}
@ -121,4 +122,24 @@ public class SqlServerSqlBuilder implements SqlBuilder {
private String buildRenameTable(Table oldTable, Table newTable) {
return String.format(RENAME_TABLE_SCRIPT, oldTable.getName(), newTable.getName());
}
@Override
public String pageLimit(String sql, int offset, int pageNo, int pageSize) {
String version = Chat2DBContext.getDbVersion();
if (StringUtils.isNotBlank(version)) {
String[] versions = version.split("\\.");
if (versions.length > 0 && Integer.parseInt(versions[0]) >= 11) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
sqlBuilder.append(sql);
sqlBuilder.append("\n OFFSET ");
sqlBuilder.append(offset);
sqlBuilder.append(" ROWS ");
sqlBuilder.append(" FETCH NEXT ");
sqlBuilder.append(pageSize);
sqlBuilder.append(" ROWS ONLY");
return sqlBuilder.toString();
}
}
return "";
}
}