ColumnValue优化

This commit is contained in:
redkale
2023-11-18 11:28:49 +08:00
parent 8f913dff0b
commit 930f0781b8
18 changed files with 262 additions and 97 deletions

View File

@@ -2,8 +2,6 @@
*/ */
package org.redkale.source; package org.redkale.source;
import java.io.File;
import java.nio.file.Files;
import java.util.*; import java.util.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceListener;
@@ -53,16 +51,6 @@ public abstract class AbstractCacheSource extends AbstractService implements Cac
//@since 2.7.0 //@since 2.7.0
public static final String CACHE_SOURCE_PIPELINES = "pipelines"; public static final String CACHE_SOURCE_PIPELINES = "pipelines";
public static void main(String[] args) throws Throwable {
File file = new File("C:\\Users\\zhangjx\\Desktop\\AnonymousVirtualPoolFunction.class");
System.out.println(Utility.binToHexString(Files.readAllBytes(file.toPath())));
file = new File("C:\\Users\\zhangjx\\Desktop\\AnonymousVirtualExecutor.class");
System.out.println(Utility.binToHexString(Files.readAllBytes(file.toPath())));
}
@ResourceListener @ResourceListener
public abstract void onResourceChange(ResourceEvent[] events); public abstract void onResourceChange(ResourceEvent[] events);

View File

@@ -1403,7 +1403,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data
@Override @Override
public <T> DataBatch update(Class<T> clazz, Serializable pk, String column, Serializable value) { public <T> DataBatch update(Class<T> clazz, Serializable pk, String column, Serializable value) {
return update(clazz, pk, ColumnValue.mov(column, value)); return update(clazz, pk, ColumnValue.set(column, value));
} }
@Override @Override
@@ -1425,7 +1425,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data
@Override @Override
public <T> DataBatch update(Class<T> clazz, FilterNode node, String column, Serializable value) { public <T> DataBatch update(Class<T> clazz, FilterNode node, String column, Serializable value) {
return update(clazz, node, (Flipper) null, ColumnValue.mov(column, value)); return update(clazz, node, (Flipper) null, ColumnValue.set(column, value));
} }
@Override @Override

View File

@@ -59,12 +59,6 @@ public final class CacheMemorySource extends AbstractCacheSource {
private final ReentrantLock containerLock = new ReentrantLock(); private final ReentrantLock containerLock = new ReentrantLock();
private final BiConsumer futureCompleteConsumer = (r, t) -> {
if (t != null) {
logger.log(Level.SEVERE, "CompletableFuture complete error", (Throwable) t);
}
};
//key: topic //key: topic
private final Map<String, Set<CacheEventListener<byte[]>>> pubsubListeners = new ConcurrentHashMap<>(); private final Map<String, Set<CacheEventListener<byte[]>>> pubsubListeners = new ConcurrentHashMap<>();
@@ -574,7 +568,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
entry.cacheType = CacheEntryType.DOUBLE; entry.cacheType = CacheEntryType.DOUBLE;
} }
Long v = ((AtomicLong) entry.objectValue).addAndGet(Double.doubleToLongBits(num)); Long v = ((AtomicLong) entry.objectValue).addAndGet(Double.doubleToLongBits(num));
return Double.longBitsToDouble(v.intValue()); return Double.longBitsToDouble(v.longValue());
} finally { } finally {
entry.unlock(); entry.unlock();
} }
@@ -631,7 +625,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
case ATOMIC: case ATOMIC:
return Utility.convertValue(type, (AtomicLong) entry.objectValue); return Utility.convertValue(type, (AtomicLong) entry.objectValue);
case DOUBLE: case DOUBLE:
return Utility.convertValue(type, Double.longBitsToDouble(((AtomicLong) entry.objectValue).intValue())); return Utility.convertValue(type, Double.longBitsToDouble(((AtomicLong) entry.objectValue).longValue()));
case SSET: case SSET:
return (T) new LinkedHashSet(entry.setValue); return (T) new LinkedHashSet(entry.setValue);
case ZSET: case ZSET:

View File

@@ -14,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.set("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.set("updateTime", ColumnExpNode.div(ColumnExpNode.mul("createTime", 10), "createCount"))); <br>
* *
* <p> * <p>
* 详情见: https://redkale.org * 详情见: https://redkale.org
@@ -30,7 +30,7 @@ public class ColumnExpNode implements ColumnNode {
protected ColumnNode left;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode protected ColumnNode left;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
@ConvertColumn(index = 2) @ConvertColumn(index = 2)
protected ColumnExpress express; //MOVleft必须是ColumnNameNode, right必须是null protected ColumnExpress express; //SETleft必须是ColumnNameNode, right必须是null
@ConvertColumn(index = 3) @ConvertColumn(index = 3)
protected ColumnNode right;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode protected ColumnNode right;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
@@ -44,9 +44,9 @@ public class ColumnExpNode implements ColumnNode {
} }
ColumnNode leftNode = createColumnNode(left); ColumnNode leftNode = createColumnNode(left);
ColumnNode rightNode = createColumnNode(right); ColumnNode rightNode = createColumnNode(right);
if (express == MOV) { if (express == SET) {
if (!(leftNode instanceof ColumnNameNode) || right != null) { if (!(leftNode instanceof ColumnNameNode) || right != null) {
throw new IllegalArgumentException("left value must be ColumnNameNode, right value must be null on ColumnExpress.MOV"); throw new IllegalArgumentException("left value must be ColumnNameNode, right value must be null on ColumnExpress.SET");
} }
} }
this.left = leftNode; this.left = leftNode;
@@ -73,7 +73,7 @@ public class ColumnExpNode implements ColumnNode {
} }
/** /**
* @see org.redkale.source.ColumnNodes#mov(java.lang.String) * @see org.redkale.source.ColumnNodes#set(java.lang.String)
* *
* @param left Serializable * @param left Serializable
* *
@@ -82,7 +82,7 @@ public class ColumnExpNode implements ColumnNode {
*/ */
@Deprecated(since = "2.8.0") @Deprecated(since = "2.8.0")
public static ColumnExpNode mov(String left) { public static ColumnExpNode mov(String left) {
return new ColumnExpNode(left, MOV, null); return new ColumnExpNode(left, SET, null);
} }
/** /**

View File

@@ -17,7 +17,7 @@ public enum ColumnExpress {
/** /**
* 赋值 col = val * 赋值 col = val
*/ */
MOV, SET,
/** /**
* 加值 col = col + val * 加值 col = col + val
*/ */

View File

