diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index 5a5bff4e9..044fed160 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -93,6 +93,7 @@ public abstract class ConvertFactory { this.register(String.class, StringSimpledCoder.instance); this.register(StringConvertWrapper.class, StringConvertWrapperSimpledCoder.instance); this.register(CharSequence.class, CharSequenceSimpledCoder.instance); + this.register(StringBuilder.class, CharSequenceSimpledCoder.StringBuilderSimpledCoder.instance); this.register(java.util.Date.class, DateSimpledCoder.instance); this.register(java.time.Duration.class, DurationSimpledCoder.instance); this.register(AtomicInteger.class, AtomicIntegerSimpledCoder.instance); diff --git a/src/org/redkale/convert/ext/CharSequenceSimpledCoder.java b/src/org/redkale/convert/ext/CharSequenceSimpledCoder.java index e4abfd285..2250ee0fa 100644 --- a/src/org/redkale/convert/ext/CharSequenceSimpledCoder.java +++ b/src/org/redkale/convert/ext/CharSequenceSimpledCoder.java @@ -8,9 +8,11 @@ package org.redkale.convert.ext; import org.redkale.convert.*; /** - * CharSequence 的SimpledCoder实现 + * CharSequence 的SimpledCoder实现 + * + *

+ * 详情见: https://redkale.org * - *

详情见: https://redkale.org * @author zhangjx * @param Reader输入的子类型 * @param Writer输出的子类型 @@ -28,4 +30,20 @@ public class CharSequenceSimpledCoder extend public CharSequence convertFrom(R in) { return in.readString(); } + + public static class StringBuilderSimpledCoder extends SimpledCoder { + + public static final StringBuilderSimpledCoder instance = new StringBuilderSimpledCoder(); + + @Override + public void convertTo(W out, StringBuilder value) { + out.writeString(value == null ? null : value.toString()); + } + + @Override + public StringBuilder convertFrom(R in) { + String rs = in.readString(); + return rs == null ? null : new StringBuilder(rs); + } + } } diff --git a/src/org/redkale/source/ColumnNode.java b/src/org/redkale/source/ColumnNodeValue.java similarity index 51% rename from src/org/redkale/source/ColumnNode.java rename to src/org/redkale/source/ColumnNodeValue.java index 3f6f31ec4..650da345e 100644 --- a/src/org/redkale/source/ColumnNode.java +++ b/src/org/redkale/source/ColumnNodeValue.java @@ -9,11 +9,13 @@ import java.io.Serializable; import static org.redkale.source.ColumnExpress.*; /** - * 作为ColumnValue的value字段值,用于复杂的字段表达式 + * 作为ColumnValue的value字段值,用于复杂的字段表达式 。 + * String 视为 字段名 + * Number 视为 数值 * * @author zhangjx */ -public class ColumnNode implements Serializable { +public class ColumnNodeValue implements Serializable { private Serializable left;//类型只能是String、Number、ColumnNode @@ -21,70 +23,70 @@ public class ColumnNode implements Serializable { private Serializable right;//类型只能是String、Number、ColumnNode - public ColumnNode() { + public ColumnNodeValue() { } - public ColumnNode(Serializable left, ColumnExpress express, Serializable right) { + public ColumnNodeValue(Serializable left, ColumnExpress express, Serializable right) { if (express == null || express == ColumnExpress.MOV) throw new IllegalArgumentException("express cannot be null or MOV"); this.left = left; this.express = express; this.right = right; } - public static ColumnNode create(Serializable left, ColumnExpress express, Serializable right) { - return new ColumnNode(left, express, right); + public static ColumnNodeValue create(Serializable left, ColumnExpress express, Serializable right) { + return new ColumnNodeValue(left, express, right); } - public static ColumnNode inc(Serializable left, Serializable right) { - return new ColumnNode(left, INC, right); + public static ColumnNodeValue inc(Serializable left, Serializable right) { + return new ColumnNodeValue(left, INC, right); } - public static ColumnNode mul(Serializable left, Serializable right) { - return new ColumnNode(left, MUL, right); + public static ColumnNodeValue mul(Serializable left, Serializable right) { + return new ColumnNodeValue(left, MUL, right); } - public static ColumnNode div(Serializable left, Serializable right) { - return new ColumnNode(left, DIV, right); + public static ColumnNodeValue div(Serializable left, Serializable right) { + return new ColumnNodeValue(left, DIV, right); } - public static ColumnNode mod(Serializable left, Serializable right) { - return new ColumnNode(left, MOD, right); + public static ColumnNodeValue mod(Serializable left, Serializable right) { + return new ColumnNodeValue(left, MOD, right); } - public static ColumnNode and(Serializable left, Serializable right) { - return new ColumnNode(left, AND, right); + public static ColumnNodeValue and(Serializable left, Serializable right) { + return new ColumnNodeValue(left, AND, right); } - public static ColumnNode orr(Serializable left, Serializable right) { - return new ColumnNode(left, ORR, right); + public static ColumnNodeValue orr(Serializable left, Serializable right) { + return new ColumnNodeValue(left, ORR, right); } - public ColumnNode inc(Serializable right) { + public ColumnNodeValue inc(Serializable right) { return any(INC, right); } - public ColumnNode mul(Serializable right) { + public ColumnNodeValue mul(Serializable right) { return any(MUL, right); } - public ColumnNode div(Serializable right) { + public ColumnNodeValue div(Serializable right) { return any(DIV, right); } - public ColumnNode mod(Serializable right) { + public ColumnNodeValue mod(Serializable right) { return any(MOD, right); } - public ColumnNode and(Serializable right) { + public ColumnNodeValue and(Serializable right) { return any(AND, right); } - public ColumnNode orr(Serializable right) { + public ColumnNodeValue orr(Serializable right) { return any(ORR, right); } - protected ColumnNode any(ColumnExpress express, Serializable right) { - ColumnNode one = new ColumnNode(this.left, this.express, this.right); + protected ColumnNodeValue any(ColumnExpress express, Serializable right) { + ColumnNodeValue one = new ColumnNodeValue(this.left, this.express, this.right); this.left = one; this.express = express; this.right = right; diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index 25eceece6..1e7f7c4fd 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -602,54 +602,15 @@ public final class EntityCache { Serializable newval = null; switch (express) { case INC: - numb = (Number) attr.get(entity); - if (numb == null) { - numb = (Number) val; - } else { - numb = numb.longValue() + ((Number) val).longValue(); - } - break; case MUL: - numb = (Number) attr.get(entity); - if (numb == null) { - numb = 0; - } else { - numb = numb.longValue() * ((Number) val).floatValue(); - } - break; case DIV: - numb = (Number) attr.get(entity); - if (numb == null) { - numb = 0; - } else { - numb = numb.longValue() / ((Number) val).floatValue(); - } - break; case MOD: - numb = (Number) attr.get(entity); - if (numb == null) { - numb = 0; - } else { - numb = numb.longValue() % ((Number) val).intValue(); - } - break; case AND: - numb = (Number) attr.get(entity); - if (numb == null) { - numb = 0; - } else { - numb = numb.longValue() & ((Number) val).longValue(); - } - break; case ORR: - numb = (Number) attr.get(entity); - if (numb == null) { - numb = 0; - } else { - numb = numb.longValue() | ((Number) val).longValue(); - } + numb = getValue((Number) attr.get(entity), express, val); break; case MOV: + if (val instanceof ColumnNodeValue) val = updateColumnNodeValue(attr, entity, (ColumnNodeValue) val); newval = val; if (val instanceof Number) numb = (Number) val; break; @@ -683,6 +644,70 @@ public final class EntityCache { return entity; } + private Serializable updateColumnNodeValue(Attribute attr, final T entity, ColumnNodeValue node) { + Serializable left = node.getLeft(); + if (left instanceof CharSequence) { + left = info.getUpdateAttribute(left.toString()).get(entity); + } else if (left instanceof ColumnNodeValue) { + left = updateColumnNodeValue(attr, entity, (ColumnNodeValue) left); + } + Serializable right = node.getRight(); + if (left instanceof CharSequence) { + right = info.getUpdateAttribute(right.toString()).get(entity); + } else if (left instanceof ColumnNodeValue) { + right = updateColumnNodeValue(attr, entity, (ColumnNodeValue) right); + } + return getValue((Number) left, node.getExpress(), right); + } + + private Number getValue(Number numb, final ColumnExpress express, Serializable val) { + switch (express) { + case INC: + if (numb == null) { + numb = (Number) val; + } else { + numb = numb.longValue() + ((Number) val).longValue(); + } + break; + case MUL: + if (numb == null) { + numb = 0; + } else { + numb = numb.longValue() * ((Number) val).floatValue(); + } + break; + case DIV: + if (numb == null) { + numb = 0; + } else { + numb = numb.longValue() / ((Number) val).floatValue(); + } + break; + case MOD: + if (numb == null) { + numb = 0; + } else { + numb = numb.longValue() % ((Number) val).intValue(); + } + break; + case AND: + if (numb == null) { + numb = 0; + } else { + numb = numb.longValue() & ((Number) val).longValue(); + } + break; + case ORR: + if (numb == null) { + numb = 0; + } else { + numb = numb.longValue() | ((Number) val).longValue(); + } + break; + } + return numb; + } + public Attribute getAttribute(String fieldname) { return info.getAttribute(fieldname); } diff --git a/src/org/redkale/source/EntityInfo.java b/src/org/redkale/source/EntityInfo.java index 87c21f98d..f178c30df 100644 --- a/src/org/redkale/source/EntityInfo.java +++ b/src/org/redkale/source/EntityInfo.java @@ -999,7 +999,7 @@ public final class EntityInfo { protected CharSequence formatSQLValue(String sqlColumn, Attribute attr, final ColumnValue cv, BiFunction formatter) { if (cv == null) return null; Object val = cv.getValue(); - if (val instanceof ColumnNode && cv.getExpress() == ColumnExpress.MOV) return formatSQLValue(attr, (ColumnNode) val, formatter); + if (val instanceof ColumnNodeValue && cv.getExpress() == ColumnExpress.MOV) return formatSQLValue(attr, (ColumnNodeValue) val, formatter); switch (cv.getExpress()) { case INC: return new StringBuilder().append(sqlColumn).append(" + ").append(val); @@ -1023,18 +1023,18 @@ public final class EntityInfo { return formatter == null ? formatToString(val) : formatter.apply(this, val); } - protected CharSequence formatSQLValue(Attribute attr, final ColumnNode node, BiFunction formatter) { + protected CharSequence formatSQLValue(Attribute attr, final ColumnNodeValue node, BiFunction formatter) { Serializable left = node.getLeft(); if (left instanceof CharSequence) { left = this.getSQLColumn(null, left.toString()); - } else if (left instanceof ColumnNode) { - left = "(" + formatSQLValue(attr, (ColumnNode) left, formatter) + ")"; + } else if (left instanceof ColumnNodeValue) { + left = "(" + formatSQLValue(attr, (ColumnNodeValue) left, formatter) + ")"; } Serializable right = node.getRight(); if (right instanceof CharSequence) { right = this.getSQLColumn(null, right.toString()); - } else if (left instanceof ColumnNode) { - right = "(" + formatSQLValue(attr, (ColumnNode) right, formatter) + ")"; + } else if (left instanceof ColumnNodeValue) { + right = "(" + formatSQLValue(attr, (ColumnNodeValue) right, formatter) + ")"; } switch (node.getExpress()) { case INC: