This commit is contained in:
@@ -93,6 +93,7 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
|
||||
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);
|
||||
|
||||
@@ -8,9 +8,11 @@ package org.redkale.convert.ext;
|
||||
import org.redkale.convert.*;
|
||||
|
||||
/**
|
||||
* CharSequence 的SimpledCoder实现
|
||||
* CharSequence 的SimpledCoder实现
|
||||
*
|
||||
* <p>
|
||||
* 详情见: https://redkale.org
|
||||
*
|
||||
* <p> 详情见: https://redkale.org
|
||||
* @author zhangjx
|
||||
* @param <R> Reader输入的子类型
|
||||
* @param <W> Writer输出的子类型
|
||||
@@ -28,4 +30,20 @@ public class CharSequenceSimpledCoder<R extends Reader, W extends Writer> extend
|
||||
public CharSequence convertFrom(R in) {
|
||||
return in.readString();
|
||||
}
|
||||
|
||||
public static class StringBuilderSimpledCoder<R extends Reader, W extends Writer> extends SimpledCoder<R, W, StringBuilder> {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -602,54 +602,15 @@ public final class EntityCache<T> {
|
||||
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<T> {
|
||||
return entity;
|
||||
}
|
||||
|
||||
private <V> Serializable updateColumnNodeValue(Attribute<T, V> 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 <V> 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<T, Serializable> getAttribute(String fieldname) {
|
||||
return info.getAttribute(fieldname);
|
||||
}
|
||||
|
||||
@@ -999,7 +999,7 @@ public final class EntityInfo<T> {
|
||||
protected CharSequence formatSQLValue(String sqlColumn, Attribute<T, Serializable> attr, final ColumnValue cv, BiFunction<EntityInfo, Object, CharSequence> 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<T> {
|
||||
return formatter == null ? formatToString(val) : formatter.apply(this, val);
|
||||
}
|
||||
|
||||
protected CharSequence formatSQLValue(Attribute<T, Serializable> attr, final ColumnNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {
|
||||
protected CharSequence formatSQLValue(Attribute<T, Serializable> attr, final ColumnNodeValue node, BiFunction<EntityInfo, Object, CharSequence> 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:
|
||||
|
||||
Reference in New Issue
Block a user