增加ColumnXXXNode功能

This commit is contained in:
redkale
2023-11-17 22:57:21 +08:00
parent 36c68df5ff
commit b29dedbb79
10 changed files with 430 additions and 165 deletions

View File

@@ -1702,11 +1702,11 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
setsql.append(", "); setsql.append(", ");
} }
String sqlColumn = info.getSQLColumn(null, col.getColumn()); String sqlColumn = info.getSQLColumn(null, col.getColumn());
if (col.getValue() instanceof byte[]) { if (col.getValue2() instanceof ColumnBytesNode) {
if (blobs == null) { if (blobs == null) {
blobs = new ArrayList<>(); blobs = new ArrayList<>();
} }
blobs.add((byte[]) col.getValue()); blobs.add(((ColumnBytesNode) col.getValue2()).getValue());
setsql.append(sqlColumn).append("=").append(prepareParamSign(++index)); setsql.append(sqlColumn).append("=").append(prepareParamSign(++index));
} else { } else {
setsql.append(sqlColumn).append("=").append(info.formatSQLValue(sqlColumn, attr, col, sqlFormatter)); setsql.append(sqlColumn).append("=").append(info.formatSQLValue(sqlColumn, attr, col, sqlFormatter));
@@ -1787,11 +1787,11 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
setsql.append(", "); setsql.append(", ");
} }
String sqlColumn = info.getSQLColumn(alias, col.getColumn()); String sqlColumn = info.getSQLColumn(alias, col.getColumn());
if (col.getValue() instanceof byte[]) { if (col.getValue2() instanceof ColumnBytesNode) {
if (blobs == null) { if (blobs == null) {
blobs = new ArrayList<>(); blobs = new ArrayList<>();
} }
blobs.add((byte[]) col.getValue()); blobs.add(((ColumnBytesNode) col.getValue2()).getValue());
setsql.append(sqlColumn).append("=").append(prepareParamSign(++index)); setsql.append(sqlColumn).append("=").append(prepareParamSign(++index));
} else { } else {
setsql.append(sqlColumn).append("=").append(info.formatSQLValue(sqlColumn, attr, col, sqlFormatter)); setsql.append(sqlColumn).append("=").append(info.formatSQLValue(sqlColumn, attr, col, sqlFormatter));
@@ -2456,9 +2456,9 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
funcSqlColumns.append(", "); funcSqlColumns.append(", ");
} }
if (funcNodes[i] instanceof ColumnFuncNode) { if (funcNodes[i] instanceof ColumnFuncNode) {
funcSqlColumns.append(info.formatSQLValue((Attribute) null, "a", (ColumnFuncNode) funcNodes[i], sqlFormatter)); funcSqlColumns.append(info.formatColumnFuncNodeSQLValue((Attribute) null, "a", (ColumnFuncNode) funcNodes[i], sqlFormatter));
} else { } else {
funcSqlColumns.append(info.formatSQLValue((Attribute) null, "a", (ColumnExpNode) funcNodes[i], sqlFormatter)); funcSqlColumns.append(info.formatColumnExpNodeSQLValue((Attribute) null, "a", (ColumnExpNode) funcNodes[i], sqlFormatter));
} }
} }
final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis(); final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis();

View File

@@ -0,0 +1,46 @@
/*
*
*/
package org.redkale.source;
import org.redkale.convert.ConvertColumn;
/**
* byte[]的ColumnNode
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class ColumnBytesNode implements ColumnNode {
@ConvertColumn(index = 1)
private byte[] value;
public ColumnBytesNode() {
}
public ColumnBytesNode(byte[] value) {
this.value = value;
}
public static ColumnBytesNode create(byte[] value) {
return new ColumnBytesNode(value);
}
public byte[] getValue() {
return value;
}
public void setValue(byte[] value) {
this.value = value;
}
@Override
public String toString() {
return "{\"value\":" + value + "}";
}
}

View File

@@ -6,6 +6,7 @@
package org.redkale.source; package org.redkale.source;
import java.io.Serializable; import java.io.Serializable;
import org.redkale.convert.ConvertColumn;
import static org.redkale.source.ColumnExpress.*; import static org.redkale.source.ColumnExpress.*;
/** /**
@@ -13,9 +14,9 @@ import static org.redkale.source.ColumnExpress.*;
* String 视为 字段名 <br> * String 视为 字段名 <br>
* Number 视为 数值 <br> * Number 视为 数值 <br>
* 例如: UPDATE Reord SET updateTime = createTime + 10 WHERE id = 1 <br> * 例如: UPDATE Reord SET updateTime = createTime + 10 WHERE id = 1 <br>
source.updateColumn(Record.class, 1, ColumnValue.mov("updateTime", ColumnExpNode.inc("createTime", 10))); <br> * source.updateColumn(Record.class, 1, ColumnValue.mov("updateTime", ColumnExpNode.inc("createTime", 10))); <br>
* 例如: UPDATE Reord SET updateTime = createTime * 10 / createCount WHERE id = 1 <br> * 例如: UPDATE Reord SET updateTime = createTime * 10 / createCount WHERE id = 1 <br>
source.updateColumn(Record.class, 1, ColumnValue.mov("updateTime", ColumnExpNode.div(ColumnExpNode.mul("createTime", 10), "createCount"))); <br> * source.updateColumn(Record.class, 1, ColumnValue.mov("updateTime", ColumnExpNode.div(ColumnExpNode.mul("createTime", 10), "createCount"))); <br>
* *
* <p> * <p>
* 详情见: https://redkale.org * 详情见: https://redkale.org
@@ -25,34 +26,50 @@ import static org.redkale.source.ColumnExpress.*;
*/ */
public class ColumnExpNode implements ColumnNode { public class ColumnExpNode implements ColumnNode {
protected Serializable left;//类型只能是String、Number、ColumnExpNode @ConvertColumn(index = 1)
protected ColumnNode left;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
protected ColumnExpress express; //MOV时left必须是String, right必须是null @ConvertColumn(index = 2)
protected ColumnExpress express; //MOV时left必须是ColumnNameNode, right必须是null
protected Serializable right;//类型只能是String、Number、ColumnExpNode @ConvertColumn(index = 3)
protected ColumnNode right;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
public ColumnExpNode() { public ColumnExpNode() {
} }
public ColumnExpNode(Serializable left, ColumnExpress express, Serializable right) { protected ColumnExpNode(Serializable left, ColumnExpress express, Serializable right) {
if (express == null) { if (express == null) {
throw new IllegalArgumentException("express cannot be null"); throw new IllegalArgumentException("express cannot be null");
} }
ColumnNode leftNode = createColumnNode(left);
ColumnNode rightNode = createColumnNode(right);
if (express == MOV) { if (express == MOV) {
if (!(left instanceof String) || right != null) { if (!(leftNode instanceof ColumnNameNode) || right != null) {
throw new IllegalArgumentException("left value must be String, right value must be null on ColumnExpress.MOV"); throw new IllegalArgumentException("left value must be ColumnNameNode, right value must be null on ColumnExpress.MOV");
}
} else {
if (!(left instanceof String) && !(left instanceof Number) && !(left instanceof ColumnExpNode) && !(left instanceof ColumnFuncNode)) {
throw new IllegalArgumentException("left value must be String, Number, ColumnFuncNode or ColumnExpNode");
}
if (!(right instanceof String) && !(right instanceof Number) && !(right instanceof ColumnExpNode) && !(right instanceof ColumnFuncNode)) {
throw new IllegalArgumentException("right value must be String, Number, ColumnFuncNode or ColumnExpNode");
} }
} }
this.left = left; this.left = leftNode;
this.express = express; this.express = express;
this.right = right; this.right = rightNode;
}
private ColumnNode createColumnNode(Serializable value) {
if (value == null) {
return null;
}
if (value instanceof String) {
return new ColumnNameNode(value.toString());
}
if (value instanceof Number) {
return new ColumnNumberNode((Number) value);
}
if (!(value instanceof ColumnNameNode)
&& !(value instanceof ColumnNumberNode)
&& !(value instanceof ColumnExpNode)) {
throw new IllegalArgumentException("value must be ColumnNameNode、ColumnNumberNode、ColumnExpNode");
}
return (ColumnNode) value;
} }
public static ColumnExpNode create(Serializable left, ColumnExpress express, Serializable right) { public static ColumnExpNode create(Serializable left, ColumnExpress express, Serializable right) {
@@ -123,15 +140,15 @@ public class ColumnExpNode implements ColumnNode {
ColumnExpNode one = new ColumnExpNode(this.left, this.express, this.right); ColumnExpNode one = new ColumnExpNode(this.left, this.express, this.right);
this.left = one; this.left = one;
this.express = express; this.express = express;
this.right = right; this.right = createColumnNode(right);
return this; return this;
} }
public Serializable getLeft() { public ColumnNode getLeft2() {
return left; return left;
} }
public void setLeft(Serializable left) { public void setLeft(ColumnNode left) {
this.left = left; this.left = left;
} }
@@ -143,16 +160,16 @@ public class ColumnExpNode implements ColumnNode {
this.express = express; this.express = express;
} }
public Serializable getRight() { public ColumnNode getRight2() {
return right; return right;
} }
public void setRight(Serializable right) { public void setRight(ColumnNode right) {
this.right = right; this.right = right;
} }
@Override @Override
public String toString() { public String toString() {
return "{\"column\":" + ((left instanceof CharSequence) ? ("\"" + left + "\"") : left) + ", \"express\":" + express + ", \"value\":" + ((right instanceof CharSequence) ? ("\"" + right + "\"") : right) + "}"; return "{\"column\":" + left + ", \"express\":" + express + ", \"value\":" + right + "}";
} }
} }

View File

