5 changed files with 787 additions and 929 deletions
@ -0,0 +1,281 @@
|
||||
package com.fr.design.data.tabledata.tabledatapane; |
||||
|
||||
import com.fine.state.livedata.LiveData; |
||||
import com.fine.state.livedata.MutableLiveData; |
||||
import com.fr.base.Parameter; |
||||
import com.fr.base.ParameterHelper; |
||||
import com.fr.base.TableData; |
||||
import com.fr.data.core.DataCoreUtils; |
||||
import com.fr.data.core.db.TableProcedure; |
||||
import com.fr.data.core.db.dialect.base.key.check.DataBaseDetail; |
||||
import com.fr.data.core.db.dialect.base.key.check.DataBaseType; |
||||
import com.fr.data.impl.AbstractDatabaseConnection; |
||||
import com.fr.data.impl.Connection; |
||||
import com.fr.data.impl.DBTableData; |
||||
import com.fr.data.impl.NameDatabaseConnection; |
||||
import com.fr.data.operator.DataOperator; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.gui.ilist.TableViewList; |
||||
import com.fr.design.utils.ParameterUtils; |
||||
import com.fr.file.ConnectionConfig; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.sql.SqlUtils; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.server.connection.DBConnectAuth; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.Objects; |
||||
import java.util.Set; |
||||
|
||||
import static com.fr.data.core.db.TableProcedure.ERROR_TABLE_PROCEDURE; |
||||
|
||||
/** |
||||
* 数据集界面视图模型 |
||||
* |
||||
* @author vito |
||||
* @since 11.0 |
||||
* Created on 2023/11/7 |
||||
*/ |
||||
public class DBTableDataViewModel { |
||||
|
||||
private MutableLiveData<DBTableData> dbTableData = new MutableLiveData<>(); |
||||
private MutableLiveData<List<String>> connectionList = new MutableLiveData<>(Collections.emptyList()); |
||||
private MutableLiveData<Collection<TableProcedure>> tableProcedures = new MutableLiveData<>(Collections.emptyList()); |
||||
|
||||
public DBTableDataViewModel() { |
||||
} |
||||
|
||||
public LiveData<DBTableData> getDbTableData() { |
||||
return dbTableData; |
||||
} |
||||
|
||||
public LiveData<List<String>> getConnectionList() { |
||||
return connectionList; |
||||
} |
||||
|
||||
public LiveData<Collection<TableProcedure>> getTableProcedures() { |
||||
return tableProcedures; |
||||
} |
||||
|
||||
/* ---------action--------- */ |
||||
public void updateTableData(TableData tableData) { |
||||
if (!(tableData instanceof DBTableData)) { |
||||
return; |
||||
} |
||||
dbTableData.postValue((DBTableData) tableData); |
||||
} |
||||
|
||||
|
||||
public void fetchConnectionNameAction() { |
||||
new Thread(() -> { |
||||
|
||||
ConnectionConfig mgr = ConnectionConfig.getInstance(); |
||||
Set<String> connectionName = mgr.getConnections().keySet(); |
||||
|
||||
Collection<String> noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections(); |
||||
|
||||
ArrayList<String> nameList = new ArrayList<>(); |
||||
|
||||
if (noAuthConnections == null) { |
||||
connectionList.postValue(Collections.emptyList()); |
||||
return; |
||||
} |
||||
for (String conName : connectionName) { |
||||
if (noAuthConnections.contains(conName)) { |
||||
continue; |
||||
} |
||||
Connection connection = mgr.getConnection(conName); |
||||
connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); |
||||
} |
||||
connectionList.postValue(nameList); |
||||
}).start(); |
||||
} |
||||
|
||||
public void fetchTableProceduresAction(TableViewList.TableProcedureBean tableProcedureBean) { |
||||
new Thread(() -> { |
||||
List<TableProcedure> list; |
||||
try { |
||||
list = fetchTableProcedures(tableProcedureBean); |
||||
} catch (Exception e) { |
||||
list = new ArrayList<>(); |
||||
list.add(ERROR_TABLE_PROCEDURE); |
||||
} |
||||
tableProcedures.postValue(list); |
||||
}).start(); |
||||
} |
||||
|
||||
/** |
||||
* august:databaseName是数据库名字,searchFilter是输入的过滤条件,typesFilter是视图、表、 |
||||
* 存储过程中的一者或者几者 |
||||
* |
||||
* @param bean 数据 |
||||
*/ |
||||
private List<TableProcedure> fetchTableProcedures(TableViewList.TableProcedureBean bean) throws Exception { |
||||
if (bean.refresh) { |
||||
clearCache(ConnectionConfig.getInstance().getConnection(bean.databaseName)); |
||||
} |
||||
Connection datasource = ConnectionConfig.getInstance().getConnection(bean.databaseName); |
||||
if (datasource == null) { |
||||
return Collections.emptyList(); |
||||
} |
||||
String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); |
||||
|
||||
String searchFilter = bean.searchFilter.toLowerCase(); |
||||
boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); |
||||
// oracle不勾选显示所有表,则只显示用户下的(包括存储过程和table表)
|
||||
DataBaseDetail detail = DataOperator.getInstance().getDataBaseDetail(datasource, isOracleSystemSpace); |
||||
if (ArrayUtils.isNotEmpty(detail.getSchemas())) { |
||||
schemas = detail.getSchemas(); |
||||
} |
||||
if (bean.typesFilter.length == 1 && ComparatorUtils.equals(bean.typesFilter[0], TableProcedure.PROCEDURE)) { |
||||
return processStoreProcedure(schemas, datasource, DataBaseType.ORACLE.equals(detail.getType()), searchFilter); |
||||
} else { |
||||
return processTableAndView(schemas, datasource, searchFilter, DataBaseType.ORACLE.equals(detail.getType()), bean.typesFilter); |
||||
} |
||||
} |
||||
|
||||
private void clearCache(Connection datasource) { |
||||
String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); |
||||
schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas; |
||||
for (String schema : schemas) { |
||||
doClearCache(datasource, schema); |
||||
} |
||||
doClearCache(datasource, null); |
||||
} |
||||
|
||||
private void doClearCache(Connection datasource, String schema) { |
||||
DataCoreUtils.refreshTables(datasource, TableProcedure.TABLE, schema); |
||||
DataCoreUtils.refreshTables(datasource, TableProcedure.VIEW, schema); |
||||
DataCoreUtils.refreshTables(datasource, TableProcedure.PROCEDURE, schema); |
||||
} |
||||
|
||||
private List<TableProcedure> processStoreProcedure(String[] schemas, Connection datasource, boolean isOracle, String searchFilter) throws Exception { |
||||
List<TableProcedure> tableProcedures = new ArrayList<>(); |
||||
boolean isBlank = StringUtils.isBlank(searchFilter); |
||||
boolean isOracleSysSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); |
||||
List<TableProcedure[]> sqlTablees = DataCoreUtils.getProcedures(datasource, schemas, isOracle, isOracleSysSpace); |
||||
for (TableProcedure[] sqlTables : sqlTablees) { |
||||
if (sqlTables == null) { |
||||
continue; |
||||
} |
||||
for (TableProcedure sqlTable : sqlTables) { |
||||
String name = sqlTable.toString().toLowerCase(); |
||||
if (isBlank || name.contains(searchFilter)) { |
||||
tableProcedures.add(sqlTable); |
||||
} |
||||
} |
||||
} |
||||
return tableProcedures; |
||||
} |
||||
|
||||
private List<TableProcedure> processTableAndView(String[] schemas, Connection datasource, String searchFilter, boolean isOracle, String... typesFilter) |
||||
throws Exception { |
||||
List<TableProcedure> tableProcedures = new ArrayList<>(); |
||||
boolean isBlank = StringUtils.isBlank(searchFilter); |
||||
boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); |
||||
if (!isOracle) { |
||||
String schema = null; |
||||
for (String type : typesFilter) { |
||||
//非oracle数据库,默认都是显示所有表的,参数为true
|
||||
TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, true); |
||||
if (Objects.isNull(sqlTables)) { |
||||
return tableProcedures; |
||||
} |
||||
for (TableProcedure sqlTable : sqlTables) { |
||||
if (isBlank || sqlTable.getName().toLowerCase().contains(searchFilter)) { |
||||
tableProcedures.add(sqlTable); |
||||
} |
||||
} |
||||
} |
||||
} else { |
||||
for (String type : typesFilter) { |
||||
for (String schema : schemas) { |
||||
TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, isOracleSystemSpace); |
||||
if (Objects.isNull(sqlTables)) { |
||||
return tableProcedures; |
||||
} |
||||
// oracle的表名加上模式
|
||||
for (TableProcedure ta : sqlTables) { |
||||
String name = ta.getSchema() + '.' + ta.getName(); |
||||
if (isBlank || name.toLowerCase().contains(searchFilter)) { |
||||
tableProcedures.add(ta); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return tableProcedures; |
||||
} |
||||
|
||||
public void updatePageQuery(String pageQuery) { |
||||
DBTableData tableData = dbTableData.getValue(); |
||||
if (ComparatorUtils.equals(pageQuery, tableData.getPageQuerySql())) { |
||||
return; |
||||
} |
||||
tableData.setPageQuerySql(pageQuery); |
||||
dbTableData.postValue(tableData); |
||||
} |
||||
|
||||
public void updateQuery(String query) { |
||||
DBTableData tableData = dbTableData.getValue(); |
||||
if (ComparatorUtils.equals(query, tableData.getQuery())) { |
||||
return; |
||||
} |
||||
tableData.setQuery(query); |
||||
dbTableData.postValue(tableData); |
||||
} |
||||
|
||||
public void refreshParameters() { |
||||
DBTableData tableData = dbTableData.getValue(); |
||||
if (needRefreshParameter(tableData)) { |
||||
tableData.setParameters(calParameter(tableData)); |
||||
} |
||||
dbTableData.postValue(tableData); |
||||
} |
||||
|
||||
private boolean needRefreshParameter(DBTableData tableData) { |
||||
String[] paramTexts = new String[2]; |
||||
paramTexts[0] = tableData.getQuery(); |
||||
paramTexts[1] = tableData.getPageQuerySql(); |
||||
Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); |
||||
|
||||
if (parameters.length < 1 && tableData.getParameters().length < 1) { |
||||
return false; |
||||
} |
||||
boolean isIn = true; |
||||
ParameterProvider[] list = tableData.getParameters(); |
||||
List<String> name = new ArrayList<>(); |
||||
for (ParameterProvider parameter : list) { |
||||
name.add(parameter.getName()); |
||||
} |
||||
for (Parameter parameter : parameters) { |
||||
if (!name.contains(parameter.getName())) { |
||||
isIn = false; |
||||
break; |
||||
} |
||||
} |
||||
return list.length != parameters.length || !isIn; |
||||
} |
||||
|
||||
private Parameter[] calParameter(DBTableData tableData) { |
||||
|
||||
String[] paramTexts = new String[2]; |
||||
paramTexts[0] = SqlUtils.tryPureSqlText(tableData.getQuery()); |
||||
paramTexts[1] = SqlUtils.tryPureSqlText(tableData.getPageQuerySql()); |
||||
Parameter[] oldParameters = Arrays.asList(tableData.getParameters()).toArray(new Parameter[0]); |
||||
return ParameterUtils.analyzeAndUnionParameters(paramTexts, oldParameters); |
||||
} |
||||
|
||||
public void updateDBName(String dbName) { |
||||
DBTableData tableData = dbTableData.getValue(); |
||||
tableData.setDatabase(new NameDatabaseConnection(dbName)); |
||||
dbTableData.postValue(tableData); |
||||
} |
||||
} |
Loading…
Reference in new issue