From a6e1099b22afa51a13c3d38878cfcf509d0c24ad Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 28 Jun 2023 21:41:22 +0800 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80=E5=9C=A8=20W?= =?UTF-8?q?rapperUtil.withAlias=20=E6=96=B9=E6=B3=95=E4=B8=AD=E5=A4=84?= =?UTF-8?q?=E7=90=86=20alias=20=E5=8C=85=E8=A3=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/core/query/ArithmeticQueryColumn.java | 2 +- .../main/java/com/mybatisflex/core/query/CaseQueryColumn.java | 2 +- .../java/com/mybatisflex/core/query/CaseSearchQueryColumn.java | 2 +- .../java/com/mybatisflex/core/query/FunctionQueryColumn.java | 2 +- .../main/java/com/mybatisflex/core/query/SelectQueryColumn.java | 2 +- .../main/java/com/mybatisflex/core/query/SelectQueryTable.java | 2 +- .../com/mybatisflex/core/query/StringFunctionQueryColumn.java | 2 +- .../src/main/java/com/mybatisflex/core/query/WrapperUtil.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/ArithmeticQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/ArithmeticQueryColumn.java index 5eb00c9b..600a7432 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/ArithmeticQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/ArithmeticQueryColumn.java @@ -96,7 +96,7 @@ public class ArithmeticQueryColumn extends QueryColumn { sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i)); } if (StringUtil.isNotBlank(alias)) { - return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias), dialect); + return WrapperUtil.withAlias(sql.toString(), alias, dialect); } return sql.toString(); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseQueryColumn.java index 1bd24d32..a6eb0cd6 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseQueryColumn.java @@ -44,7 +44,7 @@ public class CaseQueryColumn extends QueryColumn implements HasParamsColumn { String toSelectSql(List queryTables, IDialect dialect) { String sql = buildSql(queryTables, dialect); if (StringUtil.isNotBlank(alias)) { - return WrapperUtil.withAlias(sql, dialect.wrap(alias), dialect); + return WrapperUtil.withAlias(sql, alias, dialect); } return sql; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseSearchQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseSearchQueryColumn.java index 96946703..e8335326 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseSearchQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CaseSearchQueryColumn.java @@ -37,7 +37,7 @@ public class CaseSearchQueryColumn extends QueryColumn implements HasParamsColum String toSelectSql(List queryTables, IDialect dialect) { String sql = buildSql(queryTables, dialect); if (StringUtil.isNotBlank(alias)) { - return WrapperUtil.withAlias(sql, dialect.wrap(alias), dialect); + return WrapperUtil.withAlias(sql, alias, dialect); } return sql; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java index 22bdba2b..13b0c1c9 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java @@ -78,7 +78,7 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn if (StringUtil.isBlank(alias)) { return fnName + WrapperUtil.withBracket(sql); } - return fnName + WrapperUtil.withAlias(sql, dialect.wrap(alias), dialect); + return fnName + WrapperUtil.withAlias(sql, alias, dialect); } @Override diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java index b10f48b4..0c285ba1 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java @@ -45,7 +45,7 @@ public class SelectQueryColumn extends QueryColumn implements HasParamsColumn { String toSelectSql(List queryTables, IDialect dialect) { String selectSql = dialect.forSelectByQuery(queryWrapper); if (StringUtil.isNotBlank(selectSql) && StringUtil.isNotBlank(alias)) { - selectSql = WrapperUtil.withAlias(selectSql, dialect.wrap(alias), dialect); + selectSql = WrapperUtil.withAlias(selectSql, alias, dialect); } return selectSql; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java index 565c3b68..1433bafc 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java @@ -49,7 +49,7 @@ public class SelectQueryTable extends QueryTable { public String toSql(IDialect dialect) { String sql = dialect.buildSelectSql(queryWrapper); if (StringUtil.isNotBlank(alias)) { - return WrapperUtil.withAlias(sql, dialect.wrap(alias), dialect); + return WrapperUtil.withAlias(sql, alias, dialect); } else { return WrapperUtil.withBracket(sql); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java index 582bafc1..0659febd 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java @@ -65,7 +65,7 @@ public class StringFunctionQueryColumn extends QueryColumn { if (StringUtil.isBlank(alias)) { return fnName + WrapperUtil.withBracket(sql); } - return fnName + WrapperUtil.withAlias(sql, dialect.wrap(alias), dialect); + return fnName + WrapperUtil.withAlias(sql, alias, dialect); } @Override diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java index b1a91d24..b0c452b9 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java @@ -147,7 +147,7 @@ class WrapperUtil { } static String withAlias(String sql, String alias, IDialect dialect) { - return SqlConsts.BRACKET_LEFT + sql + SqlConsts.BRACKET_RIGHT + getAsKeyWord(dialect) + alias; + return SqlConsts.BRACKET_LEFT + sql + SqlConsts.BRACKET_RIGHT + getAsKeyWord(dialect) + dialect.wrap(alias); } static String buildAlias(String alias, IDialect dialect) { From d6076e39207156ea98697aa98b7d0e71a674f569 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 28 Jun 2023 22:26:54 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=20FunctionQueryC?= =?UTF-8?q?olumn=20=E4=BD=BF=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A=E7=9A=84?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/query/FunctionQueryColumn.java | 88 ++++++++++++++----- 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java index 13b0c1c9..c96872c2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java @@ -18,11 +18,14 @@ package com.mybatisflex.core.query; import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.constant.SqlConsts; import com.mybatisflex.core.dialect.IDialect; -import com.mybatisflex.core.util.ObjectUtil; +import com.mybatisflex.core.util.CollectionUtil; import com.mybatisflex.core.util.SqlUtil; import com.mybatisflex.core.util.StringUtil; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 数据库 聚合函数,例如 count(id) ,max(account.age) 等等 @@ -30,19 +33,25 @@ import java.util.List; public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn { protected String fnName; - protected QueryColumn column; + protected List columns; - public FunctionQueryColumn(String fnName, String column) { + public FunctionQueryColumn(String fnName) { SqlUtil.keepColumnSafely(fnName); - SqlUtil.keepColumnSafely(column); this.fnName = fnName; - this.column = new QueryColumn(column); + this.columns = new ArrayList<>(); } - public FunctionQueryColumn(String fnName, QueryColumn column) { - SqlUtil.keepColumnSafely(fnName); - this.fnName = fnName; - this.column = column; + public FunctionQueryColumn(String fnName, String... columns) { + this(fnName); + for (String column : columns) { + // SqlUtil.keepColumnSafely(column) + this.columns.add(new QueryColumn(column)); + } + } + + public FunctionQueryColumn(String fnName, QueryColumn... columns) { + this(fnName); + this.columns.addAll(Arrays.asList(columns)); } public String getFnName() { @@ -53,28 +62,35 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn this.fnName = fnName; } - public QueryColumn getColumn() { - return column; + public List getColumns() { + return columns; } - public void setColumn(QueryColumn column) { - this.column = column; + public void setColumns(List columns) { + this.columns = columns; } @Override public Object[] getParamValues() { - if (column instanceof HasParamsColumn) { - return ((HasParamsColumn) column).getParamValues(); + if (CollectionUtil.isEmpty(columns)) { + return FlexConsts.EMPTY_ARRAY; } - return FlexConsts.EMPTY_ARRAY; + + List params = new ArrayList<>(); + + for (QueryColumn queryColumn : columns) { + if (queryColumn instanceof HasParamsColumn) { + Object[] paramValues = ((HasParamsColumn) queryColumn).getParamValues(); + params.addAll(Arrays.asList(paramValues)); + } + } + + return params.toArray(); } @Override public String toSelectSql(List queryTables, IDialect dialect) { - String sql = column.toSelectSql(queryTables, dialect); - if (StringUtil.isBlank(sql)) { - return SqlConsts.EMPTY; - } + String sql = getSql(queryTables, dialect); if (StringUtil.isBlank(alias)) { return fnName + WrapperUtil.withBracket(sql); } @@ -83,11 +99,35 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn @Override String toConditionSql(List queryTables, IDialect dialect) { - String sql = column.toSelectSql(queryTables, dialect); + String sql = getSql(queryTables, dialect); + return fnName + WrapperUtil.withBracket(sql); + } + + /** + *

获取函数括号里面的 SQL 内容。 + * + *

如果函数括号里面没有内容,就返回空字符串,这样构建出来就是函数名加括号。 + * + *

例如,NOW() 函数的构建: + *

{@code
+     * FunctionQueryColumn c1 = new FunctionQueryColumn("NOW");
+     * FunctionQueryColumn c2 = new FunctionQueryColumn("NOW", new StringQueryColumn(""));
+     * }
+ */ + private String getSql(List queryTables, IDialect dialect) { + if (CollectionUtil.isEmpty(columns)) { + return SqlConsts.EMPTY; + } + + String sql = columns.stream() + .map(c -> c.toSelectSql(queryTables, dialect)) + .collect(Collectors.joining(SqlConsts.DELIMITER)); + if (StringUtil.isBlank(sql)) { return SqlConsts.EMPTY; } - return fnName + WrapperUtil.withBracket(sql); + + return sql; } @Override @@ -101,7 +141,7 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn public String toString() { return "FunctionQueryColumn{" + "fnName='" + fnName + '\'' + - ", column=" + column + + ", columns=" + columns + '}'; } @@ -109,7 +149,7 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn public FunctionQueryColumn clone() { FunctionQueryColumn clone = (FunctionQueryColumn) super.clone(); // deep clone ... - clone.column = ObjectUtil.clone(this.column); + clone.columns = CollectionUtil.cloneArrayList(this.columns); return clone; } From 93b4642e4ca9540458701a44e1d99dda3a34291b Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 28 Jun 2023 22:27:19 +0800 Subject: [PATCH 3/5] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=20FunctionQueryC?= =?UTF-8?q?olumn=20=E6=9E=84=E5=BB=BA=E5=87=BD=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/coretest/FunctionSqlTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java new file mode 100644 index 00000000..62f73ccb --- /dev/null +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.coretest; + +import com.mybatisflex.core.query.FunctionQueryColumn; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.query.StringQueryColumn; +import org.junit.Test; + +import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; + +/** + * @author 王帅 + * @since 2023-06-28 + */ +public class FunctionSqlTest { + + @Test + public void test() { + String sql = QueryWrapper.create() + .select(new FunctionQueryColumn("NOW").as("n1")) + .select(new FunctionQueryColumn("NOW", new StringQueryColumn("")).as("n2")) + .select(new FunctionQueryColumn("CONCAT", ACCOUNT.USER_NAME, ACCOUNT.AGE).as("c1")) + .from(ACCOUNT) + .toSQL(); + System.out.println(sql); + } + +} \ No newline at end of file From 9d31e8742a24b465b372cbd6a55514e388a15203 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 28 Jun 2023 22:47:00 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=20null=20?= =?UTF-8?q?=E5=80=BC=E8=BF=87=E6=BB=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/core/query/FunctionQueryColumn.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java index c96872c2..415cf14d 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FunctionQueryColumn.java @@ -25,6 +25,7 @@ import com.mybatisflex.core.util.StringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -120,6 +121,7 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn } String sql = columns.stream() + .filter(Objects::nonNull) .map(c -> c.toSelectSql(queryTables, dialect)) .collect(Collectors.joining(SqlConsts.DELIMITER)); From e4da76af74b7a38313c5385dbeaf5b9cfcbad098 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 28 Jun 2023 22:47:50 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20concat=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/query/QueryMethods.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java index 3d6116cd..4585b2a1 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java @@ -18,6 +18,9 @@ package com.mybatisflex.core.query; import com.mybatisflex.core.util.LambdaGetter; import com.mybatisflex.core.util.LambdaUtil; +import java.util.Arrays; +import java.util.List; + import static com.mybatisflex.core.constant.SqlConsts.*; public class QueryMethods { @@ -163,6 +166,15 @@ public class QueryMethods { return new StringFunctionQueryColumn(CONVERT, params); } + ///CONCAT + public static FunctionQueryColumn concat(String str1, String str2, String... more) { + List args = Arrays.asList(str1, str2); + args.addAll(Arrays.asList(more)); + String[] columns = new String[args.size()]; + args.toArray(columns); + return new FunctionQueryColumn("CONCAT", columns); + } + public static StringQueryColumn column(String column) { return new StringQueryColumn(column); }