This is an automated email from the ASF dual-hosted git repository.
wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git
The following commit(s) were added to refs/heads/main by this push:
new 8dd681d BIGTOP-4217: Add findByCondition for MyBatis (#61)
8dd681d is described below
commit 8dd681daf661d70dc03df890eefdf5113182c1fa
Author: timyuer <[email protected]>
AuthorDate: Tue Sep 10 13:37:57 2024 +0800
BIGTOP-4217: Add findByCondition for MyBatis (#61)
---
.../QueryCondition.java} | 64 ++++++-----
.../bigtop/manager/dao/{sql => enums}/DBType.java | 2 +-
.../dao/{sql/DBType.java => enums/QueryType.java} | 49 +++-----
.../bigtop/manager/dao/repository/BaseDao.java | 12 ++
.../bigtop/manager/dao/sql/BaseSqlProvider.java | 10 ++
.../apache/bigtop/manager/dao/sql/SQLBuilder.java | 126 +++++++++++++++++++++
6 files changed, 201 insertions(+), 62 deletions(-)
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/QueryCondition.java
similarity index 53%
copy from
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/QueryCondition.java
index c280c95..8e56269 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/QueryCondition.java
@@ -17,34 +17,38 @@
* under the License.
*/
-package org.apache.bigtop.manager.dao.sql;
-
-import java.util.stream.Stream;
-
-public enum DBType {
- MYSQL("mysql", "MYSQL"),
- DM("dm", "DaMeng");
-
- DBType(String code, String desc) {
- this.code = code;
- this.desc = desc;
- }
-
- private final String code;
- private final String desc;
-
- public String getCode() {
- return this.code;
- }
-
- public String getDesc() {
- return this.desc;
- }
-
- public static DBType toType(String databaseId) {
- return Stream.of(DBType.values())
- .filter(p -> p.getCode().equals(databaseId))
- .findFirst()
- .orElse(null);
- }
+package org.apache.bigtop.manager.dao.annotations;
+
+import org.apache.bigtop.manager.dao.enums.QueryType;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface QueryCondition {
+
+ /**
+ * queryType
+ */
+ QueryType queryType() default QueryType.EQ;
+
+ /**
+ * queryKey
+ */
+ String queryKey() default "";
+
+ /**
+ * pairDelimiter
+ * e.g. 1-2
+ */
+ String pairDelimiter() default "-";
+
+ /**
+ * multipleDelimiter
+ * e.g. 1,2,3
+ */
+ String multipleDelimiter() default ",";
}
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/enums/DBType.java
similarity index 96%
copy from
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/enums/DBType.java
index c280c95..8cbe466 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/enums/DBType.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.bigtop.manager.dao.sql;
+package org.apache.bigtop.manager.dao.enums;
import java.util.stream.Stream;
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/enums/QueryType.java
similarity index 55%
rename from
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
rename to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/enums/QueryType.java
index c280c95..7943239 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/DBType.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/enums/QueryType.java
@@ -16,35 +16,22 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-package org.apache.bigtop.manager.dao.sql;
-
-import java.util.stream.Stream;
-
-public enum DBType {
- MYSQL("mysql", "MYSQL"),
- DM("dm", "DaMeng");
-
- DBType(String code, String desc) {
- this.code = code;
- this.desc = desc;
- }
-
- private final String code;
- private final String desc;
-
- public String getCode() {
- return this.code;
- }
-
- public String getDesc() {
- return this.desc;
- }
-
- public static DBType toType(String databaseId) {
- return Stream.of(DBType.values())
- .filter(p -> p.getCode().equals(databaseId))
- .findFirst()
- .orElse(null);
- }
+package org.apache.bigtop.manager.dao.enums;
+
+public enum QueryType {
+ EQ,
+ NOT_EQ,
+ IN,
+ NOT_IN,
+ GT,
+ GTE,
+ LT,
+ LTE,
+ BETWEEN,
+ PREFIX_LIKE,
+ SUFFIX_LIKE,
+ LIKE,
+ NOT_LIKE,
+ NULL,
+ NOT_NULL,
}
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
index ff8b969..2c85e6f 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
@@ -72,9 +72,21 @@ public interface BaseDao<Entity> {
@SelectProvider(type = BaseSqlProvider.class, method = "selectAll")
List<Entity> findAll();
+ /**
+ * Query all entities.
+ */
+ @SelectProvider(type = BaseSqlProvider.class, method = "findByCondition")
+ <Condition> List<Entity> findByCondition(Condition condition);
+
+ /**
+ * Delete the entity by primary key.
+ */
@DeleteProvider(type = BaseSqlProvider.class, method = "deleteById")
boolean deleteById(Serializable id);
+ /**
+ * Delete the entity by primary key.
+ */
@DeleteProvider(type = BaseSqlProvider.class, method = "deleteByIds")
boolean deleteByIds(Collection<? extends Serializable> ids);
}
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
index 52966b4..09eaf94 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
@@ -84,6 +84,16 @@ public class BaseSqlProvider {
return SQLBuilder.selectAll(tableMetaData, databaseId);
}
+ public <Condition> String findByCondition(Condition condition,
ProviderContext context)
+ throws IllegalAccessException {
+ String databaseId = context.getDatabaseId();
+
+ Class<?> entityClass = getEntityClass(context);
+ TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
+
+ return SQLBuilder.findByCondition(tableMetaData, databaseId,
condition);
+ }
+
public String deleteById(Serializable id, ProviderContext context) {
String databaseId = context.getDatabaseId();
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
index 2f3b120..ce729c7 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
@@ -19,6 +19,10 @@
package org.apache.bigtop.manager.dao.sql;
+import org.apache.bigtop.manager.common.utils.ClassUtils;
+import org.apache.bigtop.manager.dao.annotations.QueryCondition;
+import org.apache.bigtop.manager.dao.enums.DBType;
+
import org.apache.ibatis.jdbc.SQL;
import org.springframework.beans.BeanUtils;
@@ -29,7 +33,10 @@ import lombok.extern.slf4j.Slf4j;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.text.MessageFormat;
import java.util.Collection;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -195,6 +202,24 @@ public class SQLBuilder {
return sql.toString();
}
+ public static <Condition> String findByCondition(
+ TableMetaData tableMetaData, String databaseId, Condition
condition) throws IllegalAccessException {
+ String tableName = tableMetaData.getTableName();
+ log.info("databaseId: {}", databaseId);
+ SQL sql = new SQL();
+ switch (DBType.toType(databaseId)) {
+ case MYSQL: {
+ sql = mysqlCondition(condition, tableName);
+ break;
+ }
+ default: {
+ log.error("Unsupported data source");
+ }
+ }
+
+ return sql.toString();
+ }
+
private static String getEquals(String column, String property) {
return column + " = " + getTokenParam(property);
}
@@ -202,4 +227,105 @@ public class SQLBuilder {
private static String getTokenParam(String property) {
return "#{" + property + "}";
}
+
+ private static <Condition> SQL mysqlCondition(Condition condition, String
tableName) throws IllegalAccessException {
+
+ Class<?> loadClass;
+ try {
+ loadClass = condition.getClass();
+ } catch (Exception e) {
+ throw new RuntimeException("Get class Error!!!");
+ }
+
+ List<Field> fieldList = ClassUtils.getFields(loadClass);
+ /* Prepare SQL */
+ SQL sql = new SQL();
+ sql.SELECT("*");
+ sql.FROM(tableName);
+ for (Field field : fieldList) {
+ field.setAccessible(true);
+ String fieldName = field.getName();
+ log.debug("[requestField] {}, [requestValue] {}", fieldName,
field.get(condition));
+ if (field.isAnnotationPresent(QueryCondition.class) &&
Objects.nonNull(field.get(condition))) {
+ QueryCondition annotation =
field.getAnnotation(QueryCondition.class);
+
+ String queryKey = fieldName;
+ if (!annotation.queryKey().isEmpty()) {
+ queryKey = annotation.queryKey();
+ }
+
+ log.info(
+ "[queryKey] {}, [queryType] {}, [queryValue] {}",
+ queryKey,
+ annotation.queryType().toString(),
+ field.get(condition));
+
+ Object value = field.get(condition);
+ if (value != null) {
+ switch (annotation.queryType()) {
+ case EQ:
+ sql.WHERE(MessageFormat.format("{0} = ''{1}''",
queryKey, value));
+ break;
+ case NOT_EQ:
+ sql.WHERE(MessageFormat.format("{0} != ''{1}''",
queryKey, value));
+ break;
+ case IN:
+ sql.WHERE(MessageFormat.format(
+ "{0} IN (''{1}'')",
+ queryKey,
+ String.join("','",
value.toString().split(annotation.multipleDelimiter()))));
+ break;
+ case NOT_IN:
+ sql.WHERE(MessageFormat.format(
+ "{0} NOT IN (''{1}'')",
+ queryKey,
+ String.join("','",
value.toString().split(annotation.multipleDelimiter()))));
+ break;
+ case GT:
+ sql.WHERE(MessageFormat.format("{0} > ''{1}''",
queryKey, value));
+ break;
+ case GTE:
+ sql.WHERE(MessageFormat.format("{0} >= ''{1}''",
queryKey, value));
+ break;
+ case LT:
+ sql.WHERE(MessageFormat.format("{0} < ''{1}''",
queryKey, value));
+ break;
+ case LTE:
+ sql.WHERE(MessageFormat.format("{0} <= ''{1}''",
queryKey, value));
+ break;
+ case BETWEEN:
+ String[] valueArr =
field.get(condition).toString().split(annotation.pairDelimiter());
+ if (valueArr.length == 2) {
+ sql.WHERE(MessageFormat.format(
+ "{0} BETWEEN ''{1}'' AND ''{2}''",
queryKey, valueArr[0], valueArr[1]));
+ }
+ break;
+ case PREFIX_LIKE:
+ sql.WHERE(MessageFormat.format("{0} LIKE
CONCAT(''{1}'', ''%'')", queryKey, value));
+ break;
+ case SUFFIX_LIKE:
+ sql.WHERE(MessageFormat.format("{0} LIKE
CONCAT(''%'', ''{1}'')", queryKey, value));
+ break;
+ case LIKE:
+ sql.WHERE(MessageFormat.format("{0} LIKE
CONCAT(''%'', ''{1}'', ''%'')", queryKey, value));
+ break;
+ case NOT_LIKE:
+ sql.WHERE(MessageFormat.format(
+ "{0} NOT LIKE CONCAT(''%'', ''{1}'',
''%'')", queryKey, value));
+ break;
+ case NULL:
+ sql.WHERE(queryKey + " IS NULL");
+ break;
+ case NOT_NULL:
+ sql.WHERE(queryKey + " IS NOT NULL");
+ break;
+ default:
+ log.warn("Unknown query type: {}",
annotation.queryType());
+ }
+ }
+ }
+ }
+
+ return sql;
+ }
}