fix: 修复时间参数过滤失败

This commit is contained in:
tjlygdx
2026-05-20 11:43:52 +08:00
parent 9b2cf4fb25
commit 907b3062ff
3 changed files with 83 additions and 55 deletions

View File

@@ -768,7 +768,7 @@ public class SqlparserUtils {
if (StringUtils.equals(sqlVariableDetails.getOperator(), "in")) {
return CollectionUtils.isEmpty(sqlVariableDetails.getValue()) ? Collections.emptyList() : sqlVariableDetails.getValue();
}
if (StringUtils.equals(sqlVariableDetails.getOperator(), "between")) {
if (StringUtils.equals(sqlVariableDetails.getOperator(), "between") || StringUtils.equals(sqlVariableDetails.getOperator(), "eq")) {
if (sqlVariableDetails.getDeType() == 1) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sqlVariableDetails.getType().size() > 1 ? (String) sqlVariableDetails.getType().get(1).replace("DD", "dd").replace("YYYY", "yyyy") : "yyyy");
if (StringUtils.endsWith(sqlVariableDetails.getId(), START_END_SEPARATOR)) {

View File

@@ -297,6 +297,7 @@ public class CalciteProvider extends Provider {
try {
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
statement = calciteConnection.prepareStatement(datasourceRequest.getQuery());
bindPreparedStatementValues(statement, datasourceRequest.getTableFieldWithValues(), null, null, null);
resultSet = statement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
@@ -325,11 +326,12 @@ public class CalciteProvider extends Provider {
String table = datasourceRequest.getTable();
if (StringUtils.isEmpty(table)) {
ResultSet resultSet = null;
try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getStatement(con, 30)) {
if (DatasourceConfiguration.DatasourceType.valueOf(datasourceSchemaDTO.getType()) == DatasourceConfiguration.DatasourceType.oracle) {
statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema());
}
resultSet = statement.executeQuery(datasourceRequest.getQuery());
String oracleCharset = normalizeOracleCharset(datasourceConfiguration.getCharset());
String oracleTargetCharset = normalizeOracleCharset(datasourceConfiguration.getTargetCharset());
try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId())) {
Statement statement = getStatement(datasourceSchemaDTO, con, datasourceRequest, datasourceConfiguration, null);
bindPreparedStatementValues(statement, datasourceRequest.getTableFieldWithValues(), DatasourceConfiguration.DatasourceType.valueOf(datasourceSchemaDTO.getType()), oracleCharset, oracleTargetCharset);
resultSet = executeQuery(statement, datasourceRequest.getQuery());
datasetTableFields.addAll(getField(resultSet, datasourceRequest));
} catch (Exception e) {
DEException.throwException(e.getMessage());
@@ -390,6 +392,43 @@ public class CalciteProvider extends Provider {
return datasetTableFields;
}
private void bindPreparedStatementValues(Statement statement, List<TableFieldWithValue> tableFieldWithValues,
DatasourceConfiguration.DatasourceType datasourceType,
String oracleCharset, String oracleTargetCharset) throws SQLException {
if (!(statement instanceof PreparedStatement preparedStatement) || CollectionUtils.isEmpty(tableFieldWithValues)) {
return;
}
for (int i = 0; i < tableFieldWithValues.size(); i++) {
TableFieldWithValue tableFieldWithValue = tableFieldWithValues.get(i);
try {
Object valueObject = tableFieldWithValue.getValue();
if (valueObject instanceof String
&& datasourceType == DatasourceConfiguration.DatasourceType.oracle
&& StringUtils.isNotEmpty(oracleCharset)
&& StringUtils.isNotEmpty(oracleTargetCharset)) {
valueObject = convertOracleText((String) valueObject, oracleTargetCharset, oracleCharset);
}
if (tableFieldWithValue.getType() != null && tableFieldWithValue.getType().equals(Types.CLOB) && valueObject instanceof String stringValue) {
Reader reader = new StringReader(stringValue);
preparedStatement.setCharacterStream(i + 1, reader, stringValue.length());
} else if (tableFieldWithValue.getType() != null) {
preparedStatement.setObject(i + 1, valueObject, tableFieldWithValue.getType());
} else {
preparedStatement.setObject(i + 1, valueObject);
}
} catch (SQLException | UnsupportedEncodingException e) {
throw new SQLException(e.getMessage() + ". VALUE: " + String.valueOf(tableFieldWithValue.getValue()) + " , TARGET TYPE: " + tableFieldWithValue.getColumnTypeName(), e);
}
}
}
private ResultSet executeQuery(Statement statement, String query) throws SQLException {
if (statement instanceof PreparedStatement preparedStatement) {
return preparedStatement.executeQuery();
}
return statement.executeQuery(query);
}
private boolean isDorisCatalog(DatasourceRequest datasourceRequest) {
if (!datasourceRequest.getDatasource().getType().equalsIgnoreCase("doris")) {
return false;

View File

@@ -921,43 +921,7 @@ public class DatasourceServer implements DatasourceApi {
}
ExcelUtils excelUtils = new ExcelUtils();
ExcelFileData excelFileData = excelUtils.excelSaveAndParse(file, String.valueOf(AuthUtils.getUser().getUserId()));
if (Objects.equals(editType, append)) { //按照excel sheet 名称匹配替换0追加1
if (coreDatasource != null) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
List<ExcelSheetData> excelSheetDataList = new ArrayList<>();
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
List<TableField> newTableFields = sheet.getFields();
datasourceRequest.setTable(datasetTableDTO.getTableName());
List<TableField> oldTableFields = ExcelUtils.getTableFields(datasourceRequest);
if (isEqual(newTableFields, oldTableFields)) {
sheet.setDeTableName(datasetTableDTO.getTableName());
excelSheetDataList.add(sheet);
}
}
}
}
excelFileData.setSheets(excelSheetDataList);
}
} else {
// 替换
if (coreDatasource != null) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
sheet.setDeTableName(datasetTableDTO.getTableName());
}
}
}
}
}
mergeExcelEditConfig(excelFileData, coreDatasource, editType);
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (int i = 0; i < sheet.getFields().size() - 1; i++) {
@@ -979,18 +943,7 @@ public class DatasourceServer implements DatasourceApi {
if (ObjectUtils.isNotEmpty(remoteExcelRequest.getDatasourceId()) && 0L != remoteExcelRequest.getDatasourceId()) {
coreDatasource = dataSourceManage.getCoreDatasource(remoteExcelRequest.getDatasourceId());
}
if (coreDatasource != null) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
sheet.setDeTableName(datasetTableDTO.getTableName());
}
}
}
}
mergeExcelEditConfig(excelFileData, coreDatasource, remoteExcelRequest.getEditType());
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (int i = 0; i < sheet.getFields().size() - 1; i++) {
for (int j = i + 1; j < sheet.getFields().size(); j++) {
@@ -1003,6 +956,42 @@ public class DatasourceServer implements DatasourceApi {
return excelFileData;
}
private void mergeExcelEditConfig(ExcelFileData excelFileData, CoreDatasource coreDatasource, Integer editType) throws DEException {
if (coreDatasource == null) {
return;
}
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
if (Objects.equals(editType, append)) { // 按照 excel sheet 名称匹配替换0追加1
List<ExcelSheetData> excelSheetDataList = new ArrayList<>();
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
List<TableField> newTableFields = sheet.getFields();
datasourceRequest.setTable(datasetTableDTO.getTableName());
List<TableField> oldTableFields = ExcelUtils.getTableFields(datasourceRequest);
if (isEqual(newTableFields, oldTableFields)) {
sheet.setDeTableName(datasetTableDTO.getTableName());
excelSheetDataList.add(sheet);
}
}
}
}
excelFileData.setSheets(excelSheetDataList);
return;
}
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
sheet.setDeTableName(datasetTableDTO.getTableName());
datasourceRequest.setTable(datasetTableDTO.getTableName());
mergeFields(ExcelUtils.getTableFields(datasourceRequest), sheet.getFields());
}
}
}
}
private boolean isEqual(List<TableField> newTableFields, List<TableField> oldTableFields) {
if (CollectionUtils.isEmpty(newTableFields) || CollectionUtils.isEmpty(oldTableFields)) {