Browse Source

增加对枚举字典 any in的支持, 对应termType: ain和nain

zhou-hao 7 years ago
parent
commit
c2868ef9c6

+ 7 - 2
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/EasyOrmSqlBuilder.java

@@ -36,7 +36,6 @@ import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
 import org.hswebframework.ezorm.rdb.render.dialect.H2RDBDatabaseMetaData;
 import org.hswebframework.ezorm.rdb.render.dialect.MysqlRDBDatabaseMetaData;
 import org.hswebframework.ezorm.rdb.render.dialect.OracleRDBDatabaseMetaData;
-import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
 import org.hswebframework.ezorm.rdb.render.support.simple.CommonSqlRender;
 import org.hswebframework.ezorm.rdb.render.support.simple.SimpleWhereSqlBuilder;
 import org.hswebframework.web.BusinessException;
@@ -57,7 +56,6 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import static org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper.notSupportArray;
 import static org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper.supportArray;
 
 /**
@@ -108,17 +106,24 @@ public class EasyOrmSqlBuilder {
         Dialect.MYSQL.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.MYSQL, true)));
         Dialect.MYSQL.setTermTypeMapper(TermType.nin, supportArray(new MysqlEnumDicInTermTypeMapper(true)));
 
+        Dialect.MYSQL.setTermTypeMapper("ain", supportArray(new MysqlEnumDicInTermTypeMapper(true,true)));
+        Dialect.MYSQL.setTermTypeMapper("anin", supportArray(new MysqlEnumDicInTermTypeMapper(false,true)));
+
 
         Dialect.H2.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.H2, false)));
         Dialect.H2.setTermTypeMapper(TermType.in, supportArray(new H2EnumDicInTermTypeMapper(false)));
         Dialect.H2.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.H2, true)));
         Dialect.H2.setTermTypeMapper(TermType.nin, supportArray(new H2EnumDicInTermTypeMapper(true)));
+        Dialect.H2.setTermTypeMapper("ain", supportArray(new H2EnumDicInTermTypeMapper(true,true)));
+        Dialect.H2.setTermTypeMapper("anin", supportArray(new H2EnumDicInTermTypeMapper(false,true)));
 
 
         Dialect.ORACLE.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.ORACLE, false)));
         Dialect.ORACLE.setTermTypeMapper(TermType.in, supportArray(new OracleEnumDicInTermTypeMapper(false)));
         Dialect.ORACLE.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.ORACLE, true)));
         Dialect.ORACLE.setTermTypeMapper(TermType.nin, supportArray(new OracleEnumDicInTermTypeMapper(true)));
+        Dialect.ORACLE.setTermTypeMapper("ain", supportArray(new OracleEnumDicInTermTypeMapper(true,true)));
+        Dialect.ORACLE.setTermTypeMapper("anin", supportArray(new OracleEnumDicInTermTypeMapper(false,true)));
 
     }
 

+ 6 - 7
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/EnumDicInTermTypeMapper.java

@@ -14,12 +14,14 @@ import java.util.stream.Collectors;
 
 @AllArgsConstructor
 @SuppressWarnings("all")
-public class EnumDicInTermTypeMapper implements TermTypeMapper {
+public abstract class EnumDicInTermTypeMapper implements TermTypeMapper {
 
     protected Dialect dialect;
 
     protected boolean not;
 
+    protected boolean anyIn = false;
+
     protected boolean support(RDBColumnMetaData column) {
         Class type = column.getJavaType();
         if (type.isArray()) {
@@ -43,9 +45,9 @@ public class EnumDicInTermTypeMapper implements TermTypeMapper {
                 term.setValue(bit);
             } else {
                 return buildNotSupport(wherePrefix, term, column, tableAlias);
-
             }
         } else {
+            //类型不是数组
 //            if (support(column)) {
 //                if (value instanceof Collection) {
 //                    value = ((Collection) value).iterator().next();
@@ -65,7 +67,7 @@ public class EnumDicInTermTypeMapper implements TermTypeMapper {
         List<Object> values = param2list(term.getValue());
         term.setValue(values);
         SqlAppender appender = new SqlAppender();
-        appender.add(dialect.buildColumnName(tableAlias, column.getAlias()), not ? " NOT" : " ").add("IN(");
+        appender.add(dialect.buildColumnName(tableAlias, column.getName()), not ? " NOT" : " ").add("IN(");
         for (int i = 0; i < values.size(); i++) {
             appender.add("#{", wherePrefix, ".value[", i, "]}", ",");
         }
@@ -74,10 +76,7 @@ public class EnumDicInTermTypeMapper implements TermTypeMapper {
         return appender;
     }
 
-    protected SqlAppender build(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
-        return new SqlAppender()
-                .add(dialect.buildColumnName(tableAlias, column.getName()), not ? "!=" : "=", "#{", wherePrefix, ".value}");
-    }
+    protected abstract SqlAppender build(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias);
 
 
     protected List<Object> param2list(Object value) {

+ 6 - 2
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/h2/H2EnumDicInTermTypeMapper.java

@@ -9,7 +9,11 @@ import org.hswebframework.web.dao.mybatis.mapper.EnumDicInTermTypeMapper;
 public class H2EnumDicInTermTypeMapper extends EnumDicInTermTypeMapper {
 
     public H2EnumDicInTermTypeMapper(boolean not) {
-        super(Dialect.H2, not);
+        this(not, false);
+    }
+
+    public H2EnumDicInTermTypeMapper(boolean not, boolean anyIn) {
+        super(Dialect.H2, not,anyIn);
     }
 
     @Override
@@ -17,6 +21,6 @@ public class H2EnumDicInTermTypeMapper extends EnumDicInTermTypeMapper {
         String columnName = dialect.buildColumnName(tableAlias, column.getName());
         String where = "#{" + wherePrefix + ".value}";
         return new SqlAppender()
-                .add("BITAND(", columnName, ",", where, ")", not ? "!=" : "=", where);
+                .add("BITAND(", columnName, ",", where, ")", not ? "!=" : "=", anyIn ? "0" : where);
     }
 }

+ 8 - 2
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/mysql/MysqlEnumDicInTermTypeMapper.java

@@ -8,16 +8,22 @@ import org.hswebframework.web.dao.mybatis.mapper.EnumDicInTermTypeMapper;
 
 public class MysqlEnumDicInTermTypeMapper extends EnumDicInTermTypeMapper {
 
+
     public MysqlEnumDicInTermTypeMapper(boolean not) {
-        super(Dialect.MYSQL, not);
+        this(not, false);
+    }
+
+    public MysqlEnumDicInTermTypeMapper(boolean not, boolean anyIn) {
+        super(Dialect.MYSQL, not, anyIn);
     }
 
+
     @Override
     protected SqlAppender build(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
         String columnName = dialect.buildColumnName(tableAlias, column.getName());
         String where = "#{" + wherePrefix + ".value}";
         return new SqlAppender()
-                .add(columnName, " & ", where, not ? " != " : " = ", where);
+                .add(columnName, " & ", where, not ? " != " : " = ", anyIn ? "0" : where);
     }
 
 

+ 7 - 2
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/oracle/OracleEnumDicInTermTypeMapper.java

@@ -10,14 +10,19 @@ import org.hswebframework.web.dao.mybatis.mapper.EnumDicTermTypeMapper;
 public class OracleEnumDicInTermTypeMapper extends EnumDicInTermTypeMapper {
 
     public OracleEnumDicInTermTypeMapper(boolean not) {
-        super(Dialect.ORACLE, not);
+        this(not, false);
     }
 
+    public OracleEnumDicInTermTypeMapper(boolean not, boolean anyIn) {
+        super(Dialect.ORACLE, not, anyIn);
+    }
+
+
     @Override
     protected SqlAppender build(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
         String columnName = dialect.buildColumnName(tableAlias, column.getName());
         String where = "#{" + wherePrefix + ".value}";
         return new SqlAppender()
-                .add("BITAND(", columnName, ",", where, ")", not ? "!=" : "=", where);
+                .add("BITAND(", columnName, ",", where, ")", not ? "!=" : "=", anyIn ? "0" : where);
     }
 }

+ 6 - 0
hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java

@@ -129,6 +129,12 @@ public interface EnumDict<V> {
         return (bit & value) == value;
     }
 
+    @SafeVarargs
+    static <T extends EnumDict> boolean bitInAny(long bit, T... t) {
+        long value = toBit(t);
+        return (bit & value) != 0;
+    }
+
     static <T extends EnumDict> List<T> getByBit(Class<T> tClass, long bit) {
         List<T> arr = new ArrayList<>();
         for (T t : tClass.getEnumConstants()) {

+ 5 - 0
hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java

@@ -35,6 +35,11 @@ public class DictDefineTest {
 
         System.out.println(bitIn(bit,UserCode.SIMPLE,UserCode.TEST,UserCode.SIMPLE));
 
+        long bit2=toBit(UserCode.SIMPLE,UserCode.CODE0,UserCode.SIMPLE);
+
+        Assert.assertTrue(bitInAny(bit2,UserCode.SIMPLE,UserCode.CODE4,UserCode.CODE0));
+        Assert.assertFalse(bitInAny(bit2,UserCode.CODE1,UserCode.CODE4,UserCode.CODE5));
+
         for (UserCode userCode : UserCode.values()) {
             Assert.assertTrue(userCode.in(bit));
         }