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

@ -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 "";
}
}