This commit is contained in:
@@ -1504,13 +1504,14 @@ public abstract class DataSqlSource<DBChannel> extends AbstractService implement
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected <T, K extends Serializable, N extends Number> CompletableFuture<Map<K, N>> queryColumnMapCompose(final EntityInfo<T> info, final String keyColumn, final FilterFunc func, final String funcColumn, FilterNode node) {
|
protected <T, K extends Serializable, N extends Number> CompletableFuture<Map<K, N>> queryColumnMapCompose(final EntityInfo<T> info, final String keyColumn, final FilterFunc func, final String funcColumn, FilterNode node) {
|
||||||
final String sqlkey = info.getSQLColumn(null, keyColumn);
|
final String keySqlColumn = info.getSQLColumn(null, keyColumn);
|
||||||
final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis();
|
final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis();
|
||||||
final Set<String> haset = new HashSet<>();
|
final Set<String> haset = new HashSet<>();
|
||||||
final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info);
|
final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info);
|
||||||
final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis);
|
final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis);
|
||||||
final String sql = "SELECT a." + sqlkey + ", " + func.getColumn((funcColumn == null || funcColumn.isEmpty() ? "*" : info.getSQLColumn("a", funcColumn)))
|
final String funcSqlColumn = func == null ? info.getSQLColumn("a", funcColumn) : func.getColumn((funcColumn == null || funcColumn.isEmpty() ? "*" : info.getSQLColumn("a", funcColumn)));
|
||||||
+ " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + sqlkey;
|
final String sql = "SELECT a." + keySqlColumn + ", " + funcSqlColumn
|
||||||
|
+ " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + keySqlColumn;
|
||||||
if (info.isLoggable(logger, Level.FINEST, sql)) logger.finest(info.getType().getSimpleName() + " querycolumnmap sql=" + sql);
|
if (info.isLoggable(logger, Level.FINEST, sql)) logger.finest(info.getType().getSimpleName() + " querycolumnmap sql=" + sql);
|
||||||
return queryColumnMapDB(info, sql, keyColumn);
|
return queryColumnMapDB(info, sql, keyColumn);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -265,34 +265,37 @@ public final class EntityCache<T> {
|
|||||||
if (filter != null) stream = stream.filter(filter);
|
if (filter != null) stream = stream.filter(filter);
|
||||||
Collector<T, Map, ?> collector = null;
|
Collector<T, Map, ?> collector = null;
|
||||||
final Class valtype = funcAttr == null ? null : funcAttr.type();
|
final Class valtype = funcAttr == null ? null : funcAttr.type();
|
||||||
switch (func) {
|
if (func != null) {
|
||||||
case AVG:
|
switch (func) {
|
||||||
if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) {
|
case AVG:
|
||||||
collector = (Collector<T, Map, ?>) Collectors.averagingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue());
|
if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) {
|
||||||
} else {
|
collector = (Collector<T, Map, ?>) Collectors.averagingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue());
|
||||||
collector = (Collector<T, Map, ?>) Collectors.averagingLong((T t) -> ((Number) funcAttr.get(t)).longValue());
|
} else {
|
||||||
}
|
collector = (Collector<T, Map, ?>) Collectors.averagingLong((T t) -> ((Number) funcAttr.get(t)).longValue());
|
||||||
break;
|
}
|
||||||
case COUNT:
|
break;
|
||||||
collector = (Collector<T, Map, ?>) Collectors.counting();
|
case COUNT:
|
||||||
break;
|
collector = (Collector<T, Map, ?>) Collectors.counting();
|
||||||
case DISTINCTCOUNT:
|
break;
|
||||||
collector = (Collector<T, Map, ?>) Collectors.mapping((t) -> funcAttr.get(t), Collectors.toSet());
|
case DISTINCTCOUNT:
|
||||||
break;
|
collector = (Collector<T, Map, ?>) Collectors.mapping((t) -> funcAttr.get(t), Collectors.toSet());
|
||||||
case MAX:
|
break;
|
||||||
case MIN:
|
case MAX:
|
||||||
Comparator<T> comp = (o1, o2) -> o1 == null ? (o2 == null ? 0 : -1) : ((Comparable) funcAttr.get(o1)).compareTo(funcAttr.get(o2));
|
case MIN:
|
||||||
collector = (Collector<T, Map, ?>) ((func == MAX) ? Collectors.maxBy(comp) : Collectors.minBy(comp));
|
Comparator<T> comp = (o1, o2) -> o1 == null ? (o2 == null ? 0 : -1) : ((Comparable) funcAttr.get(o1)).compareTo(funcAttr.get(o2));
|
||||||
break;
|
collector = (Collector<T, Map, ?>) ((func == MAX) ? Collectors.maxBy(comp) : Collectors.minBy(comp));
|
||||||
case SUM:
|
break;
|
||||||
if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) {
|
case SUM:
|
||||||
collector = (Collector<T, Map, ?>) Collectors.summingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue());
|
if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) {
|
||||||
} else {
|
collector = (Collector<T, Map, ?>) Collectors.summingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue());
|
||||||
collector = (Collector<T, Map, ?>) Collectors.summingLong((T t) -> ((Number) funcAttr.get(t)).longValue());
|
} else {
|
||||||
}
|
collector = (Collector<T, Map, ?>) Collectors.summingLong((T t) -> ((Number) funcAttr.get(t)).longValue());
|
||||||
break;
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector));
|
Map rs = collector == null ? stream.collect(Collectors.toMap(t -> keyAttr.get(t), t -> funcAttr.get(t), (key1, key2) -> key2))
|
||||||
|
: stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector));
|
||||||
if (func == MAX || func == MIN) {
|
if (func == MAX || func == MIN) {
|
||||||
Map rs2 = new LinkedHashMap();
|
Map rs2 = new LinkedHashMap();
|
||||||
rs.forEach((x, y) -> {
|
rs.forEach((x, y) -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user