@@ -3,7 +3,6 @@
*/ */
package org.redkale.source; package org.redkale.source;
import java.io.Serializable;
import static org.redkale.source.ColumnExpress.*; import static org.redkale.source.ColumnExpress.*;
/** /**
@@ -33,68 +32,184 @@ public abstract class ColumnNodes {
return new ColumnStringNode(value); return new ColumnStringNode(value);
} }
public static ColumnFuncNode func(FilterFunc func, Serializable node) { public static ColumnFuncNode func(FilterFunc func, String column) {
return new ColumnFuncNode(func, column(column));
}
public static ColumnFuncNode func(FilterFunc func, ColumnNode node) {
return new ColumnFuncNode(func, node); return new ColumnFuncNode(func, node);
} }
public static ColumnFuncNode avg(Serializable node) { public static ColumnFuncNode avg(String column) {
return new ColumnFuncNode(FilterFunc.AVG, column(column));
}
public static ColumnFuncNode avg(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.AVG, node); return new ColumnFuncNode(FilterFunc.AVG, node);
} }
public static ColumnFuncNode count(Serializable node) { public static ColumnFuncNode count(String column) {
return new ColumnFuncNode(FilterFunc.COUNT, column(column));
}
public static ColumnFuncNode count(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.COUNT, node); return new ColumnFuncNode(FilterFunc.COUNT, node);
} }
public static ColumnFuncNode distinctCount(Serializable node) { public static ColumnFuncNode distinctCount(String column) {
return new ColumnFuncNode(FilterFunc.DISTINCTCOUNT, column(column));
}
public static ColumnFuncNode distinctCount(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.DISTINCTCOUNT, node); return new ColumnFuncNode(FilterFunc.DISTINCTCOUNT, node);
} }
public static ColumnFuncNode max(Serializable node) { public static ColumnFuncNode max(String column) {
return new ColumnFuncNode(FilterFunc.MAX, column(column));
}
public static ColumnFuncNode max(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.MAX, node); return new ColumnFuncNode(FilterFunc.MAX, node);
} }
public static ColumnFuncNode min(Serializable node) { public static ColumnFuncNode min(String column) {
return new ColumnFuncNode(FilterFunc.MIN, column(column));
}
public static ColumnFuncNode min(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.MIN, node); return new ColumnFuncNode(FilterFunc.MIN, node);
} }
public static ColumnFuncNode sum(Serializable node) { public static ColumnFuncNode sum(String column) {
return new ColumnFuncNode(FilterFunc.SUM, column(column));
}
public static ColumnFuncNode sum(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.SUM, node); return new ColumnFuncNode(FilterFunc.SUM, node);
} }
public static ColumnExpNode exp(Serializable left, ColumnExpress express, Serializable right) { public static ColumnExpNode exp(ColumnNode left, ColumnExpress express, ColumnNode right) {
return new ColumnExpNode(left, express, right); return new ColumnExpNode(left, express, right);
} }
public static ColumnExpNode mov(String left) { public static ColumnExpNode set(String column) {
return new ColumnExpNode(left, MOV, null); return new ColumnExpNode(column, SET, null);
} }
public static ColumnExpNode inc(Serializable left, Serializable right) { public static ColumnExpNode set(ColumnNameNode left) {
return new ColumnExpNode(left, SET, null);
}
public static ColumnExpNode inc(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), INC, number(rightValue));
}
public static ColumnExpNode inc(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, INC, right); return new ColumnExpNode(left, INC, right);
} }
public static ColumnExpNode dec(Serializable left, Serializable right) { public static ColumnExpNode inc(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, INC, column(rightColumn));
}
public static ColumnExpNode inc(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, INC, number(rightValue));
}
public static ColumnExpNode dec(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), DEC, number(rightValue));
}
public static ColumnExpNode dec(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, DEC, right); return new ColumnExpNode(left, DEC, right);
} }
public static ColumnExpNode mul(Serializable left, Serializable right) { public static ColumnExpNode dec(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, DEC, column(rightColumn));
}
public static ColumnExpNode dec(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, DEC, number(rightValue));
}
public static ColumnExpNode mul(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), MUL, number(rightValue));
}
public static ColumnExpNode mul(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, MUL, right); return new ColumnExpNode(left, MUL, right);
} }
public static ColumnExpNode div(Serializable left, Serializable right) { public static ColumnExpNode mul(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, MUL, column(rightColumn));
}
public static ColumnExpNode mul(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, MUL, number(rightValue));
}
public static ColumnExpNode div(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), DIV, number(rightValue));
}
public static ColumnExpNode div(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, DIV, right); return new ColumnExpNode(left, DIV, right);
} }
public static ColumnExpNode mod(Serializable left, Serializable right) { public static ColumnExpNode div(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, DIV, column(rightColumn));
}
public static ColumnExpNode div(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, DIV, number(rightValue));
}
public static ColumnExpNode mod(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), MOD, number(rightValue));
}
public static ColumnExpNode mod(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, MOD, right); return new ColumnExpNode(left, MOD, right);
} }
public static ColumnExpNode and(Serializable left, Serializable right) { public static ColumnExpNode mod(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, MOD, column(rightColumn));
}
public static ColumnExpNode mod(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, MOD, number(rightValue));
}
public static ColumnExpNode and(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), AND, number(rightValue));
}
public static ColumnExpNode and(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, AND, right); return new ColumnExpNode(left, AND, right);
} }
public static ColumnExpNode orr(Serializable left, Serializable right) { public static ColumnExpNode and(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, AND, column(rightColumn));
}
public static ColumnExpNode and(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, AND, number(rightValue));
}
public static ColumnExpNode orr(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), ORR, number(rightValue));
}
public static ColumnExpNode orr(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, ORR, right); return new ColumnExpNode(left, ORR, right);
} }
public static ColumnExpNode orr(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, ORR, column(rightColumn));
}
public static ColumnExpNode orr(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, ORR, number(rightValue));
}
} }

View File

@@ -67,7 +67,7 @@ public class ColumnValue {
} }
/** /**
* 同 mov 操作 * 同 set 操作
* *
* @param column 字段名 * @param column 字段名
* @param value 字段值 * @param value 字段值
@@ -75,7 +75,21 @@ 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, MOV, value); return new ColumnValue(column, SET, value);
}
/**
* @see #set(java.lang.String, java.io.Serializable)
*
* @param column 字段名
* @param value 字段值
*
* @return ColumnValue
* @deprecated
*/
@Deprecated(since = "2.8.0")
public static ColumnValue mov(String column, Serializable value) {
return set(column, value);
} }
/** /**
@@ -86,8 +100,8 @@ public class ColumnValue {
* *
* @return ColumnValue * @return ColumnValue
*/ */
public static ColumnValue mov(String column, Serializable value) { public static ColumnValue set(String column, Serializable value) {
return new ColumnValue(column, MOV, value); return new ColumnValue(column, SET, value);
} }
/** /**
@@ -172,10 +186,10 @@ public class ColumnValue {
* *
* @return ColumnValue * @return ColumnValue
*/ */
//不常用防止开发者容易在mov时误输入mod public static ColumnValue mod(String column, Serializable value) {
// public static ColumnValue mod(String column, Serializable value) { return new ColumnValue(column, MOD, value);
// return new ColumnValue(column, MOD, value); }
// }
/** /**
* 返回 {column} = {column} &#38; {value} 操作 * 返回 {column} = {column} &#38; {value} 操作
* *
@@ -201,7 +215,7 @@ public class ColumnValue {
} }
/** /**
* 同 mov 操作 * 同 set 操作
* *
* @param func 字段名Lambda * @param func 字段名Lambda
* @param <T> 值的泛型 * @param <T> 值的泛型
@@ -212,7 +226,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, MOV); return new ColumnValue(func, SET);
} }
/** /**
@@ -225,8 +239,8 @@ public class ColumnValue {
* *
* @since 2.8.0 * @since 2.8.0
*/ */
public static <T extends Serializable> ColumnValue mov(LambdaSupplier<T> func) { public static <T extends Serializable> ColumnValue set(LambdaSupplier<T> func) {
return new ColumnValue(func, MOV); return new ColumnValue(func, SET);
} }
/** /**
@@ -285,6 +299,20 @@ public class ColumnValue {
return new ColumnValue(func, DIV); return new ColumnValue(func, DIV);
} }
/**
* 返回 {column} = {column} % {value} 操作
*
* @param func 字段名Lambda
* @param <T> 值的泛型
*
* @return ColumnValue
*
* @since 2.8.0
*/
public static <T extends Serializable> ColumnValue mod(LambdaSupplier<T> func) {
return new ColumnValue(func, MOD);
}
/** /**
* 返回 {column} = {column} &#38; {value} 操作 * 返回 {column} = {column} &#38; {value} 操作
* *
@@ -314,7 +342,7 @@ public class ColumnValue {
} }
/** /**
* 同 mov 操作 * 同 set 操作
* *
* @param func 字段名Lambda * @param func 字段名Lambda
* @param value 字段值 * @param value 字段值
@@ -325,7 +353,7 @@ public class ColumnValue {
* @since 2.8.0 * @since 2.8.0
*/ */
public static <T> ColumnValue create(LambdaFunction<T, ?> func, Serializable value) { public static <T> ColumnValue create(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, MOV, value); return new ColumnValue(func, SET, value);
} }
/** /**
@@ -339,8 +367,8 @@ public class ColumnValue {
* *
* @since 2.8.0 * @since 2.8.0
*/ */
public static <T> ColumnValue mov(LambdaFunction<T, ?> func, Serializable value) { public static <T> ColumnValue set(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, MOV, value); return new ColumnValue(func, SET, value);
} }
/** /**
@@ -431,6 +459,21 @@ public class ColumnValue {
return new ColumnValue(func, DIV, value); return new ColumnValue(func, DIV, value);
} }
/**
* 返回 {column} = {column} % {value} 操作
*
* @param func 字段名Lambda
* @param value 字段值
* @param <T> 值的泛型
*
* @return ColumnValue
*
* @since 2.8.0
*/
public static <T> ColumnValue mod(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, MOD, value);
}
/** /**
* 返回 {column} = {column} &#38; {value} 操作 * 返回 {column} = {column} &#38; {value} 操作
* *

View File

@@ -1015,7 +1015,7 @@ public final class EntityCache<T> {
case ORR: case ORR:
numb = getNumberValue((Number) attr.get(entity), express, val instanceof ColumnNumberNode ? ((ColumnNumberNode) val).getValue() : (Number) val); numb = getNumberValue((Number) attr.get(entity), express, val instanceof ColumnNumberNode ? ((ColumnNumberNode) val).getValue() : (Number) val);
break; break;
case MOV: case SET:
if (val instanceof ColumnExpNode) { if (val instanceof ColumnExpNode) {
val = updateColumnExpNode(attr, entity, (ColumnExpNode) val); val = updateColumnExpNode(attr, entity, (ColumnExpNode) val);
} }
@@ -1073,7 +1073,7 @@ public final class EntityCache<T> {
} else if (leftNode instanceof ColumnExpNode) { } else if (leftNode instanceof ColumnExpNode) {
leftVal = updateColumnExpNode(attr, entity, (ColumnExpNode) leftNode); leftVal = updateColumnExpNode(attr, entity, (ColumnExpNode) leftNode);
} }
if (node.getExpress() == ColumnExpress.MOV) { if (node.getExpress() == ColumnExpress.SET) {
return leftVal; return leftVal;
} }

View File

@@ -1513,7 +1513,7 @@ public final class EntityInfo<T> {
} }
//ColumnExpNode、ColumnFuncNode、ColumnNameNode、ColumnNumberNode、ColumnStringNode //ColumnExpNode、ColumnFuncNode、ColumnNameNode、ColumnNumberNode、ColumnStringNode
ColumnNode node = cv.getValue(); ColumnNode node = cv.getValue();
//ColumnExpNode时 cv.getExpress() == ColumnExpress.MOV 只用于updateColumn //ColumnExpNode时 cv.getExpress() == ColumnExpress.SET 只用于updateColumn
if (node instanceof ColumnExpNode) { if (node instanceof ColumnExpNode) {
return formatColumnExpNodeSQLValue(attr, null, (ColumnExpNode) node, formatter); return formatColumnExpNodeSQLValue(attr, null, (ColumnExpNode) node, formatter);
} }
@@ -1543,7 +1543,7 @@ public final class EntityInfo<T> {
return new StringBuilder().append(sqlColumn).append(" & ").append(val); return new StringBuilder().append(sqlColumn).append(" & ").append(val);
case ORR: case ORR:
return new StringBuilder().append(sqlColumn).append(" | ").append(val); return new StringBuilder().append(sqlColumn).append(" | ").append(val);
case MOV: case SET:
return val == null && isNotNullJson(attr) ? "" : val; return val == null && isNotNullJson(attr) ? "" : val;
default: default:
return val; return val;
@@ -1572,7 +1572,7 @@ public final class EntityInfo<T> {
} else if (leftNode instanceof ColumnFuncNode) { } else if (leftNode instanceof ColumnFuncNode) {
leftVal = "(" + formatColumnFuncNodeSQLValue(attr, tabalis, (ColumnFuncNode) leftNode, formatter) + ")"; leftVal = "(" + formatColumnFuncNodeSQLValue(attr, tabalis, (ColumnFuncNode) leftNode, formatter) + ")";
} }
if (node.getExpress() == ColumnExpress.MOV) { if (node.getExpress() == ColumnExpress.SET) {
return leftVal; return leftVal;
} }
CharSequence rightVal = null; CharSequence rightVal = null;
@@ -1604,7 +1604,7 @@ public final class EntityInfo<T> {
case ORR: case ORR:
return new StringBuilder().append(leftVal).append(" | ").append(rightVal); 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 SET");
} }
protected CharSequence formatColumnNameNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnNameNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) { protected CharSequence formatColumnNameNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnNameNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {

View File

@@ -22,7 +22,9 @@ public enum FilterFunc {
SUM; //求和 SUM; //求和
public String getColumn(String col) { public String getColumn(String col) {
if (this == DISTINCTCOUNT) return "COUNT(DISTINCT " + col + ")"; if (this == DISTINCTCOUNT) {
return "COUNT(DISTINCT " + col + ")";
}
return this.name() + "(" + col + ")"; return this.name() + "(" + col + ")";
} }
} }

View File

@@ -12,6 +12,7 @@ import java.util.function.*;
import org.redkale.annotation.ConstructorParameters; import org.redkale.annotation.ConstructorParameters;
import org.redkale.convert.ConvertColumn; import org.redkale.convert.ConvertColumn;
import org.redkale.convert.ConvertDisabled; import org.redkale.convert.ConvertDisabled;
import static org.redkale.util.Utility.isEmpty;
/** /**
* 该类提供类似JSONObject的数据结构主要用于读取xml配置文件和http-header存储 * 该类提供类似JSONObject的数据结构主要用于读取xml配置文件和http-header存储
@@ -1631,8 +1632,7 @@ public abstract class AnyValue {
* @return 字段值 * @return 字段值
*/ */
public String getOrDefault(String name, String defaultValue) { public String getOrDefault(String name, String defaultValue) {
String value = getValue(name); return getValue(name, defaultValue);
return value == null ? defaultValue : value;
} }
@Override @Override
@@ -1648,7 +1648,7 @@ public abstract class AnyValue {
} }
private static <T> boolean equals(Entry<? extends T>[] entry1, Entry<T>[] entry2) { private static <T> boolean equals(Entry<? extends T>[] entry1, Entry<T>[] entry2) {
if ((entry1 == null || entry1.length == 0) && (entry2 == null || entry2.length == 0)) { if (isEmpty(entry1) && isEmpty(entry2)) {
return true; return true;
} }
if (entry1.length != entry2.length) { if (entry1.length != entry2.length) {

View File

@@ -429,12 +429,13 @@ public interface Attribute<T, F> {
* 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。 * 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段的类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* *
* @return Attribute对象数组 * @return Attribute对象数组
*/ */
public static <T> Attribute<T, ?>[] create(Class<T> clazz) { public static <T, F> Attribute<T, F>[] create(Class<T> clazz) {
List<Attribute<T, ?>> list = new ArrayList<>(); List<Attribute<T, F>> list = new ArrayList<>();
RedkaleClassLoader.putReflectionPublicFields(clazz.getName()); RedkaleClassLoader.putReflectionPublicFields(clazz.getName());
for (java.lang.reflect.Field field : clazz.getFields()) { for (java.lang.reflect.Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) { if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
@@ -476,12 +477,13 @@ public interface Attribute<T, F> {
* 根据Class生成getter方法对应的 Attribute 对象数组。 * 根据Class生成getter方法对应的 Attribute 对象数组。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段的类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* *
* @return Attribute对象数组 * @return Attribute对象数组
*/ */
public static <T> Attribute<T, ?>[] createGetters(Class<T> clazz) { public static <T, F> Attribute<T, F>[] createGetters(Class<T> clazz) {
List<Attribute<T, ?>> list = new ArrayList<>(); List<Attribute<T, F>> list = new ArrayList<>();
RedkaleClassLoader.putReflectionPublicFields(clazz.getName()); RedkaleClassLoader.putReflectionPublicFields(clazz.getName());
for (java.lang.reflect.Field field : clazz.getFields()) { for (java.lang.reflect.Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) { if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
@@ -519,12 +521,13 @@ public interface Attribute<T, F> {
* 根据Class生成setter方法对应的 Attribute 对象数组。 * 根据Class生成setter方法对应的 Attribute 对象数组。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段的类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* *
* @return Attribute对象数组 * @return Attribute对象数组
*/ */
public static <T> Attribute<T, ?>[] createSetters(Class<T> clazz) { public static <T, F> Attribute<T, F>[] createSetters(Class<T> clazz) {
List<Attribute<T, ?>> list = new ArrayList<>(); List<Attribute<T, F>> list = new ArrayList<>();
RedkaleClassLoader.putReflectionPublicFields(clazz.getName()); RedkaleClassLoader.putReflectionPublicFields(clazz.getName());
for (java.lang.reflect.Field field : clazz.getFields()) { for (java.lang.reflect.Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) { if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {

View File

@@ -756,10 +756,7 @@ public final class ByteArray implements ByteTuple {
* @return ByteArray * @return ByteArray
*/ */
public ByteArray putUnsignedMedium(int offset, int value) { public ByteArray putUnsignedMedium(int offset, int value) {
content[offset] = (byte) (value >> 16 & 0xFF); return putMedium(offset, value);
content[offset + 1] = (byte) (value >> 8 & 0xFF);
content[offset + 2] = (byte) (value & 0xFF);
return this;
} }
/** /**

View File

@@ -101,14 +101,14 @@ public class OneOrList<T> implements java.io.Serializable {
@Override @Override
public OneOrList convertFrom(JsonReader in) { public OneOrList convertFrom(JsonReader in) {
if (in.isNextArray()) { if (in.isNextArray()) {
List list = (List) listDecoder.convertFrom(in); List val = (List) listDecoder.convertFrom(in);
OneOrList rs = creator.create(); OneOrList rs = creator.create();
rs.setList(list); rs.setList(val);
return rs; return rs;
} else { } else {
Object one = oneDecoder.convertFrom(in); Object val = oneDecoder.convertFrom(in);
OneOrList rs = creator.create(); OneOrList rs = creator.create();
rs.setOne(one); rs.setOne(val);
return rs; return rs;
} }
} }

View File

@@ -2,11 +2,10 @@
*/ */
package org.redkale.util; package org.redkale.util;
import org.redkale.annotation.ConstructorParameters;
import java.util.*; import java.util.*;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.redkale.annotation.ConstructorParameters;
/** /**
* 详情见: https://redkale.org * 详情见: https://redkale.org
@@ -71,7 +70,7 @@ public interface ResourceEvent<T> {
public static class ResourceChangeEvent<T> implements ResourceEvent<T> { public static class ResourceChangeEvent<T> implements ResourceEvent<T> {
private static final Predicate<String> numRegx = Pattern.compile("^(\\-|\\+)?\\d+(\\.\\d+)?$").asPredicate(); private static final Predicate<String> numRegx = Pattern.compile("^(\\-\\+)?\\d+(\\.\\d+)?$").asPredicate();
protected String name; protected String name;

View File

@@ -96,11 +96,11 @@ public class ThreadHashExecutor extends AbstractExecutorService {
} }
@Override @Override
public Future<?> submit(Runnable task) { public Future submit(Runnable task) {
return hashExecutor(0).submit(task); return hashExecutor(0).submit(task);
} }
public Future<?> submit(int hash, Runnable task) { public Future submit(int hash, Runnable task) {
return hashExecutor(hash).submit(task); return hashExecutor(hash).submit(task);
} }

View File

@@ -119,7 +119,7 @@ public final class Utility {
private static final ReentrantLock clientLock = new ReentrantLock(); private static final ReentrantLock clientLock = new ReentrantLock();
//是否native-image运行环境 //是否native-image运行环境
private static final boolean nativeImageEnv = "executable".equals(System.getProperty("org.graalvm.nativeimage.kind")); private static final boolean NATIVE_IMAGE_ENV = "executable".equals(System.getProperty("org.graalvm.nativeimage.kind"));
private static HttpClient httpClient; private static HttpClient httpClient;
@@ -140,7 +140,7 @@ public final class Utility {
Function<String, ExecutorService> virtualPoolFunction0 = null; Function<String, ExecutorService> virtualPoolFunction0 = null;
Executor virtualExecutorConsumer0 = null; Executor virtualExecutorConsumer0 = null;
if (!nativeImageEnv) { //not native-image if (!NATIVE_IMAGE_ENV) { //not native-image
try { try {
final ClassLoader loader = Thread.currentThread().getContextClassLoader(); final ClassLoader loader = Thread.currentThread().getContextClassLoader();
{ //virtualThreadLocalFunction { //virtualThreadLocalFunction
@@ -951,6 +951,30 @@ public final class Utility {
return collection != null && !collection.isEmpty(); return collection != null && !collection.isEmpty();
} }
/**
* 是否为空
*
* @param array 数组
*
* @return 是否为空
*
*/
public static <T> boolean isEmpty(T[] array) {
return array == null || array.length == 0;
}
/**
* 是否不为空
*
* @param array 数组
*
* @return 是否不为空
*
*/
public static <T> boolean isNotEmpty(T[] array) {
return array != null && array.length > 0;
}
/** /**
* 将字符串首字母大写 * 将字符串首字母大写
* *

View File

@@ -72,9 +72,9 @@ public class JsonRecord {
source.init(conf); source.init(conf);
JsonRecord record = JsonRecord.create(); JsonRecord record = JsonRecord.create();
source.insert(record); source.insert(record);
source.updateColumn(JsonRecord.class, record.getRecordid(), ColumnValue.mov("recordname", "my name 2")); source.updateColumn(JsonRecord.class, record.getRecordid(), ColumnValue.set("recordname", "my name 2"));
record.getRmap().put("haha", 2222); record.getRmap().put("haha", 2222);
source.updateColumn(JsonRecord.class, record.getRecordid(), ColumnValue.mov("rmap", (Serializable) (Object) record.getRmap())); source.updateColumn(JsonRecord.class, record.getRecordid(), ColumnValue.set("rmap", (Serializable) (Object) record.getRmap()));
System.out.println(source.find(JsonRecord.class, record.getRecordid())); System.out.println(source.find(JsonRecord.class, record.getRecordid()));
System.out.println(source.findColumn(JsonRecord.class, "rmap", record.getRecordid())); System.out.println(source.findColumn(JsonRecord.class, "rmap", record.getRecordid()));
} }