@@ -6,10 +6,10 @@
package org.redkale.source; package org.redkale.source;
import java.io.Serializable; import java.io.Serializable;
import org.redkale.convert.ConvertColumn;
/** /**
* 与ColumnExpNode 组合,用于复杂的字段表达式 。 * 与ColumnNameNode、ColumnExpNode组合用于复杂的字段表达式 。
* String 视为 字段名
* *
* <p> * <p>
* 详情见: https://redkale.org * 详情见: https://redkale.org
@@ -19,19 +19,32 @@ import java.io.Serializable;
*/ */
public class ColumnFuncNode implements ColumnNode { public class ColumnFuncNode implements ColumnNode {
@ConvertColumn(index = 1)
protected FilterFunc func; protected FilterFunc func;
protected Serializable value;//类型只能是String、ColumnExpNode @ConvertColumn(index = 2)
protected ColumnNode value;//类型只能是ColumnNameNode、ColumnExpNode、ColumnFuncNode
public ColumnFuncNode() { public ColumnFuncNode() {
} }
public ColumnFuncNode(FilterFunc func, Serializable node) { protected ColumnFuncNode(FilterFunc func, Serializable node) {
if (!(node instanceof String) && !(node instanceof ColumnExpNode)) {
throw new IllegalArgumentException("value must be String or ColumnExpNode");
}
this.func = func; this.func = func;
this.value = node; this.value = createColumnNode(node);
}
protected ColumnNode createColumnNode(Serializable value) {
if (value instanceof String) {
return new ColumnNameNode(value.toString());
} else if (value instanceof ColumnNameNode) {
return (ColumnNode) value;
} else if (value instanceof ColumnExpNode) {
return (ColumnNode) value;
} else if (value instanceof ColumnFuncNode) {
return (ColumnNode) value;
} else {
throw new IllegalArgumentException("value must be ColumnNameNode or ColumnExpNode or ColumnFuncNode");
}
} }
public static ColumnFuncNode create(FilterFunc func, Serializable node) { public static ColumnFuncNode create(FilterFunc func, Serializable node) {
@@ -70,16 +83,16 @@ public class ColumnFuncNode implements ColumnNode {
this.func = func; this.func = func;
} }
public Serializable getValue() { public ColumnNode getValue2() {
return value; return value;
} }
public void setValue(Serializable value) { public void setValue(ColumnNode value) {
this.value = value; this.value = value;
} }
@Override @Override
public String toString() { public String toString() {
return "{\"func\":\"" + func + "\", \"value\":" + ((value instanceof CharSequence) ? ("\"" + value + "\"") : value) + "}"; return "{\"func\":\"" + func + "\", \"value\":" + value + "}";
} }
} }

View File

@@ -0,0 +1,48 @@
/*
*
*/
package org.redkale.source;
import java.util.Objects;
import org.redkale.convert.ConvertColumn;
/**
* 字段名的ColumnNode
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class ColumnNameNode implements ColumnNode {
@ConvertColumn(index = 1)
private String column;
public ColumnNameNode() {
}
public ColumnNameNode(String column) {
Objects.requireNonNull(column, "column is null");
this.column = column;
}
public static ColumnNameNode create(String column) {
return new ColumnNameNode(column);
}
public String getColumn() {
return column;
}
public void setColumn(String column) {
this.column = column;
}
@Override
public String toString() {
return "{\"column\":\"" + column + "\"}";
}
}

View File

@@ -0,0 +1,48 @@
/*
*
*/
package org.redkale.source;
import java.util.Objects;
import org.redkale.convert.ConvertColumn;
/**
* 数值的ColumnNode
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class ColumnNumberNode implements ColumnNode {
@ConvertColumn(index = 1)
private Number value;
public ColumnNumberNode() {
}
public ColumnNumberNode(Number value) {
Objects.requireNonNull(value, "number is null");
this.value = value;
}
public static ColumnNumberNode create(Number value) {
return new ColumnNumberNode(value);
}
public Number getValue() {
return value;
}
public void setValue(Number value) {
this.value = value;
}
@Override
public String toString() {
return "{\"value\":" + value + "}";
}
}

View File

@@ -0,0 +1,48 @@
/*
*
*/
package org.redkale.source;
import java.util.Objects;
import org.redkale.convert.ConvertColumn;
/**
* 字符串的ColumnNode
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class ColumnStringNode implements ColumnNode {
@ConvertColumn(index = 1)
private String value;
public ColumnStringNode() {
}
public ColumnStringNode(String value) {
Objects.requireNonNull(value, "string value is null");
this.value = value;
}
public static ColumnStringNode create(String value) {
return new ColumnStringNode(value);
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "{\"value\":\"" + value + "\"}";
}
}

View File

@@ -13,7 +13,7 @@ import org.redkale.util.*;
/** /**
* ColumnValue主要用于多个字段更新的表达式。 * ColumnValue主要用于多个字段更新的表达式。
* value值一般为: ColumnExpNode、ColumnFuncNode、Number、String等 <br> * value值一般为:ColumnExpNode、ColumnFuncNode、ColumnNameNode、ColumnNumberNode、ColumnStringNode、ColumnBytesNode <br>
* 用于 DataSource.updateColumn 方法 <br> * 用于 DataSource.updateColumn 方法 <br>
* *
* <p> * <p>
@@ -30,33 +30,40 @@ public class ColumnValue {
private ColumnExpress express; private ColumnExpress express;
@ConvertColumn(index = 3) @ConvertColumn(index = 3)
private Serializable value; private ColumnNode value;
public ColumnValue() { public ColumnValue() {
} }
private <T extends Serializable> ColumnValue(LambdaSupplier<T> func) { protected <T extends Serializable> ColumnValue(LambdaSupplier<T> func, ColumnExpress express) {
this(LambdaSupplier.readColumn(func), ColumnExpress.MOV, func.get());
}
public <T extends Serializable> ColumnValue(LambdaSupplier<T> func, ColumnExpress express) {
this(LambdaSupplier.readColumn(func), express, func.get()); this(LambdaSupplier.readColumn(func), express, func.get());
} }
public <T> ColumnValue(LambdaFunction<T, ?> func, ColumnExpress express, Serializable value) { protected <T> ColumnValue(LambdaFunction<T, ?> func, ColumnExpress express, Serializable value) {
this(LambdaFunction.readColumn(func), express, value); this(LambdaFunction.readColumn(func), express, value);
} }
private ColumnValue(String column, Serializable value) { protected ColumnValue(String column, ColumnExpress express, Serializable value) {
this(column, ColumnExpress.MOV, value);
}
public ColumnValue(String column, ColumnExpress express, Serializable value) {
Objects.requireNonNull(column); Objects.requireNonNull(column);
Objects.requireNonNull(express); Objects.requireNonNull(express);
this.column = column; this.column = column;
this.express = express; this.express = express;
this.value = value; if (value instanceof String) {
this.value = new ColumnStringNode(value.toString());
} else if (value instanceof Number) {
this.value = new ColumnNumberNode((Number) value);
} else if (value instanceof ColumnExpNode
|| value instanceof ColumnFuncNode
|| value instanceof ColumnNameNode
|| value instanceof ColumnNumberNode
|| value instanceof ColumnStringNode
|| value instanceof ColumnBytesNode) {
this.value = (ColumnNode) value;
} else if (value == null) {
this.value = null;
} else {
throw new IllegalArgumentException("Not supported value: " + value);
}
} }
/** /**
@@ -68,7 +75,7 @@ public class ColumnValue {
* @return ColumnValue * @return ColumnValue
*/ */
public static ColumnValue create(String column, Serializable value) { public static ColumnValue create(String column, Serializable value) {
return new ColumnValue(column, value); return new ColumnValue(column, MOV, value);
} }
/** /**
@@ -205,7 +212,7 @@ public class ColumnValue {
* @since 2.8.0 * @since 2.8.0
*/ */
public static <T extends Serializable> ColumnValue create(LambdaSupplier<T> func) { public static <T extends Serializable> ColumnValue create(LambdaSupplier<T> func) {
return new ColumnValue(func); return new ColumnValue(func, MOV);
} }
/** /**
@@ -470,16 +477,16 @@ public class ColumnValue {
this.express = express; this.express = express;
} }
public Serializable getValue() { public ColumnNode getValue2() {
return value; return value;
} }
public void setValue(Serializable value) { public void setValue(ColumnNode value) {
this.value = value; this.value = value;
} }
@Override @Override
public String toString() { public String toString() {
return "{\"column\":\"" + column + "\", \"express\":" + express + ", \"value\":" + ((value instanceof CharSequence) ? ("\"" + value + "\"") : value) + "}"; return "{\"column\":\"" + column + "\", \"express\":" + express + ", \"value\":" + value + "}";
} }
} }

View File

@@ -536,30 +536,31 @@ public final class EntityCache<T> {
private Number queryColumnNumber(final List<T> list, final ColumnNode funcNode) { private Number queryColumnNumber(final List<T> list, final ColumnNode funcNode) {
if (funcNode instanceof ColumnFuncNode) { if (funcNode instanceof ColumnFuncNode) {
return queryColumnNumber(list, (ColumnFuncNode) funcNode); return queryColumnFuncNodeNumber(list, (ColumnFuncNode) funcNode);
} else if (funcNode instanceof ColumnExpNode) { } else if (funcNode instanceof ColumnExpNode) {
return queryColumnNumber(list, (ColumnExpNode) funcNode); return queryColumnExpNodeNumber(list, (ColumnExpNode) funcNode);
} else { } else {
return null; return null;
} }
} }
private Number queryColumnNumber(final List<T> list, final ColumnFuncNode funcNode) { private Number queryColumnFuncNodeNumber(final List<T> list, final ColumnFuncNode funcNode) {
if (funcNode.getValue() instanceof String) { if (funcNode.getValue2() instanceof ColumnNameNode) {
final Attribute<T, Serializable> attr = info.getAttribute((String) funcNode.getValue()); final Attribute<T, Serializable> attr = info.getAttribute(((ColumnNameNode) funcNode.getValue2()).getColumn());
final Function<T, Number> attrFunc = x -> (Number) attr.get(x); final Function<T, Number> attrFunc = x -> (Number) attr.get(x);
return getNumberResult(list, funcNode.getFunc(), null, attr.type(), attrFunc, (FilterNode) null); return getNumberResult(list, funcNode.getFunc(), null, attr.type(), attrFunc, (FilterNode) null);
} }
Number num = null; Number num = null;
if (funcNode.getValue() instanceof ColumnFuncNode) { if (funcNode.getValue2() instanceof ColumnFuncNode) {
num = queryColumnNumber(list, (ColumnFuncNode) funcNode.getValue()); num = queryColumnFuncNodeNumber(list, (ColumnFuncNode) funcNode.getValue2());
} else if (funcNode.getValue() instanceof ColumnExpNode) { } else if (funcNode.getValue2() instanceof ColumnExpNode) {
num = queryColumnNumber(list, (ColumnExpNode) funcNode.getValue()); num = queryColumnExpNodeNumber(list, (ColumnExpNode) funcNode.getValue2());
} }
return num; return num;
} }
private Number queryColumnNumber(final List<T> list, final ColumnExpNode nodeValue) { private Number queryColumnExpNodeNumber(final List<T> list, final ColumnExpNode nodeValue) {
//TODO 尚未实现
return null; return null;
} }
@@ -889,7 +890,7 @@ public final class EntityCache<T> {
return rms; return rms;
} }
public <V> T updateColumn(final Serializable pk, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) { public T updateColumn(final Serializable pk, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) {
if (pk == null || attrs == null || attrs.isEmpty()) { if (pk == null || attrs == null || attrs.isEmpty()) {
return null; return null;
} }
@@ -901,7 +902,7 @@ public final class EntityCache<T> {
try { try {
for (int i = 0; i < attrs.size(); i++) { for (int i = 0; i < attrs.size(); i++) {
ColumnValue cv = values.get(i); ColumnValue cv = values.get(i);
updateColumn(attrs.get(i), rs, cv.getExpress(), cv.getValue()); updateColumn(attrs.get(i), rs, cv.getExpress(), cv.getValue2());
} }
} finally { } finally {
tableLock.unlock(); tableLock.unlock();
@@ -909,7 +910,7 @@ public final class EntityCache<T> {
return rs; return rs;
} }
public <V> T[] updateColumn(final FilterNode node, final Flipper flipper, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) { public T[] updateColumn(final FilterNode node, final Flipper flipper, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) {
if (attrs == null || attrs.isEmpty() || node == null) { if (attrs == null || attrs.isEmpty() || node == null) {
return (T[]) Creator.newArray(type, 0); return (T[]) Creator.newArray(type, 0);
} }
@@ -927,7 +928,7 @@ public final class EntityCache<T> {
for (T rs : rms) { for (T rs : rms) {
for (int i = 0; i < attrs.size(); i++) { for (int i = 0; i < attrs.size(); i++) {
ColumnValue cv = values.get(i); ColumnValue cv = values.get(i);
updateColumn(attrs.get(i), rs, cv.getExpress(), cv.getValue()); updateColumn(attrs.get(i), rs, cv.getExpress(), cv.getValue2());
} }
} }
} finally { } finally {
@@ -1003,7 +1004,7 @@ public final class EntityCache<T> {
private <V> T updateColumn(Attribute<T, V> attr, final T entity, final ColumnExpress express, Serializable val) { private <V> T updateColumn(Attribute<T, V> attr, final T entity, final ColumnExpress express, Serializable val) {
final Class ft = attr.type(); final Class ft = attr.type();
Number numb = null; Number numb = null;
Serializable newval = null; Serializable newVal = null;
switch (express) { switch (express) {
case INC: case INC:
case DEC: case DEC:
@@ -1012,13 +1013,13 @@ public final class EntityCache<T> {
case MOD: case MOD:
case AND: case AND:
case ORR: case ORR:
numb = getValue((Number) attr.get(entity), express, val); numb = getNumberValue((Number) attr.get(entity), express, val instanceof ColumnNumberNode ? ((ColumnNumberNode) val).getValue() : (Number) val);
break; break;
case MOV: case MOV:
if (val instanceof ColumnExpNode) { if (val instanceof ColumnExpNode) {
val = updateColumnExpNode(attr, entity, (ColumnExpNode) val); val = updateColumnExpNode(attr, entity, (ColumnExpNode) val);
} }
newval = val; newVal = val;
if (val instanceof Number) { if (val instanceof Number) {
numb = (Number) val; numb = (Number) val;
} }
@@ -1026,85 +1027,94 @@ public final class EntityCache<T> {
} }
if (numb != null) { if (numb != null) {
if (ft == int.class || ft == Integer.class) { if (ft == int.class || ft == Integer.class) {
newval = numb.intValue(); newVal = numb.intValue();
} else if (ft == long.class || ft == Long.class) { } else if (ft == long.class || ft == Long.class) {
newval = numb.longValue(); newVal = numb.longValue();
} else if (ft == short.class || ft == Short.class) { } else if (ft == short.class || ft == Short.class) {
newval = numb.shortValue(); newVal = numb.shortValue();
} else if (ft == float.class || ft == Float.class) { } else if (ft == float.class || ft == Float.class) {
newval = numb.floatValue(); newVal = numb.floatValue();
} else if (ft == double.class || ft == Double.class) { } else if (ft == double.class || ft == Double.class) {
newval = numb.doubleValue(); newVal = numb.doubleValue();
} else if (ft == byte.class || ft == Byte.class) { } else if (ft == byte.class || ft == Byte.class) {
newval = numb.byteValue(); newVal = numb.byteValue();
} else if (ft == AtomicInteger.class) { } else if (ft == AtomicInteger.class) {
newval = new AtomicInteger(numb.intValue()); newVal = new AtomicInteger(numb.intValue());
} else if (ft == AtomicLong.class) { } else if (ft == AtomicLong.class) {
newval = new AtomicLong(numb.longValue()); newVal = new AtomicLong(numb.longValue());
} else if (ft == LongAdder.class) { } else if (ft == LongAdder.class) {
LongAdder la = new LongAdder(); LongAdder la = new LongAdder();
la.add(numb.longValue()); la.add(numb.longValue());
newval = la; newVal = la;
} }
} else { } else {
if (ft == AtomicInteger.class && newval != null && newval.getClass() != AtomicInteger.class) { if (ft == AtomicInteger.class && newVal != null && newVal.getClass() != AtomicInteger.class) {
newval = new AtomicInteger(((Number) newval).intValue()); newVal = new AtomicInteger(((Number) newVal).intValue());
} else if (ft == AtomicLong.class && newval != null && newval.getClass() != AtomicLong.class) { } else if (ft == AtomicLong.class && newVal != null && newVal.getClass() != AtomicLong.class) {
newval = new AtomicLong(((Number) newval).longValue()); newVal = new AtomicLong(((Number) newVal).longValue());
} else if (ft == LongAdder.class && newval != null && newval.getClass() != LongAdder.class) { } else if (ft == LongAdder.class && newVal != null && newVal.getClass() != LongAdder.class) {
LongAdder la = new LongAdder(); LongAdder la = new LongAdder();
la.add(((Number) newval).longValue()); la.add(((Number) newVal).longValue());
newval = la; newVal = la;
} }
} }
attr.set(entity, (V) newval); attr.set(entity, (V) newVal);
return entity; return entity;
} }
private <V> Serializable updateColumnExpNode(Attribute<T, V> attr, final T entity, ColumnExpNode node) { private <V> Serializable updateColumnExpNode(Attribute<T, V> attr, final T entity, ColumnExpNode node) {
Serializable left = node.getLeft(); Serializable leftVal = null;
if (left instanceof CharSequence) { ColumnNode leftNode = node.getLeft2();
left = info.getUpdateAttribute(left.toString()).get(entity); //类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
if (node.getExpress() == ColumnExpress.MOV) { if (leftNode instanceof ColumnNameNode) {
return left; leftVal = info.getUpdateAttribute(leftNode.toString()).get(entity);
} } else if (leftNode instanceof ColumnNumberNode) {
} else if (left instanceof ColumnExpNode) { leftVal = ((ColumnNumberNode) leftNode).getValue();
left = updateColumnExpNode(attr, entity, (ColumnExpNode) left); } else if (leftNode instanceof ColumnExpNode) {
leftVal = updateColumnExpNode(attr, entity, (ColumnExpNode) leftNode);
} }
Serializable right = node.getRight(); if (node.getExpress() == ColumnExpress.MOV) {
if (left instanceof CharSequence) { return leftVal;
right = info.getUpdateAttribute(right.toString()).get(entity);
} else if (left instanceof ColumnExpNode) {
right = updateColumnExpNode(attr, entity, (ColumnExpNode) right);
} }
return getValue((Number) left, node.getExpress(), right);
Serializable rightVal = null;
ColumnNode rightNode = node.getRight2();
//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
if (rightNode instanceof ColumnNameNode) {
rightVal = info.getUpdateAttribute(rightNode.toString()).get(entity);
} else if (rightNode instanceof ColumnNumberNode) {
rightVal = ((ColumnNumberNode) rightNode).getValue();
} else if (rightNode instanceof ColumnExpNode) {
rightVal = updateColumnExpNode(attr, entity, (ColumnExpNode) rightNode);
}
return getNumberValue((Number) leftVal, node.getExpress(), (Number) rightVal);
} }
private <V> Number getValue(Number numb, final ColumnExpress express, Serializable val) { private Number getNumberValue(Number numb, final ColumnExpress express, Number val) {
switch (express) { switch (express) {
case INC: case INC:
if (numb == null) { if (numb == null) {
numb = (Number) val; numb = val;
} else { } else {
if (numb instanceof Float || ((Number) val) instanceof Float) { if (numb instanceof Float || val instanceof Float) {
numb = numb.floatValue() + ((Number) val).floatValue(); numb = numb.floatValue() + val.floatValue();
} else if (numb instanceof Double || ((Number) val) instanceof Double) { } else if (numb instanceof Double || val instanceof Double) {
numb = numb.doubleValue() + ((Number) val).doubleValue(); numb = numb.doubleValue() + val.doubleValue();
} else { } else {
numb = numb.longValue() + ((Number) val).longValue(); numb = numb.longValue() + val.longValue();
} }
} }
break; break;
case DEC: case DEC:
if (numb == null) { if (numb == null) {
numb = (Number) val; numb = val;
} else { } else {
if (numb instanceof Float || ((Number) val) instanceof Float) { if (numb instanceof Float || val instanceof Float) {
numb = numb.floatValue() - ((Number) val).floatValue(); numb = numb.floatValue() - val.floatValue();
} else if (numb instanceof Double || ((Number) val) instanceof Double) { } else if (numb instanceof Double || val instanceof Double) {
numb = numb.doubleValue() - ((Number) val).doubleValue(); numb = numb.doubleValue() - val.doubleValue();
} else { } else {
numb = numb.longValue() - ((Number) val).longValue(); numb = numb.longValue() - val.longValue();
} }
} }
break; break;
@@ -1112,35 +1122,35 @@ public final class EntityCache<T> {
if (numb == null) { if (numb == null) {
numb = 0; numb = 0;
} else { } else {
numb = numb.longValue() * ((Number) val).floatValue(); numb = numb.longValue() * val.floatValue();
} }
break; break;
case DIV: case DIV:
if (numb == null) { if (numb == null) {
numb = 0; numb = 0;
} else { } else {
numb = numb.longValue() / ((Number) val).floatValue(); numb = numb.longValue() / val.floatValue();
} }
break; break;
case MOD: case MOD:
if (numb == null) { if (numb == null) {
numb = 0; numb = 0;
} else { } else {
numb = numb.longValue() % ((Number) val).intValue(); numb = numb.longValue() % val.intValue();
} }
break; break;
case AND: case AND:
if (numb == null) { if (numb == null) {
numb = 0; numb = 0;
} else { } else {
numb = numb.longValue() & ((Number) val).longValue(); numb = numb.longValue() & val.longValue();
} }
break; break;
case ORR: case ORR:
if (numb == null) { if (numb == null) {
numb = 0; numb = 0;
} else { } else {
numb = numb.longValue() | ((Number) val).longValue(); numb = numb.longValue() | val.longValue();
} }
break; break;
} }

View File

@@ -1511,13 +1511,22 @@ public final class EntityInfo<T> {
if (cv == null) { if (cv == null) {
return null; return null;
} }
Object val = cv.getValue(); //ColumnExpNode、ColumnFuncNode、ColumnNameNode、ColumnNumberNode、ColumnStringNode
ColumnNode node = cv.getValue2();
//ColumnExpNode时 cv.getExpress() == ColumnExpress.MOV 只用于updateColumn //ColumnExpNode时 cv.getExpress() == ColumnExpress.MOV 只用于updateColumn
if (val instanceof ColumnExpNode) { if (node instanceof ColumnExpNode) {
return formatSQLValue(attr, null, (ColumnExpNode) val, formatter); return formatColumnExpNodeSQLValue(attr, null, (ColumnExpNode) node, formatter);
} }
if (val instanceof ColumnFuncNode) { if (node instanceof ColumnFuncNode) {
return formatSQLValue(attr, null, (ColumnFuncNode) val, formatter); return formatColumnFuncNodeSQLValue(attr, null, (ColumnFuncNode) node, formatter);
}
CharSequence val = null;
if (node instanceof ColumnNameNode) {
val = formatColumnNameNodeSQLValue(attr, null, (ColumnNameNode) node, formatter);
} else if (node instanceof ColumnNumberNode) {
val = formatColumnNumberNodeSQLValue(attr, null, (ColumnNumberNode) node, formatter);
} else if (node instanceof ColumnStringNode) {
val = formatColumnStringNodeSQLValue(attr, null, (ColumnStringNode) node, formatter);
} }
switch (cv.getExpress()) { switch (cv.getExpress()) {
case INC: case INC:
@@ -1535,62 +1544,81 @@ public final class EntityInfo<T> {
case ORR: case ORR:
return new StringBuilder().append(sqlColumn).append(" | ").append(val); return new StringBuilder().append(sqlColumn).append(" | ").append(val);
case MOV: case MOV:
CharSequence rs = formatter == null ? formatToString(val) : formatter.apply(this, val); return val == null && isNotNullJson(attr) ? "" : val;
if (rs == null && isNotNullJson(attr)) { default:
rs = ""; return val;
}
return rs;
} }
return formatter == null ? formatToString(val) : formatter.apply(this, val);
} }
protected CharSequence formatSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnFuncNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) { protected CharSequence formatColumnFuncNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnFuncNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {
if (node.getValue() instanceof ColumnExpNode) { if (node.getValue2() instanceof ColumnExpNode) {
return node.getFunc().getColumn(formatSQLValue(attr, tabalis, (ColumnExpNode) node.getValue(), formatter).toString()); return node.getFunc().getColumn(formatColumnExpNodeSQLValue(attr, tabalis, (ColumnExpNode) node.getValue2(), formatter).toString());
} else { } else {
return node.getFunc().getColumn(this.getSQLColumn(tabalis, String.valueOf(node.getValue()))); return node.getFunc().getColumn(formatColumnNameNodeSQLValue(attr, tabalis, (ColumnNameNode) node.getValue2(), formatter).toString());
} }
} }
protected CharSequence formatSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnExpNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) { protected CharSequence formatColumnExpNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnExpNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {
Serializable left = node.getLeft(); CharSequence leftVal = null;
if (left instanceof CharSequence) { ColumnNode leftNode = node.getLeft2();
left = this.getSQLColumn(tabalis, left.toString()); if (leftNode instanceof ColumnNameNode) {
if (node.getExpress() == ColumnExpress.MOV) { leftVal = formatColumnNameNodeSQLValue(attr, tabalis, (ColumnNameNode) leftNode, formatter);
return (String) left; } else if (leftNode instanceof ColumnStringNode) {
} leftVal = formatColumnStringNodeSQLValue(attr, tabalis, (ColumnStringNode) leftNode, formatter);
} else if (left instanceof ColumnExpNode) { } else if (leftNode instanceof ColumnNumberNode) {
left = "(" + formatSQLValue(attr, tabalis, (ColumnExpNode) left, formatter) + ")"; leftVal = formatColumnNumberNodeSQLValue(attr, tabalis, (ColumnNumberNode) leftNode, formatter);
} else if (left instanceof ColumnFuncNode) { } else if (leftNode instanceof ColumnExpNode) {
left = "(" + formatSQLValue(attr, tabalis, (ColumnFuncNode) left, formatter) + ")"; leftVal = "(" + formatColumnExpNodeSQLValue(attr, tabalis, (ColumnExpNode) leftNode, formatter) + ")";
} else if (leftNode instanceof ColumnFuncNode) {
leftVal = "(" + formatColumnFuncNodeSQLValue(attr, tabalis, (ColumnFuncNode) leftNode, formatter) + ")";
} }
Serializable right = node.getRight(); if (node.getExpress() == ColumnExpress.MOV) {
if (right instanceof CharSequence) { return leftVal;
right = this.getSQLColumn(null, right.toString()); }
} else if (left instanceof ColumnExpNode) { CharSequence rightVal = null;
right = "(" + formatSQLValue(attr, tabalis, (ColumnExpNode) right, formatter) + ")"; ColumnNode rightNode = node.getRight2();
} else if (left instanceof ColumnFuncNode) { if (rightNode instanceof ColumnNameNode) {
right = "(" + formatSQLValue(attr, tabalis, (ColumnFuncNode) right, formatter) + ")"; rightVal = formatColumnNameNodeSQLValue(attr, tabalis, (ColumnNameNode) rightNode, formatter);
} else if (rightNode instanceof ColumnStringNode) {
rightVal = formatColumnStringNodeSQLValue(attr, tabalis, (ColumnStringNode) rightNode, formatter);
} else if (rightNode instanceof ColumnNumberNode) {
rightVal = formatColumnNumberNodeSQLValue(attr, tabalis, (ColumnNumberNode) rightNode, formatter);
} else if (rightNode instanceof ColumnExpNode) {
rightVal = "(" + formatColumnExpNodeSQLValue(attr, tabalis, (ColumnExpNode) rightNode, formatter) + ")";
} else if (rightNode instanceof ColumnFuncNode) {
rightVal = "(" + formatColumnFuncNodeSQLValue(attr, tabalis, (ColumnFuncNode) rightNode, formatter) + ")";
} }
switch (node.getExpress()) { switch (node.getExpress()) {
case INC: case INC:
return new StringBuilder().append(left).append(" + ").append(right); return new StringBuilder().append(leftVal).append(" + ").append(rightVal);
case DEC: case DEC:
return new StringBuilder().append(left).append(" - ").append(right); return new StringBuilder().append(leftVal).append(" - ").append(rightVal);
case MUL: case MUL:
return new StringBuilder().append(left).append(" * ").append(right); return new StringBuilder().append(leftVal).append(" * ").append(rightVal);
case DIV: case DIV:
return new StringBuilder().append(left).append(" / ").append(right); return new StringBuilder().append(leftVal).append(" / ").append(rightVal);
case MOD: case MOD:
return new StringBuilder().append(left).append(" % ").append(right); return new StringBuilder().append(leftVal).append(" % ").append(rightVal);
case AND: case AND:
return new StringBuilder().append(left).append(" & ").append(right); return new StringBuilder().append(leftVal).append(" & ").append(rightVal);
case ORR: case ORR:
return new StringBuilder().append(left).append(" | ").append(right); return new StringBuilder().append(leftVal).append(" | ").append(rightVal);
} }
throw new IllegalArgumentException(node + " express cannot be null or MOV"); throw new IllegalArgumentException(node + " express cannot be null or MOV");
} }
protected CharSequence formatColumnNameNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnNameNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {
return this.getSQLColumn(tabalis, node.getColumn());
}
protected CharSequence formatColumnStringNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnStringNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {
return formatter == null ? formatToString(node.getValue()) : formatter.apply(this, node.getValue());
}
protected CharSequence formatColumnNumberNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnNumberNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {
return String.valueOf(node.getValue());
}
/** /**
* 获取所有数据表字段的Attribute, 不包含&#64;Transient字段 * 获取所有数据表字段的Attribute, 不包含&#64;Transient字段
* *