From 700ef231dfaed033bb59d0a1ad8106c8724c9d94 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 10 Nov 2023 13:44:56 +0800 Subject: [PATCH] =?UTF-8?q?FilterNode=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/convert/ObjectDecoder.java | 23 +- .../org/redkale/convert/ObjectEncoder.java | 37 +- .../redkale/source/AbstractDataSource.java | 28 +- .../redkale/source/AbstractDataSqlSource.java | 10 +- .../org/redkale/source/DataJdbcSource.java | 2 +- .../java/org/redkale/source/FilterColumn.java | 2 +- .../org/redkale/source/FilterExpress.java | 122 +++- .../org/redkale/source/FilterJoinNode.java | 4 +- .../java/org/redkale/source/FilterNode.java | 665 +++++++++++++++--- .../org/redkale/source/FilterNodeBean.java | 22 +- .../java/org/redkale/source/FilterNodes.java | 571 +++++++++++++++ .../java/org/redkale/source/FilterValue.java | 6 +- src/main/java/org/redkale/util/AnyValue.java | 7 + src/main/java/org/redkale/util/Utility.java | 21 + .../convert/protobuf/PBCustMessage2Test.java | 32 +- .../convert/protobuf/PBCustMessageTest.java | 11 +- .../redkale/test/source/CacheTestBean.java | 12 +- .../redkale/test/source/FilterNodeTest.java | 26 +- .../redkale/test/source/TestSourceCache.java | 6 +- 19 files changed, 1383 insertions(+), 224 deletions(-) create mode 100644 src/main/java/org/redkale/source/FilterNodes.java diff --git a/src/main/java/org/redkale/convert/ObjectDecoder.java b/src/main/java/org/redkale/convert/ObjectDecoder.java index 169f2288b..8a4783ac4 100644 --- a/src/main/java/org/redkale/convert/ObjectDecoder.java +++ b/src/main/java/org/redkale/convert/ObjectDecoder.java @@ -218,21 +218,19 @@ public class ObjectDecoder implements Decodeable { } if (cps != null) { //可能存在某些构造函数中的字段名不存在setter方法 for (final String constructorField : cps) { - boolean flag = false; - for (DeMember m : list) { - if (m.attribute.field().equals(constructorField)) { - flag = true; - break; - } - } - if (flag) { + if (Utility.contains(list, m -> m.attribute.field().equals(constructorField))) { continue; } //不存在setter方法 try { Field f = clazz.getDeclaredField(constructorField); + ConvertColumnEntry ref2 = factory.findRef(clazz, f); Type t = TypeToken.createClassType(f.getGenericType(), this.type); - list.add(new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, f, null, null), factory.loadDecoder(t), f, null)); + DeMember member = new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, f, null, null), factory.loadDecoder(t), f, null); + if (ref2 != null) { + member.index = ref2.getIndex(); + } + list.add(member); } catch (NoSuchFieldException nsfe) { //不存在field, 可能存在getter方法 char[] fs = constructorField.toCharArray(); fs[0] = Character.toUpperCase(fs[0]); @@ -243,8 +241,13 @@ public class ObjectDecoder implements Decodeable { } catch (NoSuchMethodException ex) { getter = clazz.getMethod("is" + mn); } + ConvertColumnEntry ref2 = factory.findRef(clazz, getter); Type t = TypeToken.createClassType(TypeToken.getGenericType(getter.getGenericParameterTypes()[0], this.type), this.type); - list.add(new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, null, getter, null), factory.loadDecoder(t), ConvertFactory.readGetSetField(getter), getter)); + DeMember member = new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, null, getter, null), factory.loadDecoder(t), ConvertFactory.readGetSetField(getter), getter); + if (ref2 != null) { + member.index = ref2.getIndex(); + } + list.add(member); } } } diff --git a/src/main/java/org/redkale/convert/ObjectEncoder.java b/src/main/java/org/redkale/convert/ObjectEncoder.java index 1985d25d1..0785c8264 100644 --- a/src/main/java/org/redkale/convert/ObjectEncoder.java +++ b/src/main/java/org/redkale/convert/ObjectEncoder.java @@ -139,8 +139,8 @@ public class ObjectEncoder implements Encodeable { if (factory.isConvertDisabled(method)) { continue; } - String convertname = ConvertFactory.readGetSetFieldName(method); - if (reversible && (cps == null || !contains(cps, convertname))) { + String convertName = ConvertFactory.readGetSetFieldName(method); + if (reversible && (cps == null || !contains(cps, convertName))) { boolean is = method.getName().startsWith("is"); try { clazz.getMethod(method.getName().replaceFirst(is ? "is" : "get", "set"), method.getReturnType()); @@ -155,7 +155,7 @@ public class ObjectEncoder implements Encodeable { ConvertSmallString small = method.getAnnotation(ConvertSmallString.class); if (small == null) { try { - Field f = clazz.getDeclaredField(convertname); + Field f = clazz.getDeclaredField(convertName); if (f != null) { small = f.getAnnotation(ConvertSmallString.class); } @@ -179,31 +179,33 @@ public class ObjectEncoder implements Encodeable { fieldCoder = colFactory.loadEncoder(t); } EnMember member = new EnMember(createAttribute(colFactory, type, clazz, null, method, null), fieldCoder, maybeField, method); + if (Utility.contains(list, m -> m.attribute.field().equals(member.attribute.field()))) { + continue; + } if (ref != null) { member.index = ref.getIndex(); } list.add(member); } + List sorts = new ArrayList<>(list); if (cps != null) { Set dissorts = new LinkedHashSet<>(list); for (final String constructorField : cps) { //reversible模式下需要确保DeMember与EnMember的个数和顺序保持一致,不然postition会不一致导致反序列化对应的字段顺序不同 - boolean flag = false; - for (EnMember m : dissorts) { - if (m.attribute.field().equals(constructorField)) { - flag = true; - break; - } - } - if (flag) { + if (Utility.contains(dissorts, m -> m.attribute.field().equals(constructorField))) { continue; } //不存在setter方法 try { Field f = clazz.getDeclaredField(constructorField); - Type t = TypeToken.createClassType(f.getGenericType(), this.type); + ConvertColumnEntry ref2 = factory.findRef(clazz, f); + //Type t = TypeToken.createClassType(f.getGenericType(), this.type); try { - dissorts.add(new EnMember(createAttribute(factory, type, clazz, f, null, null), null, f, null)); //虚构 + EnMember member = new EnMember(createAttribute(factory, type, clazz, f, null, null), null, f, null); + if (ref2 != null) { + member.index = ref2.getIndex(); + } + dissorts.add(member); //虚构 } catch (RuntimeException e) { //do nothing } @@ -217,9 +219,14 @@ public class ObjectEncoder implements Encodeable { } catch (NoSuchMethodException ex) { getter = clazz.getMethod("is" + mn); } - Type t = TypeToken.createClassType(TypeToken.getGenericType(getter.getGenericParameterTypes()[0], this.type), this.type); + ConvertColumnEntry ref2 = factory.findRef(clazz, getter); + //Type t = TypeToken.createClassType(TypeToken.getGenericType(getter.getGenericParameterTypes()[0], this.type), this.type); try { - dissorts.add(new EnMember(createAttribute(factory, type, clazz, null, getter, null), null, null, null)); //虚构 + EnMember member = new EnMember(createAttribute(factory, type, clazz, null, getter, null), null, null, null); + if (ref2 != null) { + member.index = ref2.getIndex(); + } + dissorts.add(member); //虚构 } catch (RuntimeException e) { //do nothing } diff --git a/src/main/java/org/redkale/source/AbstractDataSource.java b/src/main/java/org/redkale/source/AbstractDataSource.java index e2fab9df4..7b187e39e 100644 --- a/src/main/java/org/redkale/source/AbstractDataSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSource.java @@ -698,12 +698,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data @Override public T find(final Class clazz, final String column, final Serializable colval) { - return find(clazz, null, FilterNode.create(column, colval)); + return find(clazz, null, FilterNodes.create(column, colval)); } @Override public CompletableFuture findAsync(final Class clazz, final String column, final Serializable colval) { - return findAsync(clazz, null, FilterNode.create(column, colval)); + return findAsync(clazz, null, FilterNodes.create(column, colval)); } @Override @@ -789,12 +789,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data //-----------------------list set---------------------------- @Override public Set queryColumnSet(final String selectedColumn, final Class clazz, final String column, final Serializable colval) { - return queryColumnSet(selectedColumn, clazz, null, FilterNode.create(column, colval)); + return queryColumnSet(selectedColumn, clazz, null, FilterNodes.create(column, colval)); } @Override public CompletableFuture> queryColumnSetAsync(final String selectedColumn, final Class clazz, final String column, final Serializable colval) { - return queryColumnSetAsync(selectedColumn, clazz, null, FilterNode.create(column, colval)); + return queryColumnSetAsync(selectedColumn, clazz, null, FilterNodes.create(column, colval)); } @Override @@ -829,12 +829,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data @Override public List queryColumnList(final String selectedColumn, final Class clazz, final String column, final Serializable colval) { - return queryColumnList(selectedColumn, clazz, null, FilterNode.create(column, colval)); + return queryColumnList(selectedColumn, clazz, null, FilterNodes.create(column, colval)); } @Override public CompletableFuture> queryColumnListAsync(final String selectedColumn, final Class clazz, final String column, final Serializable colval) { - return queryColumnListAsync(selectedColumn, clazz, null, FilterNode.create(column, colval)); + return queryColumnListAsync(selectedColumn, clazz, null, FilterNodes.create(column, colval)); } @Override @@ -986,12 +986,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data */ @Override public Set querySet(final Class clazz, final String column, final Serializable colval) { - return querySet(clazz, (SelectColumn) null, null, FilterNode.create(column, colval)); + return querySet(clazz, (SelectColumn) null, null, FilterNodes.create(column, colval)); } @Override public CompletableFuture> querySetAsync(final Class clazz, final String column, final Serializable colval) { - return querySetAsync(clazz, (SelectColumn) null, null, FilterNode.create(column, colval)); + return querySetAsync(clazz, (SelectColumn) null, null, FilterNodes.create(column, colval)); } @Override @@ -1065,12 +1065,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data @Override public Set querySet(final Class clazz, final Flipper flipper, final String column, final Serializable colval) { - return querySet(clazz, null, flipper, FilterNode.create(column, colval)); + return querySet(clazz, null, flipper, FilterNodes.create(column, colval)); } @Override public CompletableFuture> querySetAsync(final Class clazz, final Flipper flipper, final String column, final Serializable colval) { - return querySetAsync(clazz, null, flipper, FilterNode.create(column, colval)); + return querySetAsync(clazz, null, flipper, FilterNodes.create(column, colval)); } @Override @@ -1115,12 +1115,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data */ @Override public List queryList(final Class clazz, final String column, final Serializable colval) { - return queryList(clazz, (SelectColumn) null, null, FilterNode.create(column, colval)); + return queryList(clazz, (SelectColumn) null, null, FilterNodes.create(column, colval)); } @Override public CompletableFuture> queryListAsync(final Class clazz, final String column, final Serializable colval) { - return queryListAsync(clazz, (SelectColumn) null, null, FilterNode.create(column, colval)); + return queryListAsync(clazz, (SelectColumn) null, null, FilterNodes.create(column, colval)); } @Override @@ -1194,12 +1194,12 @@ public abstract class AbstractDataSource extends AbstractService implements Data @Override public List queryList(final Class clazz, final Flipper flipper, final String column, final Serializable colval) { - return queryList(clazz, null, flipper, FilterNode.create(column, colval)); + return queryList(clazz, null, flipper, FilterNodes.create(column, colval)); } @Override public CompletableFuture> queryListAsync(final Class clazz, final Flipper flipper, final String column, final Serializable colval) { - return queryListAsync(clazz, null, flipper, FilterNode.create(column, colval)); + return queryListAsync(clazz, null, flipper, FilterNodes.create(column, colval)); } @Override diff --git a/src/main/java/org/redkale/source/AbstractDataSqlSource.java b/src/main/java/org/redkale/source/AbstractDataSqlSource.java index 7d80bbda3..aee4efd39 100644 --- a/src/main/java/org/redkale/source/AbstractDataSqlSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSqlSource.java @@ -2126,7 +2126,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement String column = info.getPrimary().field(); int c = 0; for (Serializable id : pks) { - Sheet sheet = querySheet(false, true, false, clazz, null, FLIPPER_ONE, FilterNode.create(column, id)); + Sheet sheet = querySheet(false, true, false, clazz, null, FLIPPER_ONE, FilterNodes.create(column, id)); T value = sheet.isEmpty() ? null : sheet.list().get(0); if (value != null) { c += cache.update(value); @@ -2554,7 +2554,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement protected CompletableFuture findsDBAsync(final EntityInfo info, final SelectColumn selects, Serializable... pks) { final Attribute primary = info.getPrimary(); - return queryListAsync(info.getType(), selects, null, FilterNode.create(info.getPrimarySQLColumn(), FilterExpress.IN, pks)).thenApply(list -> { + return queryListAsync(info.getType(), selects, null, FilterNodes.in(info.getPrimarySQLColumn(), pks)).thenApply(list -> { T[] rs = info.getArrayer().apply(pks.length); for (int i = 0; i < rs.length; i++) { T t = null; @@ -2580,7 +2580,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement public CompletableFuture> findsListAsync(final Class clazz, final Stream pks) { final EntityInfo info = loadEntityInfo(clazz); Serializable[] ids = pks.toArray(serialArrayFunc); - return queryListAsync(info.getType(), null, null, FilterNode.create(info.getPrimarySQLColumn(), FilterExpress.IN, ids)); + return queryListAsync(info.getType(), null, null, FilterNodes.in(info.getPrimarySQLColumn(), ids)); } @Override @@ -3077,7 +3077,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement final ArrayList ids = new ArrayList<>(); keyStream.forEach(k -> ids.add(k)); final Attribute primary = info.getPrimary(); - List rs = queryList(clazz, FilterNode.create(primary.field(), ids)); + List rs = queryList(clazz, FilterNodes.in(primary.field(), ids)); Map map = new LinkedHashMap<>(); if (rs.isEmpty()) { return new LinkedHashMap<>(); @@ -3097,7 +3097,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement final ArrayList pks = new ArrayList<>(); keyStream.forEach(k -> pks.add(k)); final Attribute primary = info.getPrimary(); - return queryListAsync(clazz, FilterNode.create(primary.field(), pks)).thenApply((List rs) -> { + return queryListAsync(clazz, FilterNodes.in(primary.field(), pks)).thenApply((List rs) -> { Map map = new LinkedHashMap<>(); if (rs.isEmpty()) { return new LinkedHashMap<>(); diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index 101c3f542..970ecd6e2 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -2192,7 +2192,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { } } } else { - return queryList(info.getType(), null, null, FilterNode.create(info.getPrimarySQLColumn(), FilterExpress.IN, ids)); + return queryList(info.getType(), null, null, FilterNodes.in(info.getPrimarySQLColumn(), ids)); } } diff --git a/src/main/java/org/redkale/source/FilterColumn.java b/src/main/java/org/redkale/source/FilterColumn.java index 1379231fb..1b98b0c21 100644 --- a/src/main/java/org/redkale/source/FilterColumn.java +++ b/src/main/java/org/redkale/source/FilterColumn.java @@ -54,7 +54,7 @@ public @interface FilterColumn { * * @return 字段表达式 */ - FilterExpress express() default FilterExpress.EQUAL; + FilterExpress express() default FilterExpress.EQ; /** diff --git a/src/main/java/org/redkale/source/FilterExpress.java b/src/main/java/org/redkale/source/FilterExpress.java index 290ade443..2be931d65 100644 --- a/src/main/java/org/redkale/source/FilterExpress.java +++ b/src/main/java/org/redkale/source/FilterExpress.java @@ -15,48 +15,108 @@ package org.redkale.source; */ public enum FilterExpress { - EQUAL("="), - IGNORECASEEQUAL("="),//不区分大小写的 = - NOTEQUAL("<>"), - IGNORECASENOTEQUAL("="),//不区分大小写的 <> - GREATERTHAN(">"), - LESSTHAN("<"), - GREATERTHANOREQUALTO(">="), - LESSTHANOREQUALTO("<="), - STARTSWITH("LIKE"), - NOTSTARTSWITH("NOT LIKE"), - ENDSWITH("LIKE"), - NOTENDSWITH("NOT LIKE"), + EQ("="), + IG_EQ("="),//不区分大小写的 = + NOT_EQ("<>"), // + IG_NOT_EQ("="),//不区分大小写的 <> + GT(">"), + LT("<"), + GE(">="), + LE("<="), LIKE("LIKE"), - NOTLIKE("NOT LIKE"), - IGNORECASELIKE("LIKE"), //不区分大小写的 LIKE - IGNORECASENOTLIKE("NOT LIKE"), //不区分大小写的 NOT LIKE - LENGTH_EQUAL("="), //字符串值的长度 - LENGTH_LESSTHAN("<"), //字符串值的长度 < - LENGTH_LESSTHANOREQUALTO("<="), //字符串值的长度 <= - LENGTH_GREATERTHAN(">"), //字符串值的长度 > - LENGTH_GREATERTHANOREQUALTO(">="), //字符串值的长度 >= + NOT_LIKE("NOT LIKE"), + IG_LIKE("LIKE"), //不区分大小写的 LIKE + IG_NOT_LIKE("NOT LIKE"), //不区分大小写的 NOT LIKE + STARTS("LIKE"), + ENDS("LIKE"), + NOT_STARTS("NOT LIKE"), + NOT_ENDS("NOT LIKE"), + LEN_EQ("="), //字符串值的长度 + LEN_GT(">"), //字符串值的长度 > + LEN_LT("<"), //字符串值的长度 < + LEN_GE(">="), //字符串值的长度 >= + LEN_LE("<="), //字符串值的长度 <= CONTAIN("CONTAIN"), //包含, 相当于反向LIKE - NOTCONTAIN("NOT CONTAIN"), //不包含, 相当于反向LIKE - IGNORECASECONTAIN("CONTAIN"), //不区分大小写的 CONTAIN - IGNORECASENOTCONTAIN("NOT CONTAIN"), //不区分大小写的 NOT CONTAIN + NOT_CONTAIN("NOT CONTAIN"), //不包含, 相当于反向LIKE + IG_CONTAIN("CONTAIN"), //不区分大小写的 CONTAIN + IG_NOT_CONTAIN("NOT CONTAIN"), //不区分大小写的 NOT CONTAIN BETWEEN("BETWEEN"), - NOTBETWEEN("NOT BETWEEN"), + NOT_BETWEEN("NOT BETWEEN"), IN("IN"), - NOTIN("NOT IN"), - ISNULL("IS NULL"), - ISNOTNULL("IS NOT NULL"), - ISEMPTY("="),//值为空 - ISNOTEMPTY("<>"), //值不为空 + NOT_IN("NOT IN"), + IS_NULL("IS NULL"), + NOT_NULL("IS NOT NULL"), + IS_EMPTY("="),//值为空 + NOT_EMPTY("<>"), //值不为空 OPAND("&"), //与运算 > 0 OPOR("|"), //或运算 > 0 - OPANDNO("&"), //与运算 == 0 + NOT_OPAND("&"), //与运算 == 0 FV_MOD("%"), //取模运算,需要与FilterValue配合使用 FV_DIV("DIV"), //整除运算,需要与FilterValue配合使用 + AND("AND"), - OR("OR"); + OR("OR"), + //------------------------ 过期 ------------------------ + @Deprecated(since = "2.8.0") + EQUAL("="), + @Deprecated(since = "2.8.0") + IGNORECASELIKE("LIKE"), + @Deprecated(since = "2.8.0") + IGNORECASENOTLIKE("NOT LIKE"), + @Deprecated(since = "2.8.0") + ENDSWITH("LIKE"), + @Deprecated(since = "2.8.0") + STARTSWITH("LIKE"), + @Deprecated(since = "2.8.0") + IGNORECASEEQUAL("="), + @Deprecated(since = "2.8.0") + NOTEQUAL("<>"), + @Deprecated(since = "2.8.0") + GREATERTHAN(">"), + @Deprecated(since = "2.8.0") + LESSTHAN("<"), + @Deprecated(since = "2.8.0") + GREATERTHANOREQUALTO(">="), + @Deprecated(since = "2.8.0") + LESSTHANOREQUALTO("<="), + @Deprecated(since = "2.8.0") + NOTLIKE("NOT LIKE"), + @Deprecated(since = "2.8.0") + IGNORECASENOTEQUAL("="), + @Deprecated(since = "2.8.0") + NOTENDSWITH("NOT LIKE"), + @Deprecated(since = "2.8.0") + NOTSTARTSWITH("NOT LIKE"), + @Deprecated(since = "2.8.0") + LENGTH_EQUAL("="), + @Deprecated(since = "2.8.0") + LENGTH_GREATERTHAN(">"), + @Deprecated(since = "2.8.0") + LENGTH_LESSTHAN("<"), + @Deprecated(since = "2.8.0") + LENGTH_GREATERTHANOREQUALTO(">="), + @Deprecated(since = "2.8.0") + IGNORECASENOTCONTAIN("NOT CONTAIN"), + @Deprecated(since = "2.8.0") + IGNORECASECONTAIN("CONTAIN"), + @Deprecated(since = "2.8.0") + LENGTH_LESSTHANOREQUALTO("<="), + @Deprecated(since = "2.8.0") + NOTCONTAIN("NOT CONTAIN"), + @Deprecated(since = "2.8.0") + ISEMPTY("="), + @Deprecated(since = "2.8.0") + ISNOTNULL("IS NOT NULL"), + @Deprecated(since = "2.8.0") + NOTBETWEEN("NOT BETWEEN"), + @Deprecated(since = "2.8.0") + NOTIN("NOT IN"), + @Deprecated(since = "2.8.0") + ISNULL("IS NULL"), + @Deprecated(since = "2.8.0") + ISNOTEMPTY("<>"); private final String value; diff --git a/src/main/java/org/redkale/source/FilterJoinNode.java b/src/main/java/org/redkale/source/FilterJoinNode.java index d9d39ed2f..364dd52c0 100644 --- a/src/main/java/org/redkale/source/FilterJoinNode.java +++ b/src/main/java/org/redkale/source/FilterJoinNode.java @@ -9,7 +9,7 @@ import java.io.Serializable; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.*; -import static org.redkale.source.FilterExpress.EQUAL; +import static org.redkale.source.FilterExpress.EQ; import org.redkale.util.*; /** @@ -46,7 +46,7 @@ public class FilterJoinNode extends FilterNode { this.joinClass = joinClass; this.joinColumns = joinColumns; this.column = column; - this.express = express == null ? EQUAL : express; + this.express = express == null ? EQ : express; this.value = value; } diff --git a/src/main/java/org/redkale/source/FilterNode.java b/src/main/java/org/redkale/source/FilterNode.java index c92f65951..153d02563 100644 --- a/src/main/java/org/redkale/source/FilterNode.java +++ b/src/main/java/org/redkale/source/FilterNode.java @@ -82,7 +82,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } } this.column = col; - this.express = exp == null ? EQUAL : exp; + this.express = exp == null ? EQ : FilterNodes.oldExpress(exp); this.value = val; } @@ -176,6 +176,463 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return and(new FilterNode(LambdaFunction.readColumn(func), express, value)); } + public FilterNode eq(String column, Serializable value) { + return and(new FilterNode(column, EQ, value)); + } + + public FilterNode eq(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), EQ, func.get())); + } + + public FilterNode eq(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), EQ, value)); + } + + public FilterNode igEq(String column, Serializable value) { + return and(new FilterNode(column, IG_EQ, value)); + } + + public FilterNode igEq(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IG_EQ, func.get())); + } + + public FilterNode igEq(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IG_EQ, value)); + } + + public FilterNode notEq(String column, Serializable value) { + return and(new FilterNode(column, NOT_EQ, value)); + } + + public FilterNode notEq(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_EQ, func.get())); + } + + public FilterNode notEq(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_EQ, value)); + } + + public FilterNode igNotEq(String column, Serializable value) { + return and(new FilterNode(column, IG_NOT_EQ, value)); + } + + public FilterNode igNotEq(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IG_NOT_EQ, func.get())); + } + + public FilterNode igNotEq(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IG_NOT_EQ, value)); + } + + public FilterNode gt(String column, Number value) { + return and(new FilterNode(column, GT, value)); + } + + public FilterNode gt(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), GT, func.get())); + } + + public FilterNode gt(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), GT, value)); + } + + public FilterNode lt(String column, Number value) { + return and(new FilterNode(column, LT, value)); + } + + public FilterNode lt(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LT, func.get())); + } + + public FilterNode lt(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LT, value)); + } + + public FilterNode ge(String column, Number value) { + return and(new FilterNode(column, GE, value)); + } + + public FilterNode ge(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), GE, func.get())); + } + + public FilterNode ge(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), GE, value)); + } + + public FilterNode le(String column, Number value) { + return and(new FilterNode(column, LE, value)); + } + + public FilterNode le(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LE, func.get())); + } + + public FilterNode le(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LE, value)); + } + + public FilterNode like(String column, String value) { + return and(new FilterNode(column, LIKE, value)); + } + + public FilterNode like(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LIKE, func.get())); + } + + public FilterNode like(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LIKE, value)); + } + + public FilterNode notLike(String column, String value) { + return and(new FilterNode(column, NOT_LIKE, value)); + } + + public FilterNode notLike(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_LIKE, func.get())); + } + + public FilterNode notLike(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_LIKE, value)); + } + + public FilterNode igLike(String column, String value) { + return and(new FilterNode(column, IG_LIKE, value)); + } + + public FilterNode igLike(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IG_LIKE, func.get())); + } + + public FilterNode igLike(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IG_LIKE, value)); + } + + public FilterNode igNotLike(String column, String value) { + return and(new FilterNode(column, IG_NOT_LIKE, value)); + } + + public FilterNode igNotLike(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IG_NOT_LIKE, func.get())); + } + + public FilterNode igNotLike(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IG_NOT_LIKE, value)); + } + + public FilterNode starts(String column, String value) { + return and(new FilterNode(column, STARTS, value)); + } + + public FilterNode starts(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), STARTS, func.get())); + } + + public FilterNode starts(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), STARTS, value)); + } + + public FilterNode ends(String column, String value) { + return and(new FilterNode(column, ENDS, value)); + } + + public FilterNode ends(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), ENDS, func.get())); + } + + public FilterNode ends(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), ENDS, value)); + } + + public FilterNode notStarts(String column, String value) { + return and(new FilterNode(column, NOT_STARTS, value)); + } + + public FilterNode notStarts(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_STARTS, func.get())); + } + + public FilterNode notStarts(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_STARTS, value)); + } + + public FilterNode notEnds(String column, String value) { + return and(new FilterNode(column, NOT_ENDS, value)); + } + + public FilterNode notEnds(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_ENDS, func.get())); + } + + public FilterNode notEnds(LambdaFunction func, String value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_ENDS, value)); + } + + public FilterNode lenEq(String column, Number value) { + return and(new FilterNode(column, LEN_EQ, value)); + } + + public FilterNode lenEq(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LEN_EQ, func.get())); + } + + public FilterNode lenEq(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LEN_EQ, value)); + } + + public FilterNode lenGt(String column, Number value) { + return and(new FilterNode(column, LEN_GT, value)); + } + + public FilterNode lenGt(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LEN_GT, func.get())); + } + + public FilterNode lenGt(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LEN_GT, value)); + } + + public FilterNode lenLt(String column, Number value) { + return and(new FilterNode(column, LEN_LT, value)); + } + + public FilterNode lenLt(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LEN_LT, func.get())); + } + + public FilterNode lenLt(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LEN_LT, value)); + } + + public FilterNode lenGe(String column, Number value) { + return and(new FilterNode(column, LEN_GE, value)); + } + + public FilterNode lenGe(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LEN_GE, func.get())); + } + + public FilterNode lenGe(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LEN_GE, value)); + } + + public FilterNode lenLe(String column, Number value) { + return and(new FilterNode(column, LEN_LE, value)); + } + + public FilterNode lenLe(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), LEN_LE, func.get())); + } + + public FilterNode lenLe(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), LEN_LE, value)); + } + + public FilterNode contain(String column, Serializable value) { + return and(new FilterNode(column, CONTAIN, value)); + } + + public FilterNode contain(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), CONTAIN, func.get())); + } + + public FilterNode contain(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), CONTAIN, value)); + } + + public FilterNode notContain(String column, Serializable value) { + return and(new FilterNode(column, NOT_CONTAIN, value)); + } + + public FilterNode notContain(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_CONTAIN, func.get())); + } + + public FilterNode notContain(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_CONTAIN, value)); + } + + public FilterNode igContain(String column, Serializable value) { + return and(new FilterNode(column, IG_CONTAIN, value)); + } + + public FilterNode igContain(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IG_CONTAIN, func.get())); + } + + public FilterNode igContain(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IG_CONTAIN, value)); + } + + public FilterNode igNotContain(String column, Serializable value) { + return and(new FilterNode(column, IG_NOT_CONTAIN, value)); + } + + public FilterNode igNotContain(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IG_NOT_CONTAIN, func.get())); + } + + public FilterNode igNotContain(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IG_NOT_CONTAIN, value)); + } + + public FilterNode between(String column, Range value) { + return and(new FilterNode(column, BETWEEN, value)); + } + + public FilterNode between(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), BETWEEN, func.get())); + } + + public FilterNode between(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), BETWEEN, value)); + } + + public FilterNode notBetween(String column, Range value) { + return and(new FilterNode(column, NOT_BETWEEN, value)); + } + + public FilterNode notBetween(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_BETWEEN, func.get())); + } + + public FilterNode notBetween(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_BETWEEN, value)); + } + + public FilterNode in(String column, Serializable value) { + return and(new FilterNode(column, IN, value)); + } + + public FilterNode in(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IN, func.get())); + } + + public FilterNode in(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), IN, value)); + } + + public FilterNode notIn(String column, Serializable value) { + return and(new FilterNode(column, NOT_IN, value)); + } + + public FilterNode notIn(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_IN, func.get())); + } + + public FilterNode notIn(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_IN, value)); + } + + public FilterNode isNull(String column) { + return and(new FilterNode(column, IS_NULL, null)); + } + + public FilterNode isNull(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IS_NULL, null)); + } + + public FilterNode isNull(LambdaFunction func) { + return and(new FilterNode(LambdaFunction.readColumn(func), IS_NULL, null)); + } + + public FilterNode notNull(String column) { + return and(new FilterNode(column, NOT_NULL, null)); + } + + public FilterNode notNull(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_NULL, null)); + } + + public FilterNode notNull(LambdaFunction func) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_NULL, null)); + } + + public FilterNode isEmpty(String column) { + return and(new FilterNode(column, IS_EMPTY, null)); + } + + public FilterNode isEmpty(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), IS_EMPTY, null)); + } + + public FilterNode isEmpty(LambdaFunction func) { + return and(new FilterNode(LambdaFunction.readColumn(func), IS_EMPTY, null)); + } + + public FilterNode notEmpty(String column) { + return and(new FilterNode(column, NOT_EMPTY, null)); + } + + public FilterNode notEmpty(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_EMPTY, null)); + } + + public FilterNode notEmpty(LambdaFunction func) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_EMPTY, null)); + } + + public FilterNode opand(String column, Number value) { + return and(new FilterNode(column, OPAND, value)); + } + + public FilterNode opand(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), OPAND, func.get())); + } + + public FilterNode opand(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), OPAND, value)); + } + + public FilterNode opor(String column, Number value) { + return and(new FilterNode(column, OPOR, value)); + } + + public FilterNode opor(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), OPOR, func.get())); + } + + public FilterNode opor(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), OPOR, value)); + } + + public FilterNode notOpand(String column, Number value) { + return and(new FilterNode(column, NOT_OPAND, value)); + } + + public FilterNode notOpand(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), NOT_OPAND, func.get())); + } + + public FilterNode notOpand(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), NOT_OPAND, value)); + } + + public FilterNode fvmode(String column, FilterValue value) { + return and(new FilterNode(column, FV_MOD, value)); + } + + public FilterNode fvmode(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), FV_MOD, func.get())); + } + + public FilterNode fvmode(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), FV_MOD, value)); + } + + public FilterNode fvdiv(String column, FilterValue value) { + return and(new FilterNode(column, FV_DIV, value)); + } + + public FilterNode fvdiv(LambdaSupplier func) { + return and(new FilterNode(LambdaSupplier.readColumn(func), FV_DIV, func.get())); + } + + public FilterNode fvdiv(LambdaFunction func, F value) { + return and(new FilterNode(LambdaFunction.readColumn(func), FV_DIV, value)); + } + + //----------------------------------------------------------------------- public final FilterNode or(FilterNode node) { return any(node, true); } @@ -360,35 +817,59 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return rs; } - public static FilterNode create(String column, Serializable value) { - return create(column, null, value); - } - - public static FilterNode create(String column, FilterExpress express, Serializable value) { - return new FilterNode(column, express, value); - } - - public static FilterNode create(LambdaSupplier func) { - return create(func, null); - } - - public static FilterNode create(LambdaSupplier func, FilterExpress express) { - return new FilterNode(LambdaSupplier.readColumn(func), express, func.get()); - } - - public static FilterNode create(LambdaFunction func, F value) { - return create(func, null, value); - } - - public static FilterNode create(LambdaFunction func, FilterExpress express, F value) { - return new FilterNode(LambdaFunction.readColumn(func), express, value); - } - +// @Deprecated(since = "2.8.0") +// public static FilterNode create(String column, Serializable value) { +// return new FilterNode(column, null, value); +// } +// +// @Deprecated(since = "2.8.0") +// public static FilterNode create(String column, FilterExpress express, Serializable value) { +// return new FilterNode(column, express, value); +// } +// +// @Deprecated(since = "2.8.0") +// public static FilterNode create(LambdaSupplier func) { +// return new FilterNode(LambdaSupplier.readColumn(func), null, func.get()); +// } +// +// @Deprecated(since = "2.8.0") +// public static FilterNode create(LambdaSupplier func, FilterExpress express) { +// return new FilterNode(LambdaSupplier.readColumn(func), express, func.get()); +// } +// +// @Deprecated(since = "2.8.0") +// public static FilterNode create(LambdaFunction func, F value) { +// return new FilterNode(LambdaFunction.readColumn(func), null, value); +// } +// +// @Deprecated(since = "2.8.0") +// public static FilterNode create(LambdaFunction func, FilterExpress express, F value) { +// return new FilterNode(LambdaFunction.readColumn(func), express, value); +// } + /** + * @see org.redkale.source.FilterNodes + * + * @param column String + * @param value Serializable + * + * @return FilterNode + * @deprecated + */ @Deprecated(since = "2.8.0") public static FilterNode filter(String column, Serializable value) { - return create(column, null, value); + return new FilterNode(column, null, value); } + /** + * @see org.redkale.source.FilterNodes + * + * @param column String + * @param express FilterExpress + * @param value Serializable + * + * @return FilterNode + * @deprecated + */ @Deprecated(since = "2.8.0") public static FilterNode filter(String column, FilterExpress express, Serializable value) { return new FilterNode(column, express, value); @@ -402,7 +883,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 if (val0 == null) { return false; } - boolean items = express != IN && express != NOTIN; //是否数组集合的表达式 + boolean items = express != IN && express != NOT_IN; //是否数组集合的表达式 if (!items) { if (val0.getClass().isArray()) { Class comp = val0.getClass().getComponentType(); @@ -491,10 +972,10 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 if (talis == null) { talis = "a"; } - if (express == ISNULL || express == ISNOTNULL) { + if (express == IS_NULL || express == NOT_NULL) { return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()); } - if (express == ISEMPTY || express == ISNOTEMPTY) { + if (express == IS_EMPTY || express == NOT_EMPTY) { return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()).append(" ''"); } if (val0 == null) { @@ -514,20 +995,20 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 if (express == CONTAIN) { return source.containSQL.replace("#{column}", info.getSQLColumn(talis, column)).replace("#{keystr}", val); } - if (express == IGNORECASECONTAIN) { + if (express == IG_CONTAIN) { return source.containSQL.replace("#{column}", "LOWER(" + info.getSQLColumn(talis, column) + ")").replace("#{keystr}", val); } - if (express == NOTCONTAIN) { + if (express == NOT_CONTAIN) { return source.notContainSQL.replace("#{column}", info.getSQLColumn(talis, column)).replace("#{keystr}", val); } - if (express == IGNORECASENOTCONTAIN) { + if (express == IG_NOT_CONTAIN) { return source.notContainSQL.replace("#{column}", "LOWER(" + info.getSQLColumn(talis, column) + ")").replace("#{keystr}", val); } - if (express == LENGTH_EQUAL || express == LENGTH_LESSTHAN || express == LENGTH_LESSTHANOREQUALTO - || express == LENGTH_GREATERTHAN || express == LENGTH_GREATERTHANOREQUALTO) { + if (express == LEN_EQ || express == LEN_LT || express == LEN_LE + || express == LEN_GT || express == LEN_GE) { sb.append("LENGTH(").append(info.getSQLColumn(talis, column)).append(')'); - } else if (express == IGNORECASEEQUAL || express == IGNORECASENOTEQUAL || express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { + } else if (express == IG_EQ || express == IG_NOT_EQ || express == IG_LIKE || express == IG_NOT_LIKE) { sb.append("LOWER(").append(info.getSQLColumn(talis, column)).append(')'); if (fk) { val = "LOWER(" + info.getSQLColumn(talis, ((FilterKey) val0).getColumn()) + ')'; @@ -541,7 +1022,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 case OPOR: sb.append(express.value()).append(' ').append(val).append(" > 0"); break; - case OPANDNO: + case NOT_OPAND: sb.append(express.value()).append(' ').append(val).append(" = 0"); break; default: @@ -727,7 +1208,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return null; } final String field = join ? (cache.getType().getSimpleName() + "." + attr.field()) : attr.field(); - if (express == ISNULL) { + if (express == IS_NULL) { return new Predicate() { @Override @@ -741,7 +1222,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } }; } - if (express == ISNOTNULL) { + if (express == NOT_NULL) { return new Predicate() { @Override @@ -755,7 +1236,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } }; } - if (express == ISEMPTY) { + if (express == IS_EMPTY) { return new Predicate() { @Override @@ -770,7 +1251,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } }; } - if (express == ISNOTEMPTY) { + if (express == NOT_EMPTY) { return new Predicate() { @Override @@ -807,7 +1288,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } } else if (valtype.isArray()) { final int len = Array.getLength(val0); - if (len == 0 && express == NOTIN) { + if (len == 0 && express == NOT_IN) { return null; } final Class compType = valtype.getComponentType(); @@ -855,7 +1336,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } } else if (val0 instanceof Collection) { final Collection collection = (Collection) val0; - if (collection.isEmpty() && express == NOTIN) { + if (collection.isEmpty() && express == NOT_IN) { return null; } if (!collection.isEmpty()) { @@ -914,7 +1395,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 throw new SourceException(cache.getType() + " not found column(" + ((FilterKey) val).getColumn() + ")"); } switch (express) { - case EQUAL: + case EQ: return fk ? new Predicate() { @Override @@ -938,7 +1419,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + ' ' + express.value() + ' ' + formatToString(val); } }; - case IGNORECASEEQUAL: + case IG_EQ: return fk ? new Predicate() { @Override @@ -974,7 +1455,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LOWER(" + field + ") " + express.value() + ' ' + formatToString(val); } }; - case NOTEQUAL: + case NOT_EQ: return fk ? new Predicate() { @Override @@ -998,7 +1479,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + ' ' + express.value() + ' ' + formatToString(val); } }; - case IGNORECASENOTEQUAL: + case IG_NOT_EQ: return fk ? new Predicate() { @Override @@ -1034,7 +1515,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LOWER(" + field + ") " + express.value() + ' ' + formatToString(val); } }; - case GREATERTHAN: + case GT: return fk ? new Predicate() { @Override @@ -1058,7 +1539,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + ' ' + express.value() + ' ' + val; } }; - case LESSTHAN: + case LT: return fk ? new Predicate() { @Override @@ -1082,7 +1563,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + ' ' + express.value() + ' ' + val; } }; - case GREATERTHANOREQUALTO: + case GE: return fk ? new Predicate() { @Override @@ -1106,7 +1587,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + ' ' + express.value() + ' ' + val; } }; - case LESSTHANOREQUALTO: + case LE: return fk ? new Predicate() { @Override @@ -1134,7 +1615,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 case FV_MOD: FilterValue fv0 = (FilterValue) val; switch (fv0.getExpress()) { - case EQUAL: + case EQ: return new Predicate() { @Override @@ -1147,7 +1628,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight(); } }; - case NOTEQUAL: + case NOT_EQ: return new Predicate() { @Override @@ -1160,7 +1641,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight(); } }; - case GREATERTHAN: + case GT: return new Predicate() { @Override @@ -1173,7 +1654,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight(); } }; - case LESSTHAN: + case LT: return new Predicate() { @Override @@ -1186,7 +1667,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight(); } }; - case GREATERTHANOREQUALTO: + case GE: return new Predicate() { @Override @@ -1199,7 +1680,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight(); } }; - case LESSTHANOREQUALTO: + case LE: return new Predicate() { @Override @@ -1218,7 +1699,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 case FV_DIV: FilterValue fv1 = (FilterValue) val; switch (fv1.getExpress()) { - case EQUAL: + case EQ: return new Predicate() { @Override @@ -1231,7 +1712,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight(); } }; - case NOTEQUAL: + case NOT_EQ: return new Predicate() { @Override @@ -1244,7 +1725,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight(); } }; - case GREATERTHAN: + case GT: return new Predicate() { @Override @@ -1257,7 +1738,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight(); } }; - case LESSTHAN: + case LT: return new Predicate() { @Override @@ -1270,7 +1751,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight(); } }; - case GREATERTHANOREQUALTO: + case GE: return new Predicate() { @Override @@ -1283,7 +1764,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight(); } }; - case LESSTHANOREQUALTO: + case LE: return new Predicate() { @Override @@ -1347,7 +1828,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " | " + val + " > 0"; } }; - case OPANDNO: + case NOT_OPAND: return fk ? new Predicate() { @Override @@ -1398,7 +1879,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + ' ' + express.value() + ' ' + formatToString(val); } }; - case STARTSWITH: + case STARTS: return fk ? new Predicate() { @Override @@ -1425,7 +1906,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " STARTSWITH " + formatToString(val); } }; - case ENDSWITH: + case ENDS: return fk ? new Predicate() { @Override @@ -1452,7 +1933,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " ENDSWITH " + formatToString(val); } }; - case IGNORECASELIKE: + case IG_LIKE: if (fk) { return new Predicate() { @@ -1483,7 +1964,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LOWER(" + field + ") " + express.value() + ' ' + formatToString(valstr); } }; - case NOTSTARTSWITH: + case NOT_STARTS: return fk ? new Predicate() { @Override @@ -1510,7 +1991,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " NOT STARTSWITH " + formatToString(val); } }; - case NOTENDSWITH: + case NOT_ENDS: return fk ? new Predicate() { @Override @@ -1537,7 +2018,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return field + " NOT ENDSWITH " + formatToString(val); } }; - case IGNORECASENOTLIKE: + case IG_NOT_LIKE: if (fk) { return new Predicate() { @@ -1568,7 +2049,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LOWER(" + field + ") " + express.value() + ' ' + formatToString(valstr2); } }; - case LENGTH_EQUAL: + case LEN_EQ: final int intval = ((Number) val).intValue(); return new Predicate() { @@ -1583,7 +2064,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LENGTH(" + field + ") " + express.value() + ' ' + intval; } }; - case LENGTH_LESSTHAN: + case LEN_LT: final int intval2 = ((Number) val).intValue(); return new Predicate() { @@ -1598,7 +2079,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LENGTH(" + field + ") " + express.value() + ' ' + intval2; } }; - case LENGTH_LESSTHANOREQUALTO: + case LEN_LE: final int intval3 = ((Number) val).intValue(); return new Predicate() { @@ -1613,7 +2094,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LENGTH(" + field + ") " + express.value() + ' ' + intval3; } }; - case LENGTH_GREATERTHAN: + case LEN_GT: final int intval4 = ((Number) val).intValue(); return new Predicate() { @@ -1628,7 +2109,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LENGTH(" + field + ") " + express.value() + ' ' + intval4; } }; - case LENGTH_GREATERTHANOREQUALTO: + case LEN_GE: final int intval5 = ((Number) val).intValue(); return new Predicate() { @@ -1670,7 +2151,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "" + formatToString(val) + ' ' + express.value() + ' ' + field; } }; - case IGNORECASECONTAIN: + case IG_CONTAIN: if (fk) { return new Predicate() { @@ -1701,7 +2182,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "" + formatToString(valstr3) + express.value() + ' ' + "LOWER(" + field + ") "; } }; - case NOTCONTAIN: + case NOT_CONTAIN: return fk ? new Predicate() { @Override @@ -1728,7 +2209,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "" + formatToString(val) + ' ' + express.value() + ' ' + field; } }; - case IGNORECASENOTCONTAIN: + case IG_NOT_CONTAIN: if (fk) { return new Predicate() { @@ -1760,7 +2241,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } }; case BETWEEN: - case NOTBETWEEN: + case NOT_BETWEEN: Range range = (Range) val; final Comparable min = range.getMin(); final Comparable max = range.getMax(); @@ -1785,7 +2266,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } }; } - if (express == NOTBETWEEN) { + if (express == NOT_BETWEEN) { return new Predicate() { @Override @@ -1808,7 +2289,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } return null; case IN: - case NOTIN: + case NOT_IN: Predicate filter; if (val instanceof Collection) { Collection array = (Collection) val; @@ -1994,7 +2475,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 }; } } - if (express == NOTIN) { + if (express == NOT_IN) { final Predicate filter2 = filter; filter = new Predicate() { @@ -2104,12 +2585,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 StringBuilder sb = new StringBuilder(); if (column != null) { String col = prefix == null ? column : (prefix + "." + column); - if (express == ISNULL || express == ISNOTNULL) { + if (express == IS_NULL || express == NOT_NULL) { sb.append(col).append(' ').append(express.value()); - } else if (express == ISEMPTY || express == ISNOTEMPTY) { + } else if (express == IS_EMPTY || express == NOT_EMPTY) { sb.append(col).append(' ').append(express.value()).append(" ''"); } else if (ev != null) { - boolean lower = (express == IGNORECASELIKE || express == IGNORECASENOTLIKE || express == IGNORECASECONTAIN || express == IGNORECASENOTCONTAIN); + boolean lower = (express == IG_LIKE || express == IG_NOT_LIKE || express == IG_CONTAIN || express == IG_NOT_CONTAIN); sb.append(lower ? ("LOWER(" + col + ')') : col).append(' ').append(express.value()).append(' ').append(formatToString(express, ev)); } } @@ -2129,16 +2610,16 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return String.valueOf(value); } if (value instanceof CharSequence) { - if (express == LIKE || express == NOTLIKE) { + if (express == LIKE || express == NOT_LIKE) { value = "%" + value + '%'; - } else if (express == STARTSWITH || express == NOTSTARTSWITH) { + } else if (express == STARTS || express == NOT_STARTS) { value = value + "%"; - } else if (express == ENDSWITH || express == NOTENDSWITH) { + } else if (express == ENDS || express == NOT_ENDS) { value = "%" + value; - } else if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { + } else if (express == IG_LIKE || express == IG_NOT_LIKE) { value = "%" + value.toString().toLowerCase() + '%'; - } else if (express == IGNORECASECONTAIN || express == IGNORECASENOTCONTAIN - || express == IGNORECASEEQUAL || express == IGNORECASENOTEQUAL) { + } else if (express == IG_CONTAIN || express == IG_NOT_CONTAIN + || express == IG_EQ || express == IG_NOT_EQ) { value = value.toString().toLowerCase(); } return new StringBuilder().append('\'').append(value.toString().replace("'", "\\'")).append('\''); @@ -2161,7 +2642,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } else if (value.getClass().isArray()) { int len = Array.getLength(value); if (len == 0) { - return express == NOTIN ? null : new StringBuilder("(NULL)"); + return express == NOT_IN ? null : new StringBuilder("(NULL)"); } if (len == 1) { Object firstval = Array.get(value, 0); @@ -2186,7 +2667,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 } else if (value instanceof Collection) { Collection c = (Collection) value; if (c.isEmpty()) { - return express == NOTIN ? null : new StringBuilder("(NULL)"); + return express == NOT_IN ? null : new StringBuilder("(NULL)"); } StringBuilder sb = new StringBuilder(); sb.append('('); diff --git a/src/main/java/org/redkale/source/FilterNodeBean.java b/src/main/java/org/redkale/source/FilterNodeBean.java index 7f9309b16..24538fd46 100644 --- a/src/main/java/org/redkale/source/FilterNodeBean.java +++ b/src/main/java/org/redkale/source/FilterNodeBean.java @@ -79,21 +79,21 @@ public final class FilterNodeBean implements Comparable implements Comparable implements Comparable + * 详情见: https://redkale.org + * + * @author zhangjx + * @since 2.8.0 + */ +public final class FilterNodes { + + private FilterNodes() { + //do nothind + } + + public static FilterNode create(String column, Serializable value) { + return new FilterNode(column, null, value); + } + + public static FilterNode create(String column, FilterExpress express, Serializable value) { + return new FilterNode(column, express, value); + } + + public static FilterNode create(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), null, func.get()); + } + + public static FilterNode create(LambdaSupplier func, FilterExpress express) { + return new FilterNode(LambdaSupplier.readColumn(func), express, func.get()); + } + + public static FilterNode create(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), null, value); + } + + public static FilterNode create(LambdaFunction func, FilterExpress express, F value) { + return new FilterNode(LambdaFunction.readColumn(func), express, value); + } + + public static FilterNode eq(String column, Serializable value) { + return new FilterNode(column, EQ, value); + } + + public static FilterNode eq(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), EQ, func.get()); + } + + public static FilterNode eq(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), EQ, value); + } + + public static FilterNode igEq(String column, Serializable value) { + return new FilterNode(column, IG_EQ, value); + } + + public static FilterNode igEq(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IG_EQ, func.get()); + } + + public static FilterNode igEq(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), IG_EQ, value); + } + + public static FilterNode notEq(String column, Serializable value) { + return new FilterNode(column, NOT_EQ, value); + } + + public static FilterNode notEq(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_EQ, func.get()); + } + + public static FilterNode notEq(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_EQ, value); + } + + public static FilterNode igNotEq(String column, Serializable value) { + return new FilterNode(column, IG_NOT_EQ, value); + } + + public static FilterNode igNotEq(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IG_NOT_EQ, func.get()); + } + + public static FilterNode igNotEq(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), IG_NOT_EQ, value); + } + + public static FilterNode gt(String column, Number value) { + return new FilterNode(column, GT, value); + } + + public static FilterNode gt(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), GT, func.get()); + } + + public static FilterNode gt(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), GT, value); + } + + public static FilterNode lt(String column, Number value) { + return new FilterNode(column, LT, value); + } + + public static FilterNode lt(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LT, func.get()); + } + + public static FilterNode lt(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LT, value); + } + + public static FilterNode ge(String column, Number value) { + return new FilterNode(column, GE, value); + } + + public static FilterNode ge(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), GE, func.get()); + } + + public static FilterNode ge(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), GE, value); + } + + public static FilterNode le(String column, Number value) { + return new FilterNode(column, LE, value); + } + + public static FilterNode le(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LE, func.get()); + } + + public static FilterNode le(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LE, value); + } + + public static FilterNode like(String column, String value) { + return new FilterNode(column, LIKE, value); + } + + public static FilterNode like(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LIKE, func.get()); + } + + public static FilterNode like(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), LIKE, value); + } + + public static FilterNode notLike(String column, String value) { + return new FilterNode(column, NOT_LIKE, value); + } + + public static FilterNode notLike(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_LIKE, func.get()); + } + + public static FilterNode notLike(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_LIKE, value); + } + + public static FilterNode igLike(String column, String value) { + return new FilterNode(column, IG_LIKE, value); + } + + public static FilterNode igLike(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IG_LIKE, func.get()); + } + + public static FilterNode igLike(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), IG_LIKE, value); + } + + public static FilterNode igNotLike(String column, String value) { + return new FilterNode(column, IG_NOT_LIKE, value); + } + + public static FilterNode igNotLike(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IG_NOT_LIKE, func.get()); + } + + public static FilterNode igNotLike(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), IG_NOT_LIKE, value); + } + + public static FilterNode starts(String column, String value) { + return new FilterNode(column, STARTS, value); + } + + public static FilterNode starts(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), STARTS, func.get()); + } + + public static FilterNode starts(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), STARTS, value); + } + + public static FilterNode ends(String column, String value) { + return new FilterNode(column, ENDS, value); + } + + public static FilterNode ends(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), ENDS, func.get()); + } + + public static FilterNode ends(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), ENDS, value); + } + + public static FilterNode notStarts(String column, String value) { + return new FilterNode(column, NOT_STARTS, value); + } + + public static FilterNode notStarts(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_STARTS, func.get()); + } + + public static FilterNode notStarts(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_STARTS, value); + } + + public static FilterNode notEnds(String column, String value) { + return new FilterNode(column, NOT_ENDS, value); + } + + public static FilterNode notEnds(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_ENDS, func.get()); + } + + public static FilterNode notEnds(LambdaFunction func, String value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_ENDS, value); + } + + public static FilterNode lenEq(String column, Number value) { + return new FilterNode(column, LEN_EQ, value); + } + + public static FilterNode lenEq(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LEN_EQ, func.get()); + } + + public static FilterNode lenEq(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LEN_EQ, value); + } + + public static FilterNode lenGt(String column, Number value) { + return new FilterNode(column, LEN_GT, value); + } + + public static FilterNode lenGt(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LEN_GT, func.get()); + } + + public static FilterNode lenGt(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LEN_GT, value); + } + + public static FilterNode lenLt(String column, Number value) { + return new FilterNode(column, LEN_LT, value); + } + + public static FilterNode lenLt(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LEN_LT, func.get()); + } + + public static FilterNode lenLt(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LEN_LT, value); + } + + public static FilterNode lenGe(String column, Number value) { + return new FilterNode(column, LEN_GE, value); + } + + public static FilterNode lenGe(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LEN_GE, func.get()); + } + + public static FilterNode lenGe(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LEN_GE, value); + } + + public static FilterNode lenLe(String column, Number value) { + return new FilterNode(column, LEN_LE, value); + } + + public static FilterNode lenLe(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), LEN_LE, func.get()); + } + + public static FilterNode lenLe(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), LEN_LE, value); + } + + public static FilterNode contain(String column, Serializable value) { + return new FilterNode(column, CONTAIN, value); + } + + public static FilterNode contain(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), CONTAIN, func.get()); + } + + public static FilterNode contain(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), CONTAIN, value); + } + + public static FilterNode notContain(String column, Serializable value) { + return new FilterNode(column, NOT_CONTAIN, value); + } + + public static FilterNode notContain(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_CONTAIN, func.get()); + } + + public static FilterNode notContain(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_CONTAIN, value); + } + + public static FilterNode igContain(String column, Serializable value) { + return new FilterNode(column, IG_CONTAIN, value); + } + + public static FilterNode igContain(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IG_CONTAIN, func.get()); + } + + public static FilterNode igContain(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), IG_CONTAIN, value); + } + + public static FilterNode igNotContain(String column, Serializable value) { + return new FilterNode(column, IG_NOT_CONTAIN, value); + } + + public static FilterNode igNotContain(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IG_NOT_CONTAIN, func.get()); + } + + public static FilterNode igNotContain(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), IG_NOT_CONTAIN, value); + } + + public static FilterNode between(String column, Range value) { + return new FilterNode(column, BETWEEN, value); + } + + public static FilterNode between(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), BETWEEN, func.get()); + } + + public static FilterNode between(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), BETWEEN, value); + } + + public static FilterNode notBetween(String column, Range value) { + return new FilterNode(column, NOT_BETWEEN, value); + } + + public static FilterNode notBetween(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_BETWEEN, func.get()); + } + + public static FilterNode notBetween(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_BETWEEN, value); + } + + public static FilterNode in(String column, Serializable value) { + return new FilterNode(column, IN, value); + } + + public static FilterNode in(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IN, func.get()); + } + + public static FilterNode in(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), IN, value); + } + + public static FilterNode notIn(String column, Serializable value) { + return new FilterNode(column, NOT_IN, value); + } + + public static FilterNode notIn(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_IN, func.get()); + } + + public static FilterNode notIn(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_IN, value); + } + + public static FilterNode isNull(String column) { + return new FilterNode(column, IS_NULL, null); + } + + public static FilterNode isNull(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IS_NULL, null); + } + + public static FilterNode isNull(LambdaFunction func) { + return new FilterNode(LambdaFunction.readColumn(func), IS_NULL, null); + } + + public static FilterNode notNull(String column) { + return new FilterNode(column, NOT_NULL, null); + } + + public static FilterNode notNull(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_NULL, null); + } + + public static FilterNode notNull(LambdaFunction func) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_NULL, null); + } + + public static FilterNode isEmpty(String column) { + return new FilterNode(column, IS_EMPTY, null); + } + + public static FilterNode isEmpty(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), IS_EMPTY, null); + } + + public static FilterNode isEmpty(LambdaFunction func) { + return new FilterNode(LambdaFunction.readColumn(func), IS_EMPTY, null); + } + + public static FilterNode notEmpty(String column) { + return new FilterNode(column, NOT_EMPTY, null); + } + + public static FilterNode notEmpty(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_EMPTY, null); + } + + public static FilterNode notEmpty(LambdaFunction func) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_EMPTY, null); + } + + public static FilterNode opand(String column, Number value) { + return new FilterNode(column, OPAND, value); + } + + public static FilterNode opand(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), OPAND, func.get()); + } + + public static FilterNode opand(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), OPAND, value); + } + + public static FilterNode opor(String column, Number value) { + return new FilterNode(column, OPOR, value); + } + + public static FilterNode opor(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), OPOR, func.get()); + } + + public FilterNode opor(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), OPOR, value); + } + + public static FilterNode notOpand(String column, Number value) { + return new FilterNode(column, NOT_OPAND, value); + } + + public static FilterNode notOpand(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), NOT_OPAND, func.get()); + } + + public static FilterNode notOpand(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), NOT_OPAND, value); + } + + public static FilterNode fvmode(String column, FilterValue value) { + return new FilterNode(column, FV_MOD, value); + } + + public static FilterNode fvmode(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), FV_MOD, func.get()); + } + + public static FilterNode fvmode(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), FV_MOD, value); + } + + public static FilterNode fvdiv(String column, FilterValue value) { + return new FilterNode(column, FV_DIV, value); + } + + public static FilterNode fvdiv(LambdaSupplier func) { + return new FilterNode(LambdaSupplier.readColumn(func), FV_DIV, func.get()); + } + + public static FilterNode fvdiv(LambdaFunction func, F value) { + return new FilterNode(LambdaFunction.readColumn(func), FV_DIV, value); + } + + static FilterExpress oldExpress(FilterExpress express) { + switch (express) { + case EQUAL: + return EQ; + case IGNORECASEEQUAL: + return IG_EQ; + case NOTEQUAL: + return NOT_EQ; + case IGNORECASENOTEQUAL: + return IG_NOT_EQ; + case GREATERTHAN: + return GT; + case LESSTHAN: + return LT; + case GREATERTHANOREQUALTO: + return GE; + case LESSTHANOREQUALTO: + return LE; + case NOTLIKE: + return NOT_LIKE; + case IGNORECASELIKE: + return IG_LIKE; + case IGNORECASENOTLIKE: + return IG_NOT_LIKE; + case STARTSWITH: + return STARTS; + case ENDSWITH: + return ENDS; + case NOTSTARTSWITH: + return NOT_STARTS; + case NOTENDSWITH: + return NOT_ENDS; + case LENGTH_EQUAL: + return LEN_EQ; + case LENGTH_GREATERTHAN: + return LEN_GT; + case LENGTH_LESSTHAN: + return LEN_LT; + case LENGTH_GREATERTHANOREQUALTO: + return LEN_GE; + case LENGTH_LESSTHANOREQUALTO: + return LEN_LE; + case NOTCONTAIN: + return NOT_CONTAIN; + case IGNORECASECONTAIN: + return IG_CONTAIN; + case IGNORECASENOTCONTAIN: + return IG_NOT_CONTAIN; + case NOTBETWEEN: + return NOT_BETWEEN; + case NOTIN: + return NOT_IN; + case ISNULL: + return IS_NULL; + case ISNOTNULL: + return NOT_NULL; + case ISEMPTY: + return IS_EMPTY; + case ISNOTEMPTY: + return NOT_EMPTY; + default: + return express; + } + } + +} diff --git a/src/main/java/org/redkale/source/FilterValue.java b/src/main/java/org/redkale/source/FilterValue.java index bb4fb481c..20090ca4c 100644 --- a/src/main/java/org/redkale/source/FilterValue.java +++ b/src/main/java/org/redkale/source/FilterValue.java @@ -31,7 +31,7 @@ public class FilterValue implements java.io.Serializable { } public FilterValue(Number left, Number right) { - this(left, FilterExpress.EQUAL, right); + this(left, FilterExpress.EQ, right); } public FilterValue(Number left, FilterExpress express) { @@ -40,7 +40,7 @@ public class FilterValue implements java.io.Serializable { public FilterValue(Number left, FilterExpress express, Number right) { this.left = left; - this.express = express; + this.express = FilterNodes.oldExpress(express); this.right = right; } @@ -53,7 +53,7 @@ public class FilterValue implements java.io.Serializable { } public FilterExpress getExpress() { - return express == null ? FilterExpress.EQUAL : express; + return express == null ? FilterExpress.EQ : express; } public void setExpress(FilterExpress express) { diff --git a/src/main/java/org/redkale/util/AnyValue.java b/src/main/java/org/redkale/util/AnyValue.java index 527b3e6bd..a83946ca0 100644 --- a/src/main/java/org/redkale/util/AnyValue.java +++ b/src/main/java/org/redkale/util/AnyValue.java @@ -10,6 +10,7 @@ import java.nio.charset.*; import java.util.*; import java.util.function.*; import org.redkale.annotation.ConstructorParameters; +import org.redkale.convert.ConvertColumn; import org.redkale.convert.ConvertDisabled; /** @@ -64,12 +65,15 @@ public abstract class AnyValue { */ public static final BiPredicate EQUALS_IGNORE = (name1, name2) -> name1.equalsIgnoreCase(name2); + @ConvertColumn(index = 1) private boolean ignoreCase; private BiPredicate predicate; + @ConvertColumn(index = 2) private Entry[] stringEntrys = new Entry[0]; + @ConvertColumn(index = 3) private Entry[] anyEntrys = new Entry[0]; private int parentArrayIndex = -1; //只可能被loadFromProperties方法赋值 @@ -353,6 +357,7 @@ public abstract class AnyValue { * * @return DefaultAnyValue */ + @ConvertDisabled public DefaultAnyValue setAll(final AnyValue av) { if (av == null) { return this; @@ -644,8 +649,10 @@ public abstract class AnyValue { /** * 字段名 */ + @ConvertColumn(index = 1) public final String name; + @ConvertColumn(index = 2) T value; @ConstructorParameters({"name", "value"}) diff --git a/src/main/java/org/redkale/util/Utility.java b/src/main/java/org/redkale/util/Utility.java index e664170f5..2b89d2957 100644 --- a/src/main/java/org/redkale/util/Utility.java +++ b/src/main/java/org/redkale/util/Utility.java @@ -2696,6 +2696,27 @@ public final class Utility { return false; } + /** + * 判断指定值是否包含指定的数组中,包含返回true + * + * @param 泛型 + * @param values 集合 + * @param predicate 过滤条件 + * + * @return boolean + */ + public static boolean contains(Collection values, Predicate predicate) { + if (values == null) { + return false; + } + for (T v : values) { + if (predicate.test(v)) { + return true; + } + } + return false; + } + /** * 将指定的short元素是否数组中完全包含,重复元素的次数也要相同
* 例如:
diff --git a/src/test/java/org/redkale/test/convert/protobuf/PBCustMessage2Test.java b/src/test/java/org/redkale/test/convert/protobuf/PBCustMessage2Test.java index 31ea82c88..4e3bfdee9 100644 --- a/src/test/java/org/redkale/test/convert/protobuf/PBCustMessage2Test.java +++ b/src/test/java/org/redkale/test/convert/protobuf/PBCustMessage2Test.java @@ -2,18 +2,18 @@ */ package org.redkale.test.convert.protobuf; -import org.redkale.convert.protobuf.ProtobufObjectEncoder; -import org.redkale.convert.protobuf.ProtobufReader; -import org.redkale.convert.protobuf.ProtobufObjectDecoder; -import org.redkale.convert.protobuf.ProtobufConvert; +import java.lang.annotation.*; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import java.lang.annotation.*; import java.util.Arrays; import java.util.function.*; import org.junit.jupiter.api.*; import org.redkale.convert.*; import org.redkale.convert.json.JsonConvert; +import org.redkale.convert.protobuf.ProtobufConvert; +import org.redkale.convert.protobuf.ProtobufObjectDecoder; +import org.redkale.convert.protobuf.ProtobufObjectEncoder; +import org.redkale.convert.protobuf.ProtobufReader; import org.redkale.util.*; /** @@ -34,7 +34,9 @@ public class PBCustMessage2Test { @Test public void run() throws Exception { final BiFunction objFieldFunc = (Attribute t, Object u) -> { - if (t.field().equals("retinfo")) return null; + if (t.field().equals("retinfo")) { + return null; + } return t.get(u); }; OnPlayerLeaveMessage msg1 = new OnPlayerLeaveMessage(100, "haha"); @@ -43,19 +45,25 @@ public class PBCustMessage2Test { byte[] bs2 = ProtobufConvert.root().convertTo(msg2); System.out.println(Arrays.toString(bs1)); System.out.println(Arrays.toString(bs2)); - if (!main) Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(bs2)); + if (!main) { + Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(bs2)); + } System.out.println(); OnPlayerLeaveMessage2 newmsg2 = ProtobufConvert.root().convertFrom(OnPlayerLeaveMessage2.class, bs1); byte[] newbs2 = ProtobufConvert.root().convertTo(newmsg2); System.out.println(Arrays.toString(newbs2)); - if (!main) Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(newbs2)); + if (!main) { + Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(newbs2)); + } System.out.println(); ProtobufConvert convert = ProtobufConvert.root().newConvert(objFieldFunc); System.out.println(Arrays.toString(convert.convertTo(msg1))); System.out.println(Arrays.toString(convert.convertTo(msg2))); - if (!main) Assertions.assertEquals(Arrays.toString(convert.convertTo(msg1)), Arrays.toString(convert.convertTo(msg2))); + if (!main) { + Assertions.assertEquals(Arrays.toString(convert.convertTo(msg1)), Arrays.toString(convert.convertTo(msg2))); + } System.out.println(); } @@ -72,7 +80,9 @@ public class PBCustMessage2Test { public static String getMessageName(Class clazz) { MessageName mn = clazz.getAnnotation(MessageName.class); - if (mn != null) return mn.value(); + if (mn != null) { + return mn.value(); + } char[] fieldChars = clazz.getSimpleName().toCharArray(); fieldChars[0] = Character.toLowerCase(fieldChars[0]); return new String(fieldChars); @@ -165,8 +175,10 @@ public class PBCustMessage2Test { public static class OnPlayerLeaveMessage { + @ConvertColumn(index = 1) private String event = "onPlayerLeaveMessage"; + @ConvertColumn(index = 2) private OnPlayerLeaveContent result; public OnPlayerLeaveMessage() { diff --git a/src/test/java/org/redkale/test/convert/protobuf/PBCustMessageTest.java b/src/test/java/org/redkale/test/convert/protobuf/PBCustMessageTest.java index 77f3d5f45..b5b125671 100644 --- a/src/test/java/org/redkale/test/convert/protobuf/PBCustMessageTest.java +++ b/src/test/java/org/redkale/test/convert/protobuf/PBCustMessageTest.java @@ -2,11 +2,6 @@ */ package org.redkale.test.convert.protobuf; -import org.redkale.convert.protobuf.ProtobufObjectEncoder; -import org.redkale.convert.protobuf.ProtobufReader; -import org.redkale.convert.protobuf.ProtobufFactory; -import org.redkale.convert.protobuf.ProtobufObjectDecoder; -import org.redkale.convert.protobuf.ProtobufConvert; import java.lang.annotation.*; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -15,6 +10,11 @@ import java.util.function.*; import org.junit.jupiter.api.*; import org.redkale.convert.*; import org.redkale.convert.json.JsonConvert; +import org.redkale.convert.protobuf.ProtobufConvert; +import org.redkale.convert.protobuf.ProtobufFactory; +import org.redkale.convert.protobuf.ProtobufObjectDecoder; +import org.redkale.convert.protobuf.ProtobufObjectEncoder; +import org.redkale.convert.protobuf.ProtobufReader; import org.redkale.util.*; /** @@ -148,6 +148,7 @@ public class PBCustMessageTest { public static class OnPlayerLeaveMessage { + @ConvertColumn(index = 1) private OnPlayerLeaveContent onPlayerLeaveMessage; public OnPlayerLeaveMessage() { diff --git a/src/test/java/org/redkale/test/source/CacheTestBean.java b/src/test/java/org/redkale/test/source/CacheTestBean.java index aab1d256f..d3c75f365 100644 --- a/src/test/java/org/redkale/test/source/CacheTestBean.java +++ b/src/test/java/org/redkale/test/source/CacheTestBean.java @@ -42,12 +42,12 @@ public class CacheTestBean { System.out.println(cache.queryColumnMap("pkgid", FilterFunc.MAX, "price", null)); System.out.println(cache.queryColumnMap("pkgid", FilterFunc.MIN, "price", null)); - System.out.println(cache.find(null, FilterNode.create("name", FilterExpress.EQUAL, "BB"))); - System.out.println(cache.find(null, FilterNode.create("name", FilterExpress.IGNORECASEEQUAL, "BB"))); - System.out.println(cache.querySheet(null, null, FilterNode.create("name", FilterExpress.IGNORECASENOTLIKE, "B"))); - System.out.println(cache.find(null, FilterNode.create(CacheTestBean::getName, FilterExpress.EQUAL, "BB"))); - System.out.println(cache.find(null, FilterNode.create(CacheTestBean::getName, FilterExpress.IGNORECASEEQUAL, "BB"))); - System.out.println(cache.querySheet(null, null, FilterNode.create(CacheTestBean::getName, FilterExpress.IGNORECASENOTLIKE, "B"))); + System.out.println(cache.find(null, FilterNodes.eq("name", "BB"))); + System.out.println(cache.find(null, FilterNodes.igEq("name", "BB"))); + System.out.println(cache.querySheet(null, null, FilterNodes.igNotLike("name", "B"))); + System.out.println(cache.find(null, FilterNodes.eq(CacheTestBean::getName, "BB"))); + System.out.println(cache.find(null, FilterNodes.igEq(CacheTestBean::getName, "BB"))); + System.out.println(cache.querySheet(null, null, FilterNodes.igNotLike(CacheTestBean::getName, "B"))); } public CacheTestBean() { diff --git a/src/test/java/org/redkale/test/source/FilterNodeTest.java b/src/test/java/org/redkale/test/source/FilterNodeTest.java index ad398ff33..ed7785b40 100644 --- a/src/test/java/org/redkale/test/source/FilterNodeTest.java +++ b/src/test/java/org/redkale/test/source/FilterNodeTest.java @@ -5,22 +5,18 @@ */ package org.redkale.test.source; -import org.redkale.persistence.Cacheable; -import org.redkale.persistence.Id; -import org.redkale.persistence.Transient; -import org.redkale.source.*; -import org.redkale.annotation.AutoLoad; - -import static org.redkale.source.FilterExpress.*; - import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.*; - -import org.redkale.convert.json.*; - import org.junit.jupiter.api.*; +import org.redkale.annotation.AutoLoad; +import org.redkale.convert.json.*; +import org.redkale.persistence.Cacheable; +import org.redkale.persistence.Id; +import org.redkale.persistence.Transient; +import org.redkale.source.*; +import static org.redkale.source.FilterExpress.*; /** * @author zhangjx @@ -105,9 +101,9 @@ public class FilterNodeTest { public void run() throws Exception { final CarTestBean bean = CarTestBean.create(); FilterNode joinNode1 = FilterJoinNode.create(UserTestTable.class, new String[]{"userid", "username"}, "username", LIKE, bean.username) - .or(FilterJoinNode.create(UserTestTable.class, new String[]{"userid", "username"}, "createtime", GREATERTHAN, bean.createtime)); + .or(FilterJoinNode.create(UserTestTable.class, new String[]{"userid", "username"}, "createtime", GT, bean.createtime)); FilterNode joinNode2 = FilterJoinNode.create(CarTypeTestTable.class, "cartype", "typename", LIKE, bean.typename); - final FilterNode node = CarTestBean.caridTransient() ? (joinNode2.or(joinNode1)) : FilterNode.create("carid", GREATERTHAN, bean.carid).and(joinNode1).or(joinNode2); + final FilterNode node = CarTestBean.caridTransient() ? (joinNode2.or(joinNode1)) : FilterNodes.gt("carid", bean.carid).and(joinNode1).or(joinNode2); final FilterNode beanNode = FilterNodeBean.createFilterNode(bean); System.out.println("node.string = " + node); System.out.println("bean.string = " + beanNode); @@ -136,7 +132,7 @@ public class FilterNodeTest { public static class CarTestBean implements FilterBean { @FilterGroup("[OR].[AND]a") - @FilterColumn(express = GREATERTHAN) + @FilterColumn(express = GT) @Transient public long carid; @@ -146,7 +142,7 @@ public class FilterNodeTest { public String username; @FilterGroup("[OR].[AND]a.[OR]c") - @FilterColumn(express = GREATERTHAN) + @FilterColumn(express = GT) @FilterJoinColumn(table = UserTestTable.class, columns = {"userid", "username"}) public long createtime; diff --git a/src/test/java/org/redkale/test/source/TestSourceCache.java b/src/test/java/org/redkale/test/source/TestSourceCache.java index c4af028c9..43538fde6 100644 --- a/src/test/java/org/redkale/test/source/TestSourceCache.java +++ b/src/test/java/org/redkale/test/source/TestSourceCache.java @@ -24,7 +24,7 @@ public class TestSourceCache { public static class TestEntityBean implements FilterBean { - @FilterColumn(express = FilterExpress.GREATERTHAN) + @FilterColumn(express = FilterExpress.GT) public int userid; @FilterColumn(express = FilterExpress.LIKE) @@ -60,9 +60,9 @@ public class TestSourceCache { final Flipper flipper = new Flipper(2); flipper.setSort("userid DESC, createtime DESC"); - final FilterNode node = FilterNode.create("userid", FilterExpress.GREATERTHAN, 1000).and("username", FilterExpress.LIKE, "用户"); + final FilterNode node = FilterNodes.gt("userid", 1000).like("username", "用户"); System.out.println("node = " + node); - final FilterNode node2 = FilterNode.create(TestEntity::getUserid, FilterExpress.GREATERTHAN, 1000).and("username", FilterExpress.LIKE, "用户"); + final FilterNode node2 = FilterNodes.gt(TestEntity::getUserid, 1000).like("username", "用户"); Assertions.assertEquals(node.toString(), node2.toString()); Sheet sheet = info.getCache().querySheet(null, flipper, node); System.out.println(sheet);