diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java index bc9a3204da..8751882630 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java @@ -215,6 +215,24 @@ public class CustomWhere2Str { } else { whereValue = toLikeValue(value); } + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "start_with")) { + if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) + && !isCross + && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNStartValue(value); + } else { + whereValue = toStartValue(value); + } + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "end_with")) { + if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) + && !isCross + && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNEndValue(value); + } else { + whereValue = toEndValue(value); + } } else { // 如果是时间字段过滤,当条件是等于和不等于的时候转换成between和not between if (field.getDeType() == 1) { @@ -294,6 +312,14 @@ public class CustomWhere2Str { return "'%" + sanitizeSqlLiteral(value) + "%'"; } + private static String toStartValue(String value) { + return "'" + sanitizeSqlLiteral(value) + "%'"; + } + + private static String toEndValue(String value) { + return "'%" + sanitizeSqlLiteral(value) + "'"; + } + private static String toSqlServerNQuotedValue(String value) { return "'" + SQLConstants.MSSQL_N_PREFIX + sanitizeSqlLiteral(value) + "'"; } @@ -302,6 +328,14 @@ public class CustomWhere2Str { return "'" + SQLConstants.MSSQL_N_PREFIX + "%" + sanitizeSqlLiteral(value) + "%'"; } + private static String toSqlServerNStartValue(String value) { + return "'" + SQLConstants.MSSQL_N_PREFIX + sanitizeSqlLiteral(value) + "%'"; + } + + private static String toSqlServerNEndValue(String value) { + return "'" + SQLConstants.MSSQL_N_PREFIX + "%" + sanitizeSqlLiteral(value) + "'"; + } + private static String sanitizeNumberLiteral(String value) { String normalized = StringUtils.trimToEmpty(value); if (!NUMBER_PATTERN.matcher(normalized).matches()) { diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java index 748684b443..ac14cb8a7f 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java @@ -222,6 +222,60 @@ public class ExtWhere2Str { whereValue = toLikeValue(value.get(0)); } } + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "start_with")) { + // tree的情况需额外处理 + if (request.getIsTree()) { + List datasetTableFieldList = request.getDatasetTableFieldList(); + boolean hasN = false; + for (DatasetTableFieldDTO dto : datasetTableFieldList) { + if (StringUtils.containsIgnoreCase(dto.getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(dto.getType(), "NCHAR")) { + hasN = true; + break; + } + } + if (hasN && !isCross && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNStartValue(value.get(0)); + } else { + whereValue = toStartValue(value.get(0)); + } + } else { + if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR")) + && !isCross + && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNStartValue(value.get(0)); + } else { + whereValue = toStartValue(value.get(0)); + } + } + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "end_with")) { + // tree的情况需额外处理 + if (request.getIsTree()) { + List datasetTableFieldList = request.getDatasetTableFieldList(); + boolean hasN = false; + for (DatasetTableFieldDTO dto : datasetTableFieldList) { + if (StringUtils.containsIgnoreCase(dto.getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(dto.getType(), "NCHAR")) { + hasN = true; + break; + } + } + if (hasN && !isCross && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNEndValue(value.get(0)); + } else { + whereValue = toEndValue(value.get(0)); + } + } else { + if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR")) + && !isCross + && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNEndValue(value.get(0)); + } else { + whereValue = toEndValue(value.get(0)); + } + } } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { if (request.getDatasetTableField().getDeType() == 1) { if (request.getDatasetTableField().getDeExtractType() == 2 @@ -327,6 +381,14 @@ public class ExtWhere2Str { return "'%" + sanitizeSqlLiteral(value) + "%'"; } + private static String toStartValue(String value) { + return "'" + sanitizeSqlLiteral(value) + "%'"; + } + + private static String toEndValue(String value) { + return "'%" + sanitizeSqlLiteral(value) + "'"; + } + private static String toSqlServerNQuotedValue(String value) { return "'" + SQLConstants.MSSQL_N_PREFIX + sanitizeSqlLiteral(value) + "'"; } @@ -335,6 +397,14 @@ public class ExtWhere2Str { return "'" + SQLConstants.MSSQL_N_PREFIX + "%" + sanitizeSqlLiteral(value) + "%'"; } + private static String toSqlServerNStartValue(String value) { + return "'" + SQLConstants.MSSQL_N_PREFIX + sanitizeSqlLiteral(value) + "%'"; + } + + private static String toSqlServerNEndValue(String value) { + return "'" + SQLConstants.MSSQL_N_PREFIX + "%" + sanitizeSqlLiteral(value) + "'"; + } + private static String sanitizeNumberLiteral(String value) { String normalized = StringUtils.trimToEmpty(value); if (!NUMBER_PATTERN.matcher(normalized).matches()) { diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java index f8c6a244f9..fef75f96a0 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java @@ -224,6 +224,24 @@ public class WhereTree2Str { } else { whereValue = toLikeValue(value); } + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "start_with")) { + if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) + && !isCross + && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNStartValue(value); + } else { + whereValue = toStartValue(value); + } + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "end_with")) { + if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") + || StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) + && !isCross + && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) { + whereValue = toSqlServerNEndValue(value); + } else { + whereValue = toEndValue(value); + } } else { // 如果是时间字段过滤,当条件是等于和不等于的时候转换成between和not between if (field.getDeType() == 1) { @@ -292,6 +310,14 @@ public class WhereTree2Str { return "'%" + sanitizeSqlLiteral(value) + "%'"; } + private static String toStartValue(String value) { + return "'" + sanitizeSqlLiteral(value) + "%'"; + } + + private static String toEndValue(String value) { + return "'%" + sanitizeSqlLiteral(value) + "'"; + } + private static String toSqlServerNQuotedValue(String value) { return "'" + SQLConstants.MSSQL_N_PREFIX + sanitizeSqlLiteral(value) + "'"; } @@ -299,4 +325,12 @@ public class WhereTree2Str { private static String toSqlServerNLikeValue(String value) { return "'" + SQLConstants.MSSQL_N_PREFIX + "%" + sanitizeSqlLiteral(value) + "%'"; } + + private static String toSqlServerNStartValue(String value) { + return "'" + SQLConstants.MSSQL_N_PREFIX + sanitizeSqlLiteral(value) + "%'"; + } + + private static String toSqlServerNEndValue(String value) { + return "'" + SQLConstants.MSSQL_N_PREFIX + "%" + sanitizeSqlLiteral(value) + "'"; + } }