diff --git a/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java b/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java index f709bdff..812d788e 100644 --- a/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java +++ b/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java @@ -26,6 +26,11 @@ import org.jetlinks.community.utils.ConverterUtils; import org.jetlinks.community.utils.ReactorUtils; import org.jetlinks.core.metadata.DataType; import org.jetlinks.core.metadata.types.*; +import org.jetlinks.core.utils.Reactors; +import org.jetlinks.reactor.ql.supports.filter.BetweenFilter; +import org.jetlinks.reactor.ql.supports.filter.LikeFilter; +import org.jetlinks.reactor.ql.utils.CastUtils; +import org.jetlinks.reactor.ql.utils.CompareUtils; import reactor.core.publisher.Mono; import java.util.*; @@ -41,6 +46,11 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public boolean isSupported(DataType type) { return !type.getType().equals(ArrayType.ID) && super.isSupported(type); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + return CompareUtils.compare(expect, actual) == 0; + } }, neq("不等于", "neq") { @Override @@ -48,15 +58,20 @@ public enum FixedTermTypeSupport implements TermTypeSupport { return !type.getType().equals(ArrayType.ID) && super.isSupported(type); } + @Override + public boolean matchBlocking(Object expect, Object actual) { + return CompareUtils.compare(expect, actual) != 0; + } }, notnull("不为空", "notnull", false) { @Override protected String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s%s", property, getName()); } + @Override - protected Object getExpectRef(String col) { - return 1; + public boolean matchBlocking(Object expect, Object actual) { + return actual != null; } }, isnull("为空", "isnull", false) { @@ -64,18 +79,49 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s%s", property, getName()); } + @Override - protected Object getExpectRef(String col) { - return 1; + public boolean matchBlocking(Object expect, Object actual) { + return actual == null; + } + + }, + + gt("大于", "gt", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID) { + @Override + public boolean matchBlocking(Object expect, Object actual) { + return CompareUtils.compare(expect, actual) > 0; + } + }, + gte("大于等于", "gte", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID) { + @Override + public boolean matchBlocking(Object expect, Object actual) { + return CompareUtils.compare(expect, actual) >= 0; + } + }, + lt("小于", "lt", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID) { + @Override + public boolean matchBlocking(Object expect, Object actual) { + return CompareUtils.compare(expect, actual) < 0; + } + }, + lte("小于等于", "lte", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID) { + @Override + public boolean matchBlocking(Object expect, Object actual) { + return CompareUtils.compare(expect, actual) <= 0; } }, - gt("大于", "gt", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID), - gte("大于等于", "gte", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID), - lt("小于", "lt", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID), - lte("小于等于", "lte", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID), - btw("在...之间", "btw", DateTimeType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID) { + @Override + public boolean matchBlocking(Object expect, Object actual) { + List castArray = ConverterUtils.convertToList(expect); + if (castArray.size() > 1) { + return BetweenFilter.predicate(actual, castArray.get(0), castArray.get(1)); + } + return false; + } + @Override protected Object convertValue(Object val, Term term) { return val; @@ -106,6 +152,16 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s不在%s之间", property, createValueDesc(expect)); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + List castArray = ConverterUtils.convertToList(expect); + if (castArray.size() > 1) { + return !BetweenFilter.predicate(actual, castArray.get(0), castArray.get(1)); + } + return true; + } + }, in("在...之中", "in", StringType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID, EnumType.ID) { @Override @@ -122,6 +178,14 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s在%s之中", property, createValueDesc(expect)); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + return ConverterUtils + .convertToList(expect) + .stream() + .anyMatch(o -> CompareUtils.compare(o, actual) == 0); + } }, nin("不在...之中", "nin", StringType.ID, ShortType.ID, IntType.ID, LongType.ID, FloatType.ID, DoubleType.ID, EnumType.ID) { @Override @@ -138,6 +202,14 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s不在%s之中", property, createValueDesc(expect)); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + return ConverterUtils + .convertToList(expect) + .stream() + .noneMatch(o -> CompareUtils.compare(o, actual) == 0); + } }, contains_all("全部包含在...之中", "contains_all", ArrayType.ID) { @Override @@ -154,6 +226,17 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s全部包含在%s之中", property, createValueDesc(expect)); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + if (actual == null) { + return false; + } + TreeSet left = + CastUtils.castCollection(expect, new TreeSet<>(CompareUtils::compare)); + + return left.containsAll(ConverterUtils.convertToList(actual)); + } }, contains_any("任意包含在...之中", "contains_any", ArrayType.ID) { @Override @@ -170,6 +253,17 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s任意包含在%s之中", property, createValueDesc(expect)); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + TreeSet left = + CastUtils.castCollection(expect, new TreeSet<>(CompareUtils::compare)); + + return ConverterUtils + .convertToList(actual) + .stream() + .anyMatch(val -> CompareUtils.contains(left, val)); + } }, not_contains("不包含在...之中", "not_contains", ArrayType.ID) { @Override @@ -186,6 +280,17 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s不包含在%s之中", property, createValueDesc(expect)); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + TreeSet left = + CastUtils.castCollection(expect, new TreeSet<>(CompareUtils::compare)); + + return ConverterUtils + .convertToList(actual) + .stream() + .noneMatch(val -> CompareUtils.contains(left, val)); + } }, like("包含字符", "str_like", StringType.ID) { @@ -201,12 +306,25 @@ public enum FixedTermTypeSupport implements TermTypeSupport { } return val; } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + if (expect instanceof String && !((String) expect).contains("%")) { + expect = "%" + expect + "%"; + } + return LikeFilter.doTest(false, actual, expect); + } }, nlike("不包含字符", "str_nlike", StringType.ID) { @Override protected Object convertValue(Object val, Term term) { return like.convertValue(val, term); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + return LikeFilter.doTest(true, actual, expect); + } }, // gt(math.sub(column,now()),?) @@ -225,6 +343,13 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s距离当前时间大于%s秒", property, expect); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + long cast = CastUtils.castNumber(expect).longValue(); + long now = System.currentTimeMillis(); + return cast > now / 1000; + } }, time_lt_now("距离当前时间小于...秒", "time_lt_now", DateTimeType.ID) { @Override @@ -241,6 +366,13 @@ public enum FixedTermTypeSupport implements TermTypeSupport { public String createDefaultDesc(String property, Object expect, Object actual) { return String.format("%s距离当前时间小于%s秒", property, expect); } + + @Override + public boolean matchBlocking(Object expect, Object actual) { + long cast = CastUtils.castNumber(expect).longValue(); + long now = System.currentTimeMillis(); + return cast < now / 1000; + } }; private final String text; @@ -353,31 +485,9 @@ public enum FixedTermTypeSupport implements TermTypeSupport { ); } - protected Object getExpectRef(String col){ - return NativeSql.of(col); - } - private Function> createFilter() { - Term term = new Term(); - term.setTermType(getType()); - term.setColumn("_actual"); - term.setValue(getExpectRef("_expect")); - return ReactorUtils.createFilter(Collections.singletonList(term)); - } - - private volatile Function> filter; - @Override public Mono match(Object expect, Object actual) { - if (filter == null) { - synchronized (this) { - if (filter == null) { - filter = createFilter(); - } - } - } - Map val = new HashMap<>(); - val.put("_actual", actual); - val.put("_expect", expect); - return filter.apply(val); + return matchBlocking(expect, actual) ? Reactors.ALWAYS_TRUE : Reactors.ALWAYS_FALSE; } + } diff --git a/pom.xml b/pom.xml index cb0cba9a..7234cb13 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ 1.0.6 - 1.0.19 + 1.0.20-SNAPSHOT 1.0.5-SNAPSHOT