增加ColumnXXXNode功能
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
46
src/main/java/org/redkale/source/ColumnBytesNode.java
Normal file
46
src/main/java/org/redkale/source/ColumnBytesNode.java
Normal 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 + "}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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 + "}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 + "}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
48
src/main/java/org/redkale/source/ColumnNameNode.java
Normal file
48
src/main/java/org/redkale/source/ColumnNameNode.java
Normal 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 + "\"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
48
src/main/java/org/redkale/source/ColumnNumberNode.java
Normal file
48
src/main/java/org/redkale/source/ColumnNumberNode.java
Normal 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 + "}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
48
src/main/java/org/redkale/source/ColumnStringNode.java
Normal file
48
src/main/java/org/redkale/source/ColumnStringNode.java
Normal 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 + "\"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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 + "}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, 不包含@Transient字段
|
* 获取所有数据表字段的Attribute, 不包含@Transient字段
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user