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;
+    }
 }

Reply via email to